author | David Douard <david.douard@logilab.fr> |
Fri, 02 Mar 2012 09:57:47 +0100 | |
branch | stable |
changeset 8294 | 73c9f22064b3 |
parent 8149 | 3ed48646f354 |
child 8272 | 18893bb969d2 |
child 8341 | af813e7d5daa |
permissions | -rw-r--r-- |
7344
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
1 |
# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5325
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5814
51cc4b61f9ae
[repo] fix 'c-c start --loglevel LEVEL' for repository only configuration. Closes #1058269.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5762
diff
changeset
|
18 |
"""twisted server for CubicWeb web instances""" |
0 | 19 |
|
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
20 |
from __future__ import with_statement |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
21 |
|
0 | 22 |
__docformat__ = "restructuredtext en" |
23 |
||
24 |
import sys |
|
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
25 |
import os |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
26 |
import os.path as osp |
0 | 27 |
import select |
5243
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
28 |
import traceback |
5652
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
29 |
import threading |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
30 |
import re |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
31 |
from hashlib import md5 # pylint: disable=E0611 |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
32 |
from os.path import join |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
151
diff
changeset
|
33 |
from time import mktime |
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
151
diff
changeset
|
34 |
from datetime import date, timedelta |
1520
b097057e629d
provide an option to substitute the base-url (left-most part) subdomain by the one of the current http query to easy multiple subdomains website management
Florent <florent@secondweb.fr>
parents:
1420
diff
changeset
|
35 |
from urlparse import urlsplit, urlunsplit |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
36 |
from cgi import FieldStorage, parse_header |
5243
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
37 |
from cStringIO import StringIO |
0 | 38 |
|
39 |
from twisted.internet import reactor, task, threads |
|
40 |
from twisted.internet.defer import maybeDeferred |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
41 |
from twisted.web import http, server |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
42 |
from twisted.web import static, resource |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
43 |
from twisted.web.server import NOT_DONE_YET |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
44 |
|
0 | 45 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
46 |
from logilab.common.decorators import monkeypatch |
0 | 47 |
|
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
48 |
from cubicweb import (AuthenticationError, ConfigurationError, |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
49 |
CW_EVENT_MANAGER, CubicWebException) |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5933
diff
changeset
|
50 |
from cubicweb.utils import json_dumps |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5216
diff
changeset
|
51 |
from cubicweb.web import Redirect, DirectResponse, StatusResponse, LogOut |
0 | 52 |
from cubicweb.web.application import CubicWebPublisher |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
53 |
from cubicweb.web.http_headers import generateDateTime |
0 | 54 |
from cubicweb.etwist.request import CubicWebTwistedRequestAdapter |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
55 |
from cubicweb.etwist.http import HTTPResponse |
0 | 56 |
|
57 |
def start_task(interval, func): |
|
58 |
lc = task.LoopingCall(func) |
|
3493
3e4603678d4e
use default repo looping task so they are started in thread, else we get blocking task
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3198
diff
changeset
|
59 |
# wait until interval has expired to actually start the task, else we have |
3e4603678d4e
use default repo looping task so they are started in thread, else we get blocking task
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3198
diff
changeset
|
60 |
# to wait all task to be finished for the server to be actually started |
3e4603678d4e
use default repo looping task so they are started in thread, else we get blocking task
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3198
diff
changeset
|
61 |
lc.start(interval, now=False) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
62 |
|
1543
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
63 |
def host_prefixed_baseurl(baseurl, host): |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
64 |
scheme, netloc, url, query, fragment = urlsplit(baseurl) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
65 |
netloc_domain = '.' + '.'.join(netloc.split('.')[-2:]) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
66 |
if host.endswith(netloc_domain): |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
67 |
netloc = host |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
68 |
baseurl = urlunsplit((scheme, netloc, url, query, fragment)) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
69 |
return baseurl |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
70 |
|
0 | 71 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
72 |
class ForbiddenDirectoryLister(resource.Resource): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
73 |
def render(self, request): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
74 |
return HTTPResponse(twisted_request=request, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
75 |
code=http.FORBIDDEN, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
76 |
stream='Access forbidden') |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
77 |
|
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
78 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
79 |
class NoListingFile(static.File): |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
80 |
def __init__(self, config, path=None): |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
81 |
if path is None: |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
82 |
path = config.static_directory |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
83 |
static.File.__init__(self, path) |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
84 |
self.config = config |
7647
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
85 |
|
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
86 |
def set_expires(self, request): |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
87 |
if not self.config.debugmode: |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
88 |
# XXX: Don't provide additional resource information to error responses |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
89 |
# |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
90 |
# the HTTP RFC recommands not going further than 1 year ahead |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
91 |
expires = date.today() + timedelta(days=6*30) |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
92 |
request.setHeader('Expires', generateDateTime(mktime(expires.timetuple()))) |
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
93 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
94 |
def directoryListing(self): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
95 |
return ForbiddenDirectoryLister() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
96 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
97 |
|
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
98 |
class DataLookupDirectory(NoListingFile): |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
99 |
def __init__(self, config, path): |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
100 |
self.md5_version = config.instance_md5_version() |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
101 |
NoListingFile.__init__(self, config, path) |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
102 |
self.here = path |
7275
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
103 |
self._defineChildResources() |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
104 |
if self.config.debugmode: |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
105 |
self.data_modconcat_basepath = '/data/??' |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
106 |
else: |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
107 |
self.data_modconcat_basepath = '/data/%s/??' % self.md5_version |
7275
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
108 |
|
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
109 |
def _defineChildResources(self): |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
110 |
self.putChild(self.md5_version, self) |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
111 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
112 |
def getChild(self, path, request): |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
113 |
if not path: |
7344
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
114 |
uri = request.uri |
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
115 |
if uri.startswith('/https/'): |
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
116 |
uri = uri[6:] |
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
117 |
if uri.startswith(self.data_modconcat_basepath): |
5290b5c586ec
[etwist] fix bug w/ new resources concantenation and https-url enabled sites
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7309
diff
changeset
|
118 |
resource_relpath = uri[len(self.data_modconcat_basepath):] |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
119 |
if resource_relpath: |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
120 |
paths = resource_relpath.split(',') |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
121 |
try: |
7647
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
122 |
self.set_expires(request) |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
123 |
return ConcatFiles(self.config, paths) |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
124 |
except ConcatFileNotFoundError: |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
125 |
return self.childNotFound |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
126 |
return self.directoryListing() |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
127 |
childpath = join(self.here, path) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
128 |
dirpath, rid = self.config.locate_resource(childpath) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
129 |
if dirpath is None: |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
130 |
# resource not found |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
131 |
return self.childNotFound |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
132 |
filepath = os.path.join(dirpath, rid) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
133 |
if os.path.isdir(filepath): |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
134 |
resource = DataLookupDirectory(self.config, childpath) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
135 |
# cache resource for this segment path to avoid recomputing |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
136 |
# directory lookup |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
137 |
self.putChild(path, resource) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
138 |
return resource |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
139 |
else: |
7647
af352bf06ae4
[http] closes #1816411, restore expires_header on static files in non-debug mode
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7644
diff
changeset
|
140 |
self.set_expires(request) |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
141 |
return NoListingFile(self.config, filepath) |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
142 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
143 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
144 |
class FCKEditorResource(NoListingFile): |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
145 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
146 |
def getChild(self, path, request): |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
147 |
pre_path = request.path.split('/')[1:] |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
148 |
if pre_path[0] == 'https': |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
149 |
pre_path.pop(0) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
150 |
uiprops = self.config.https_uiprops |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
151 |
else: |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
152 |
uiprops = self.config.uiprops |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
153 |
return static.File(osp.join(uiprops['FCKEDITOR_PATH'], path)) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
154 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
155 |
|
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
156 |
class LongTimeExpiringFile(DataLookupDirectory): |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
157 |
"""overrides static.File and sets a far future ``Expires`` date |
0 | 158 |
on the resouce. |
159 |
||
160 |
versions handling is done by serving static files by different |
|
161 |
URLs for each version. For instance:: |
|
162 |
||
163 |
http://localhost:8080/data-2.48.2/cubicweb.css |
|
164 |
http://localhost:8080/data-2.49.0/cubicweb.css |
|
165 |
etc. |
|
166 |
||
167 |
""" |
|
7275
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
168 |
def _defineChildResources(self): |
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
169 |
pass |
bb3bb8104134
put data version md5 into a new url segment to ease static serving
Florent Cayré <florent.cayre@gmail.com>
parents:
7273
diff
changeset
|
170 |
|
0 | 171 |
|
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
172 |
class ConcatFileNotFoundError(CubicWebException): |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
173 |
pass |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
174 |
|
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
175 |
|
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
176 |
class ConcatFiles(LongTimeExpiringFile): |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
177 |
def __init__(self, config, paths): |
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
178 |
_, ext = osp.splitext(paths[0]) |
7565
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
179 |
self._resources = {} |
7619
0d0344fd5231
[etwist] clear ui cache at server startup time. Closes #1806933
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7570
diff
changeset
|
180 |
# create a unique / predictable filename. We don't consider cubes |
0d0344fd5231
[etwist] clear ui cache at server startup time. Closes #1806933
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7570
diff
changeset
|
181 |
# version since uicache is cleared at server startup, and file's dates |
0d0344fd5231
[etwist] clear ui cache at server startup time. Closes #1806933
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7570
diff
changeset
|
182 |
# are checked in debug mode |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
183 |
fname = 'cache_concat_' + md5(';'.join(paths)).hexdigest() + ext |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
184 |
filepath = osp.join(config.appdatahome, 'uicache', fname) |
7283
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
185 |
LongTimeExpiringFile.__init__(self, config, filepath) |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
186 |
self._concat_cached_filepath(filepath, paths) |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
187 |
|
7565
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
188 |
def _resource(self, path): |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
189 |
try: |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
190 |
return self._resources[path] |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
191 |
except KeyError: |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
192 |
self._resources[path] = self.config.locate_resource(path) |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
193 |
return self._resources[path] |
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
194 |
|
7283
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
195 |
def _concat_cached_filepath(self, filepath, paths): |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
196 |
if not self._up_to_date(filepath, paths): |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
197 |
with open(filepath, 'wb') as f: |
7620
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
198 |
for path in paths: |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
199 |
dirpath, rid = self._resource(path) |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
200 |
if rid is None: |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
201 |
# In production mode log an error, do not return a 404 |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
202 |
# XXX the erroneous content is cached anyway |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
203 |
LOGGER.error('concatenated data url error: %r file ' |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
204 |
'does not exist', path) |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
205 |
if self.config.debugmode: |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
206 |
raise ConcatFileNotFoundError(path) |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
207 |
else: |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
208 |
for line in open(osp.join(dirpath, rid)): |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
209 |
f.write(line) |
bc2d690b97bf
[etwist, modconcat] closes #1806935: directly write data, don't put the whole concatenated thing in memory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7619
diff
changeset
|
210 |
f.write('\n') |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
211 |
|
7283
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
212 |
def _up_to_date(self, filepath, paths): |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
213 |
""" |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
214 |
The concat-file is considered up-to-date if it exists. |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
215 |
In debug mode, an additional check is performed to make sure that |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
216 |
concat-file is more recent than all concatenated files |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
217 |
""" |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
218 |
if not osp.isfile(filepath): |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
219 |
return False |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
220 |
if self.config.debugmode: |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
221 |
concat_lastmod = os.stat(filepath).st_mtime |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
222 |
for path in paths: |
7565
b355d9dd43df
[js/css concat] do not return 404 when resources of a concatenated data URL does not exist, unless in debugmode; closes #1745644
Florent Cayré <florent.cayre@gmail.com>
parents:
7344
diff
changeset
|
223 |
dirpath, rid = self._resource(path) |
7283
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
224 |
if rid is None: |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
225 |
raise ConcatFileNotFoundError(path) |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
226 |
path = osp.join(dirpath, rid) |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
227 |
if os.stat(path).st_mtime > concat_lastmod: |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
228 |
return False |
1699393372b3
[etwist] in debug-mode, concat-file is rebuilt if one of the concatenated file is more recent
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7277
diff
changeset
|
229 |
return True |
7276
f9a68136eb87
handle js/ css file concatenation with twisted
Florent Cayré <florent.cayre@gmail.com>
parents:
7275
diff
changeset
|
230 |
|
7619
0d0344fd5231
[etwist] clear ui cache at server startup time. Closes #1806933
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7570
diff
changeset
|
231 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
232 |
class CubicWebRootResource(resource.Resource): |
5653
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
233 |
def __init__(self, config, vreg=None): |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
234 |
resource.Resource.__init__(self) |
0 | 235 |
self.config = config |
3828
335e40fdb5a5
when instance is started normally (eg not in debug mode), check versions before daemonization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3791
diff
changeset
|
236 |
# instantiate publisher here and not in init_publisher to get some |
335e40fdb5a5
when instance is started normally (eg not in debug mode), check versions before daemonization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3791
diff
changeset
|
237 |
# checks done before daemonization (eg versions consistency) |
5653
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
238 |
self.appli = CubicWebPublisher(config, vreg=vreg) |
4909
a13c1d1ecc5b
[web server]Â simplify base-url handling on startup. Ensure config['base-url'] is correctly set once started
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
239 |
self.base_url = config['base-url'] |
a13c1d1ecc5b
[web server]Â simplify base-url handling on startup. Ensure config['base-url'] is correctly set once started
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
240 |
self.https_url = config['https-url'] |
5270
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
241 |
global MAX_POST_LENGTH |
5330
19bc44f5f9d1
[web] no more needed with the bytes option type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5328
diff
changeset
|
242 |
MAX_POST_LENGTH = config['max-post-length'] |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
243 |
self.putChild('static', NoListingFile(config)) |
7273
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
244 |
self.putChild('fckeditor', FCKEditorResource(self.config, '')) |
a949fc438029
[etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6817
diff
changeset
|
245 |
self.putChild('data', DataLookupDirectory(self.config, '')) |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
246 |
|
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
247 |
def init_publisher(self): |
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
248 |
config = self.config |
0 | 249 |
# when we have an in-memory repository, clean unused sessions every XX |
250 |
# seconds and properly shutdown the server |
|
251 |
if config.repo_method == 'inmemory': |
|
252 |
if config.pyro_enabled(): |
|
253 |
# if pyro is enabled, we have to register to the pyro name |
|
254 |
# server, create a pyro daemon, and create a task to handle pyro |
|
255 |
# requests |
|
256 |
self.pyro_daemon = self.appli.repo.pyro_register() |
|
257 |
self.pyro_listen_timeout = 0.02 |
|
3502 | 258 |
self.appli.repo.looping_task(1, self.pyro_loop_event) |
5654
8bb34548be86
[web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5653
diff
changeset
|
259 |
if config.mode != 'test': |
8bb34548be86
[web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5653
diff
changeset
|
260 |
reactor.addSystemEventTrigger('before', 'shutdown', |
8bb34548be86
[web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5653
diff
changeset
|
261 |
self.shutdown_event) |
8bb34548be86
[web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5653
diff
changeset
|
262 |
self.appli.repo.start_looping_tasks() |
2685
0518ca8f63e3
[autoreload] recompute urlresolver / urlrewriter after autoreload
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2670
diff
changeset
|
263 |
self.set_url_rewriter() |
2705
30bcdbd92820
[events] renamed source-reload into registry-reload to avoid potential confusions with datasources
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2694
diff
changeset
|
264 |
CW_EVENT_MANAGER.bind('after-registry-reload', self.set_url_rewriter) |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
265 |
|
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
266 |
def start_service(self): |
5325
f1c660e1169e
[web] consistent cleanup session interval time
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5279
diff
changeset
|
267 |
start_task(self.appli.session_handler.clean_sessions_interval, |
f1c660e1169e
[web] consistent cleanup session interval time
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5279
diff
changeset
|
268 |
self.appli.session_handler.clean_sessions) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
269 |
|
2685
0518ca8f63e3
[autoreload] recompute urlresolver / urlrewriter after autoreload
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2670
diff
changeset
|
270 |
def set_url_rewriter(self): |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2711
diff
changeset
|
271 |
self.url_rewriter = self.appli.vreg['components'].select_or_none('urlrewriter') |
2685
0518ca8f63e3
[autoreload] recompute urlresolver / urlrewriter after autoreload
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2670
diff
changeset
|
272 |
|
0 | 273 |
def shutdown_event(self): |
274 |
"""callback fired when the server is shutting down to properly |
|
275 |
clean opened sessions |
|
276 |
""" |
|
277 |
self.appli.repo.shutdown() |
|
278 |
||
279 |
def pyro_loop_event(self): |
|
280 |
"""listen for pyro events""" |
|
281 |
try: |
|
282 |
self.pyro_daemon.handleRequests(self.pyro_listen_timeout) |
|
283 |
except select.error: |
|
284 |
return |
|
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
285 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
286 |
def getChild(self, path, request): |
0 | 287 |
"""Indicate which resource to use to process down the URL's path""" |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
288 |
return self |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
289 |
|
0 | 290 |
def render(self, request): |
291 |
"""Render a page from the root resource""" |
|
3638
648d6dbec630
system/user modes + CWDEV instead of installed/dev mixed modes. Fix behaviour when setting CW_MODE explicitly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3618
diff
changeset
|
292 |
# reload modified files in debug mode |
5442
3ed8afbbdf70
[webconfig] refactor/cleanup debug mode management on startup: simply use config.debugmode instead of debug argument everywhere...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
293 |
if self.config.debugmode: |
5445
4467ed43d97d
[web] use uiprops value to compile css transparently, handlig cache and reloading in debug mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5442
diff
changeset
|
294 |
self.config.uiprops.reload_if_needed() |
5467
57372dbfd114
[https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5445
diff
changeset
|
295 |
if self.https_url: |
57372dbfd114
[https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5445
diff
changeset
|
296 |
self.config.https_uiprops.reload_if_needed() |
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5252
diff
changeset
|
297 |
self.appli.vreg.reload_if_needed() |
0 | 298 |
if self.config['profile']: # default profiler don't trace threads |
299 |
return self.render_request(request) |
|
300 |
else: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
301 |
deferred = threads.deferToThread(self.render_request, request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
302 |
return NOT_DONE_YET |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
303 |
|
0 | 304 |
def render_request(self, request): |
5243
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
305 |
try: |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
306 |
# processing HUGE files (hundred of megabytes) in http.processReceived |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
307 |
# blocks other HTTP requests processing |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
308 |
# due to the clumsy & slow parsing algorithm of cgi.FieldStorage |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
309 |
# so we deferred that part to the cubicweb thread |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
310 |
request.process_multipart() |
5243
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
311 |
return self._render_request(request) |
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7764
diff
changeset
|
312 |
except Exception: |
5243
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
313 |
errorstream = StringIO() |
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
314 |
traceback.print_exc(file=errorstream) |
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
315 |
return HTTPResponse(stream='<pre>%s</pre>' % errorstream.getvalue(), |
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
316 |
code=500, twisted_request=request) |
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
317 |
|
1ab7acb9abe9
[etwist] we must call all error not handled in _render_request, else the thread fail silently and nothing ends up on the ui
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
318 |
def _render_request(self, request): |
0 | 319 |
origpath = request.path |
320 |
host = request.host |
|
321 |
# dual http/https access handling: expect a rewrite rule to prepend |
|
322 |
# 'https' to the path to detect https access |
|
323 |
if origpath.split('/', 2)[1] == 'https': |
|
324 |
origpath = origpath[6:] |
|
325 |
request.uri = request.uri[6:] |
|
326 |
https = True |
|
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
327 |
baseurl = self.https_url or self.base_url |
0 | 328 |
else: |
329 |
https = False |
|
330 |
baseurl = self.base_url |
|
1520
b097057e629d
provide an option to substitute the base-url (left-most part) subdomain by the one of the current http query to easy multiple subdomains website management
Florent <florent@secondweb.fr>
parents:
1420
diff
changeset
|
331 |
if self.config['use-request-subdomain']: |
1543
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
332 |
baseurl = host_prefixed_baseurl(baseurl, host) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
333 |
self.warning('used baseurl is %s for this request', baseurl) |
0 | 334 |
req = CubicWebTwistedRequestAdapter(request, self.appli.vreg, https, baseurl) |
335 |
if req.authmode == 'http': |
|
336 |
# activate realm-based auth |
|
337 |
realm = self.config['realm'] |
|
338 |
req.set_header('WWW-Authenticate', [('Basic', {'realm' : realm })], raw=False) |
|
339 |
try: |
|
340 |
self.appli.connect(req) |
|
341 |
except Redirect, ex: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
342 |
return self.redirect(request=req, location=ex.location) |
8149
3ed48646f354
[https] Allow configuration of anonymous access on https (closes #1971992)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7879
diff
changeset
|
343 |
if https and req.session.anonymous_session and self.config['https-deny-anonymous']: |
0 | 344 |
# don't allow anonymous on https connection |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
345 |
return self.request_auth(request=req) |
0 | 346 |
if self.url_rewriter is not None: |
1115 | 347 |
# XXX should occur before authentication? |
0 | 348 |
try: |
1936
c5af2fbda5b6
pass request to ApacheRewriter rewrite method
Florent <florent@secondweb.fr>
parents:
1543
diff
changeset
|
349 |
path = self.url_rewriter.rewrite(host, origpath, req) |
0 | 350 |
except Redirect, ex: |
351 |
return self.redirect(req, ex.location) |
|
352 |
request.uri.replace(origpath, path, 1) |
|
353 |
else: |
|
354 |
path = origpath |
|
355 |
if not path or path == "/": |
|
356 |
path = 'view' |
|
357 |
try: |
|
358 |
result = self.appli.publish(path, req) |
|
359 |
except DirectResponse, ex: |
|
360 |
return ex.response |
|
361 |
except StatusResponse, ex: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
362 |
return HTTPResponse(stream=ex.content, code=ex.status, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
363 |
twisted_request=req._twreq, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
364 |
headers=req.headers_out) |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5216
diff
changeset
|
365 |
except AuthenticationError: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
366 |
return self.request_auth(request=req) |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5216
diff
changeset
|
367 |
except LogOut, ex: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5216
diff
changeset
|
368 |
if self.config['auth-mode'] == 'cookie' and ex.url: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
369 |
return self.redirect(request=req, location=ex.url) |
4911
898c35be5873
#750055: make it easier to change post logout url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4909
diff
changeset
|
370 |
# in http we have to request auth to flush current http auth |
898c35be5873
#750055: make it easier to change post logout url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4909
diff
changeset
|
371 |
# information |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
372 |
return self.request_auth(request=req, loggedout=True) |
0 | 373 |
except Redirect, ex: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
374 |
return self.redirect(request=req, location=ex.location) |
0 | 375 |
# request may be referenced by "onetime callback", so clear its entity |
376 |
# cache to avoid memory usage |
|
377 |
req.drop_entity_cache() |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
378 |
return HTTPResponse(twisted_request=req._twreq, code=http.OK, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
379 |
stream=result, headers=req.headers_out) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
380 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
381 |
def redirect(self, request, location): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
382 |
self.debug('redirecting to %s', str(location)) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
383 |
request.headers_out.setHeader('location', str(location)) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
384 |
# 303 See other |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
385 |
return HTTPResponse(twisted_request=request._twreq, code=303, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
386 |
headers=request.headers_out) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
387 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
388 |
def request_auth(self, request, loggedout=False): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
389 |
if self.https_url and request.base_url() != self.https_url: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
390 |
return self.redirect(request, self.https_url + 'login') |
0 | 391 |
if self.config['auth-mode'] == 'http': |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
392 |
code = http.UNAUTHORIZED |
0 | 393 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
394 |
code = http.FORBIDDEN |
0 | 395 |
if loggedout: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
396 |
if request.https: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
397 |
request._base_url = self.base_url |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
398 |
request.https = False |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
399 |
content = self.appli.loggedout_content(request) |
0 | 400 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
401 |
content = self.appli.need_login_content(request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
402 |
return HTTPResponse(twisted_request=request._twreq, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
403 |
stream=content, code=code, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
404 |
headers=request.headers_out) |
0 | 405 |
|
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
406 |
# these are overridden by set_log_methods below |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
407 |
# only defining here to prevent pylint from complaining |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
408 |
@classmethod |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
409 |
def debug(cls, msg, *a, **kw): |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
410 |
pass |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
411 |
info = warning = error = critical = exception = debug |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
412 |
|
0 | 413 |
|
5335
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
414 |
JSON_PATHS = set(('json',)) |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
415 |
FRAME_POST_PATHS = set(('validateform',)) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
416 |
|
5270
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
417 |
orig_gotLength = http.Request.gotLength |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
418 |
@monkeypatch(http.Request) |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
419 |
def gotLength(self, length): |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
420 |
orig_gotLength(self, length) |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
421 |
if length > MAX_POST_LENGTH: # length is 0 on GET |
5335
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
422 |
path = self.channel._path.split('?', 1)[0].rstrip('/').rsplit('/', 1)[-1] |
5270
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
423 |
self.clientproto = 'HTTP/1.1' # not yet initialized |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
424 |
self.channel.persistent = 0 # force connection close on cleanup |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
425 |
self.setResponseCode(http.BAD_REQUEST) |
5335
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
426 |
if path in JSON_PATHS: # XXX better json path detection |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
427 |
self.setHeader('content-type',"application/json") |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5933
diff
changeset
|
428 |
body = json_dumps({'reason': 'request max size exceeded'}) |
5335
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
429 |
elif path in FRAME_POST_PATHS: # XXX better frame post path detection |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
430 |
self.setHeader('content-type',"text/html") |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
431 |
body = ('<script type="text/javascript">' |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
432 |
'window.parent.handleFormValidationResponse(null, null, null, %s, null);' |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5933
diff
changeset
|
433 |
'</script>' % json_dumps( (False, 'request max size exceeded', None) )) |
5335
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
434 |
else: |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
435 |
self.setHeader('content-type',"text/html") |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
436 |
body = ("<html><head><title>Processing Failed</title></head><body>" |
9aed0b607130
[etwist] nicer, thouhg really not perferct) request max size exceeded support of json/frame posts
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5330
diff
changeset
|
437 |
"<b>request max size exceeded</b></body></html>") |
5270
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
438 |
self.setHeader('content-length', str(len(body))) |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
439 |
self.write(body) |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
440 |
# see request.finish(). Done here since we get error due to not full |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
441 |
# initialized request |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
442 |
self.finished = 1 |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
443 |
if not self.queued: |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
444 |
self._cleanup() |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
445 |
for d in self.notifications: |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
446 |
d.callback(None) |
6297d5265572
[etwist] allow to specify max size for POST request in the configuration. We should deal with this nicely on the js form validation code.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5243
diff
changeset
|
447 |
self.notifications = [] |
0 | 448 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
449 |
@monkeypatch(http.Request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
450 |
def requestReceived(self, command, path, version): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
451 |
"""Called by channel when all data has been received. |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
452 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
453 |
This method is not intended for users. |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
454 |
""" |
5272 | 455 |
self.content.seek(0, 0) |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
456 |
self.args = {} |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
457 |
self.files = {} |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
458 |
self.stack = [] |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
459 |
self.method, self.uri = command, path |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
460 |
self.clientproto = version |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
461 |
x = self.uri.split('?', 1) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
462 |
if len(x) == 1: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
463 |
self.path = self.uri |
0 | 464 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
465 |
self.path, argstring = x |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
466 |
self.args = http.parse_qs(argstring, 1) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
467 |
# cache the client and server information, we'll need this later to be |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
468 |
# serialized and sent with the request so CGIs will work remotely |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
469 |
self.client = self.channel.transport.getPeer() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
470 |
self.host = self.channel.transport.getHost() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
471 |
# Argument processing |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
472 |
ctype = self.getHeader('content-type') |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
473 |
self._do_process_multipart = False |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
474 |
if self.method == "POST" and ctype: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
475 |
key, pdict = parse_header(ctype) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
476 |
if key == 'application/x-www-form-urlencoded': |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
477 |
self.args.update(http.parse_qs(self.content.read(), 1)) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
478 |
elif key == 'multipart/form-data': |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
479 |
# defer this as it can be extremely time consumming |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
480 |
# with big files |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
481 |
self._do_process_multipart = True |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
482 |
self.process() |
0 | 483 |
|
484 |
||
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
485 |
@monkeypatch(http.Request) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
486 |
def process_multipart(self): |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
487 |
if not self._do_process_multipart: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
488 |
return |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
489 |
form = FieldStorage(self.content, self.received_headers, |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
490 |
environ={'REQUEST_METHOD': 'POST'}, |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
491 |
keep_blank_values=1, |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
492 |
strict_parsing=1) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
493 |
for key in form: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
494 |
value = form[key] |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
495 |
if isinstance(value, list): |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
496 |
self.args[key] = [v.value for v in value] |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
497 |
elif value.filename: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
498 |
if value.done != -1: # -1 is transfer has been interrupted |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
499 |
self.files[key] = (value.filename, value.file) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
500 |
else: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
501 |
self.files[key] = (None, None) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
502 |
else: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
503 |
self.args[key] = value.value |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
504 |
|
0 | 505 |
from logging import getLogger |
506 |
from cubicweb import set_log_methods |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
507 |
LOGGER = getLogger('cubicweb.twisted') |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
508 |
set_log_methods(CubicWebRootResource, LOGGER) |
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
509 |
|
5653
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
510 |
def run(config, vreg=None, debug=None): |
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
511 |
if debug is not None: |
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
512 |
config.debugmode = debug |
5933
3d707b8f8a4d
[web configuration] ensure data home directory / uicache file belong to daemon user and are writeable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5907
diff
changeset
|
513 |
config.check_writeable_uid_directory(config.appdatahome) |
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
514 |
# create the site |
5653
c562791df9d2
[web server] vregistry may now be passed as named argument in CubicWebRootResource constructor
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
5555
diff
changeset
|
515 |
root_resource = CubicWebRootResource(config, vreg=vreg) |
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
516 |
website = server.Site(root_resource) |
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
517 |
# serve it via standard HTTP on port set in the configuration |
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
518 |
port = config['port'] or 8080 |
6817
1959d97ebf2e
[etwist] add an 'interface' config option (passed to reactor.listenTCP)
david.douard@logilab.fr
parents:
6779
diff
changeset
|
519 |
interface = config['interface'] |
7644
7a0914469618
[twisted] add an option to configure twisted's threadpool size
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7620
diff
changeset
|
520 |
reactor.suggestThreadPoolSize(config['webserver-threadpool-size']) |
6817
1959d97ebf2e
[etwist] add an 'interface' config option (passed to reactor.listenTCP)
david.douard@logilab.fr
parents:
6779
diff
changeset
|
521 |
reactor.listenTCP(port, website, interface=interface) |
5442
3ed8afbbdf70
[webconfig] refactor/cleanup debug mode management on startup: simply use config.debugmode instead of debug argument everywhere...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
522 |
if not config.debugmode: |
4219
87203a0a3a81
do not attempt to daemonize under windows
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4212
diff
changeset
|
523 |
if sys.platform == 'win32': |
4221
da84ca26896d
raising ConfigurationError is cleaner; remove some unused imports
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4219
diff
changeset
|
524 |
raise ConfigurationError("Under windows, you must use the service management " |
da84ca26896d
raising ConfigurationError is cleaner; remove some unused imports
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4219
diff
changeset
|
525 |
"commands (e.g : 'net start my_instance)'") |
5659
755f56f01c9d
[win32] defer import of logilab.common.daemon
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5553
diff
changeset
|
526 |
from logilab.common.daemon import daemonize |
5679 | 527 |
LOGGER.info('instance started in the background on %s', root_resource.base_url) |
6779
accf5978a440
[daemon] make process umask configurable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6778
diff
changeset
|
528 |
whichproc = daemonize(config['pid-file'], umask=config['umask']) |
6778
7dd4835d5198
properly tell we've started an instance (close #1391262)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
529 |
if whichproc: # 1 = orig process, 2 = first fork, None = second fork (eg daemon process) |
7dd4835d5198
properly tell we've started an instance (close #1391262)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5940
diff
changeset
|
530 |
return whichproc # parent process |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
531 |
root_resource.init_publisher() # before changing uid |
3193
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
532 |
if config['uid'] is not None: |
7764
c709f6c457ff
Drop privileges properly (closes #1910561)
Julien Cristau <julien.cristau@logilab.fr>
parents:
7647
diff
changeset
|
533 |
from logilab.common.daemon import setugid |
c709f6c457ff
Drop privileges properly (closes #1910561)
Julien Cristau <julien.cristau@logilab.fr>
parents:
7647
diff
changeset
|
534 |
setugid(config['uid']) |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
535 |
root_resource.start_service() |
5679 | 536 |
LOGGER.info('instance started on %s', root_resource.base_url) |
5652
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
537 |
# avoid annoying warnign if not in Main Thread |
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
538 |
signals = threading.currentThread().getName() == 'MainThread' |
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
539 |
if config['profile']: |
4960
26b2468a1e73
[etwist] cleanup, use cProfile instead of hotshot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4914
diff
changeset
|
540 |
import cProfile |
5652
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
541 |
cProfile.runctx('reactor.run(installSignalHandlers=%s)' % signals, |
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
542 |
globals(), locals(), config['profile']) |
2654
6512522860aa
[twisted] don't use twistd anymore, all-in-one.py file is needed anymore
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2476
diff
changeset
|
543 |
else: |
5652
904091dc4c7e
[etwist] twisted won't install signal handler outside the main thread.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5553
diff
changeset
|
544 |
reactor.run(installSignalHandlers=signals) |