author | Nicolas Chauvat <nicolas.chauvat@logilab.fr> |
Fri, 29 Oct 2010 00:03:30 +0200 | |
branch | stable |
changeset 6659 | 6205927e927a |
parent 5940 | 0e3ae19b181a |
child 6778 | 7dd4835d5198 |
permissions | -rw-r--r-- |
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
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
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 |
|
20 |
__docformat__ = "restructuredtext en" |
|
21 |
||
22 |
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
|
23 |
import os |
0 | 24 |
import select |
4398
4e7e74918631
add missing errno import in etwist/server.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4221
diff
changeset
|
25 |
import errno |
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
|
26 |
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
|
27 |
import threading |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
28 |
from os.path import join |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
151
diff
changeset
|
29 |
from time import mktime |
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
151
diff
changeset
|
30 |
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
|
31 |
from urlparse import urlsplit, urlunsplit |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
32 |
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
|
33 |
from cStringIO import StringIO |
0 | 34 |
|
35 |
from twisted.internet import reactor, task, threads |
|
36 |
from twisted.internet.defer import maybeDeferred |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
37 |
from twisted.web import http, server |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
38 |
from twisted.web import static, resource |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
39 |
from twisted.web.server import NOT_DONE_YET |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
40 |
|
0 | 41 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
42 |
from logilab.common.decorators import monkeypatch |
0 | 43 |
|
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
|
44 |
from cubicweb import AuthenticationError, ConfigurationError, CW_EVENT_MANAGER |
5940
0e3ae19b181a
[uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5933
diff
changeset
|
45 |
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
|
46 |
from cubicweb.web import Redirect, DirectResponse, StatusResponse, LogOut |
0 | 47 |
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
|
48 |
from cubicweb.web.http_headers import generateDateTime |
0 | 49 |
from cubicweb.etwist.request import CubicWebTwistedRequestAdapter |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
50 |
from cubicweb.etwist.http import HTTPResponse |
0 | 51 |
|
52 |
def start_task(interval, func): |
|
53 |
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
|
54 |
# 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
|
55 |
# 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
|
56 |
lc.start(interval, now=False) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
57 |
|
1543
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
58 |
def host_prefixed_baseurl(baseurl, host): |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
59 |
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
|
60 |
netloc_domain = '.' + '.'.join(netloc.split('.')[-2:]) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
61 |
if host.endswith(netloc_domain): |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
62 |
netloc = host |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
63 |
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
|
64 |
return baseurl |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
65 |
|
0 | 66 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
67 |
class ForbiddenDirectoryLister(resource.Resource): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
68 |
def render(self, request): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
69 |
return HTTPResponse(twisted_request=request, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
70 |
code=http.FORBIDDEN, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
71 |
stream='Access forbidden') |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
72 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
73 |
class File(static.File): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
74 |
"""Prevent from listing directories""" |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
75 |
def directoryListing(self): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
76 |
return ForbiddenDirectoryLister() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
77 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
78 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
79 |
class LongTimeExpiringFile(File): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
80 |
"""overrides static.File and sets a far future ``Expires`` date |
0 | 81 |
on the resouce. |
82 |
||
83 |
versions handling is done by serving static files by different |
|
84 |
URLs for each version. For instance:: |
|
85 |
||
86 |
http://localhost:8080/data-2.48.2/cubicweb.css |
|
87 |
http://localhost:8080/data-2.49.0/cubicweb.css |
|
88 |
etc. |
|
89 |
||
90 |
""" |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
91 |
def render(self, request): |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
92 |
# XXX: Don't provide additional resource information to error responses |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
93 |
# |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
94 |
# the HTTP RFC recommands not going further than 1 year ahead |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
95 |
expires = date.today() + timedelta(days=6*30) |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
96 |
request.setHeader('Expires', generateDateTime(mktime(expires.timetuple()))) |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
97 |
return File.render(self, request) |
0 | 98 |
|
99 |
||
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
100 |
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
|
101 |
def __init__(self, config, vreg=None): |
0 | 102 |
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
|
103 |
# 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
|
104 |
# 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
|
105 |
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
|
106 |
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
|
107 |
self.https_url = config['https-url'] |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
108 |
self.children = {} |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
109 |
self.static_directories = set(('data%s' % config.instance_md5_version(), |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
110 |
'data', 'static', 'fckeditor')) |
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
|
111 |
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
|
112 |
MAX_POST_LENGTH = config['max-post-length'] |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
113 |
|
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
114 |
def init_publisher(self): |
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
115 |
config = self.config |
0 | 116 |
# when we have an in-memory repository, clean unused sessions every XX |
117 |
# seconds and properly shutdown the server |
|
118 |
if config.repo_method == 'inmemory': |
|
119 |
if config.pyro_enabled(): |
|
120 |
# if pyro is enabled, we have to register to the pyro name |
|
121 |
# server, create a pyro daemon, and create a task to handle pyro |
|
122 |
# requests |
|
123 |
self.pyro_daemon = self.appli.repo.pyro_register() |
|
124 |
self.pyro_listen_timeout = 0.02 |
|
3502 | 125 |
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
|
126 |
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
|
127 |
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
|
128 |
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
|
129 |
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
|
130 |
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
|
131 |
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
|
132 |
|
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
133 |
def start_service(self): |
5325
f1c660e1169e
[web] consistent cleanup session interval time
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5279
diff
changeset
|
134 |
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
|
135 |
self.appli.session_handler.clean_sessions) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
136 |
|
2685
0518ca8f63e3
[autoreload] recompute urlresolver / urlrewriter after autoreload
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2670
diff
changeset
|
137 |
def set_url_rewriter(self): |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2711
diff
changeset
|
138 |
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
|
139 |
|
0 | 140 |
def shutdown_event(self): |
141 |
"""callback fired when the server is shutting down to properly |
|
142 |
clean opened sessions |
|
143 |
""" |
|
144 |
self.appli.repo.shutdown() |
|
145 |
||
146 |
def pyro_loop_event(self): |
|
147 |
"""listen for pyro events""" |
|
148 |
try: |
|
149 |
self.pyro_daemon.handleRequests(self.pyro_listen_timeout) |
|
150 |
except select.error: |
|
151 |
return |
|
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
152 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
153 |
def getChild(self, path, request): |
0 | 154 |
"""Indicate which resource to use to process down the URL's path""" |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
155 |
pre_path = request.path.split('/')[1:] |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
156 |
if pre_path[0] == 'https': |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
157 |
pre_path.pop(0) |
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
|
158 |
uiprops = self.config.https_uiprops |
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
|
159 |
else: |
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
|
160 |
uiprops = self.config.uiprops |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
161 |
directory = pre_path[0] |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
162 |
# Anything in data/, static/, fckeditor/ and the generated versioned |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
163 |
# data directory is treated as static files |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
164 |
if directory in self.static_directories: |
5337
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
165 |
# take care fckeditor may appears as root directory or as a data |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
166 |
# subdirectory |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
167 |
if directory == 'static': |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
168 |
return File(self.config.static_directory) |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
169 |
if directory == 'fckeditor': |
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
|
170 |
return File(uiprops['FCKEDITOR_PATH']) |
5337
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
171 |
if directory != 'data': |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
172 |
# versioned directory, use specific file with http cache |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
173 |
# headers so their are cached for a very long time |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
174 |
cls = LongTimeExpiringFile |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
175 |
else: |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
176 |
cls = File |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
177 |
if path == 'fckeditor': |
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
|
178 |
return cls(uiprops['FCKEDITOR_PATH']) |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
179 |
if path == directory: # recurse |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
180 |
return self |
5907
5eba1248e12b
[web config] fix old css compat code: we have to modify locate_resource prototype so it return (potentially hacked) file name as well. Should only impact the file cube which has to be released anyway.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5814
diff
changeset
|
181 |
datadir, path = self.config.locate_resource(path) |
5337
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
182 |
if datadir is None: |
c3a037550e1f
[etwist] proper getChild implementation (eventually): fix fckeditor resources locating bugs by properly using file resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5335
diff
changeset
|
183 |
return self # recurse |
5216
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
184 |
self.debug('static file %s from %s', path, datadir) |
4f4369e63f5e
[twisted] fix LongTimeExpiringFile and getChild implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5155
diff
changeset
|
185 |
return cls(join(datadir, path)) |
0 | 186 |
# Otherwise we use this single resource |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
187 |
return self |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
188 |
|
0 | 189 |
def render(self, request): |
190 |
"""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
|
191 |
# 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
|
192 |
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
|
193 |
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
|
194 |
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
|
195 |
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
|
196 |
self.appli.vreg.reload_if_needed() |
0 | 197 |
if self.config['profile']: # default profiler don't trace threads |
198 |
return self.render_request(request) |
|
199 |
else: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
200 |
deferred = threads.deferToThread(self.render_request, request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
201 |
return NOT_DONE_YET |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
202 |
|
0 | 203 |
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
|
204 |
try: |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
205 |
# 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
|
206 |
# blocks other HTTP requests processing |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
207 |
# 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
|
208 |
# 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
|
209 |
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
|
210 |
return self._render_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
|
211 |
except: |
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
|
212 |
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
|
213 |
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
|
214 |
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
|
215 |
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
|
216 |
|
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
|
217 |
def _render_request(self, request): |
0 | 218 |
origpath = request.path |
219 |
host = request.host |
|
220 |
# dual http/https access handling: expect a rewrite rule to prepend |
|
221 |
# 'https' to the path to detect https access |
|
222 |
if origpath.split('/', 2)[1] == 'https': |
|
223 |
origpath = origpath[6:] |
|
224 |
request.uri = request.uri[6:] |
|
225 |
https = True |
|
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
226 |
baseurl = self.https_url or self.base_url |
0 | 227 |
else: |
228 |
https = False |
|
229 |
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
|
230 |
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
|
231 |
baseurl = host_prefixed_baseurl(baseurl, host) |
dca9817bb337
fix use-request-subdomain option behaviour and add tests
Florent <florent@secondweb.fr>
parents:
1542
diff
changeset
|
232 |
self.warning('used baseurl is %s for this request', baseurl) |
0 | 233 |
req = CubicWebTwistedRequestAdapter(request, self.appli.vreg, https, baseurl) |
234 |
if req.authmode == 'http': |
|
235 |
# activate realm-based auth |
|
236 |
realm = self.config['realm'] |
|
237 |
req.set_header('WWW-Authenticate', [('Basic', {'realm' : realm })], raw=False) |
|
238 |
try: |
|
239 |
self.appli.connect(req) |
|
240 |
except Redirect, ex: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
241 |
return self.redirect(request=req, location=ex.location) |
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
|
242 |
if https and req.session.anonymous_session: |
0 | 243 |
# don't allow anonymous on https connection |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
244 |
return self.request_auth(request=req) |
0 | 245 |
if self.url_rewriter is not None: |
1115 | 246 |
# XXX should occur before authentication? |
0 | 247 |
try: |
1936
c5af2fbda5b6
pass request to ApacheRewriter rewrite method
Florent <florent@secondweb.fr>
parents:
1543
diff
changeset
|
248 |
path = self.url_rewriter.rewrite(host, origpath, req) |
0 | 249 |
except Redirect, ex: |
250 |
return self.redirect(req, ex.location) |
|
251 |
request.uri.replace(origpath, path, 1) |
|
252 |
else: |
|
253 |
path = origpath |
|
254 |
if not path or path == "/": |
|
255 |
path = 'view' |
|
256 |
try: |
|
257 |
result = self.appli.publish(path, req) |
|
258 |
except DirectResponse, ex: |
|
259 |
return ex.response |
|
260 |
except StatusResponse, ex: |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
261 |
return HTTPResponse(stream=ex.content, code=ex.status, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
262 |
twisted_request=req._twreq, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
263 |
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
|
264 |
except AuthenticationError: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
265 |
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
|
266 |
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
|
267 |
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
|
268 |
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
|
269 |
# 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
|
270 |
# information |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
271 |
return self.request_auth(request=req, loggedout=True) |
0 | 272 |
except Redirect, ex: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
273 |
return self.redirect(request=req, location=ex.location) |
0 | 274 |
# request may be referenced by "onetime callback", so clear its entity |
275 |
# cache to avoid memory usage |
|
276 |
req.drop_entity_cache() |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
277 |
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
|
278 |
stream=result, headers=req.headers_out) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
279 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
280 |
def redirect(self, request, location): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
281 |
self.debug('redirecting to %s', str(location)) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
282 |
request.headers_out.setHeader('location', str(location)) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
283 |
# 303 See other |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
284 |
return HTTPResponse(twisted_request=request._twreq, code=303, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
285 |
headers=request.headers_out) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
286 |
|
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
287 |
def request_auth(self, request, loggedout=False): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
288 |
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
|
289 |
return self.redirect(request, self.https_url + 'login') |
0 | 290 |
if self.config['auth-mode'] == 'http': |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
291 |
code = http.UNAUTHORIZED |
0 | 292 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
293 |
code = http.FORBIDDEN |
0 | 294 |
if loggedout: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
295 |
if request.https: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
296 |
request._base_url = self.base_url |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
297 |
request.https = False |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
298 |
content = self.appli.loggedout_content(request) |
0 | 299 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
300 |
content = self.appli.need_login_content(request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
301 |
return HTTPResponse(twisted_request=request._twreq, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
302 |
stream=content, code=code, |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
303 |
headers=request.headers_out) |
0 | 304 |
|
305 |
||
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
|
306 |
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
|
307 |
FRAME_POST_PATHS = set(('validateform',)) |
1420
25c13e5b12bd
stop complaining about empty response, remove trailing spaces
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
308 |
|
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
|
309 |
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
|
310 |
@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
|
311 |
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
|
312 |
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
|
313 |
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
|
314 |
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
|
315 |
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
|
316 |
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
|
317 |
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
|
318 |
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
|
319 |
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
|
320 |
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
|
321 |
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
|
322 |
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
|
323 |
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
|
324 |
'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
|
325 |
'</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
|
326 |
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
|
327 |
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
|
328 |
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
|
329 |
"<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
|
330 |
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
|
331 |
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
|
332 |
# 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
|
333 |
# 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
|
334 |
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
|
335 |
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
|
336 |
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
|
337 |
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
|
338 |
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
|
339 |
self.notifications = [] |
0 | 340 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
341 |
@monkeypatch(http.Request) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
342 |
def requestReceived(self, command, path, version): |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
343 |
"""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
|
344 |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
345 |
This method is not intended for users. |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
346 |
""" |
5272 | 347 |
self.content.seek(0, 0) |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
348 |
self.args = {} |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
349 |
self.files = {} |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
350 |
self.stack = [] |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
351 |
self.method, self.uri = command, path |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
352 |
self.clientproto = version |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
353 |
x = self.uri.split('?', 1) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
354 |
if len(x) == 1: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
355 |
self.path = self.uri |
0 | 356 |
else: |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
357 |
self.path, argstring = x |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
358 |
self.args = http.parse_qs(argstring, 1) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
359 |
# 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
|
360 |
# 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
|
361 |
self.client = self.channel.transport.getPeer() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
362 |
self.host = self.channel.transport.getHost() |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
363 |
# Argument processing |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
364 |
ctype = self.getHeader('content-type') |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
365 |
self._do_process_multipart = False |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
366 |
if self.method == "POST" and ctype: |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
367 |
key, pdict = parse_header(ctype) |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
368 |
if key == 'application/x-www-form-urlencoded': |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
369 |
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
|
370 |
elif key == 'multipart/form-data': |
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
371 |
# 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
|
372 |
# with big files |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
373 |
self._do_process_multipart = True |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
374 |
self.process() |
0 | 375 |
|
376 |
||
5759
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
377 |
@monkeypatch(http.Request) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
378 |
def process_multipart(self): |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
379 |
if not self._do_process_multipart: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
380 |
return |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
381 |
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
|
382 |
environ={'REQUEST_METHOD': 'POST'}, |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
383 |
keep_blank_values=1, |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
384 |
strict_parsing=1) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
385 |
for key in form: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
386 |
value = form[key] |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
387 |
if isinstance(value, list): |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
388 |
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
|
389 |
elif value.filename: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
390 |
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
|
391 |
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
|
392 |
else: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
393 |
self.files[key] = (None, None) |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
394 |
else: |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
395 |
self.args[key] = value.value |
5db529e0a3ee
imported patch asynchronous multipart parsing.diff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5660
diff
changeset
|
396 |
|
0 | 397 |
from logging import getLogger |
398 |
from cubicweb import set_log_methods |
|
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
399 |
LOGGER = getLogger('cubicweb.twisted') |
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
400 |
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
|
401 |
|
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
|
402 |
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
|
403 |
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
|
404 |
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
|
405 |
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
|
406 |
# 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
|
407 |
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
|
408 |
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
|
409 |
# 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
|
410 |
port = config['port'] or 8080 |
5155
1dea6e0fdfc1
Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents:
5062
diff
changeset
|
411 |
reactor.listenTCP(port, website) |
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
|
412 |
if not config.debugmode: |
4219
87203a0a3a81
do not attempt to daemonize under windows
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4212
diff
changeset
|
413 |
if sys.platform == 'win32': |
4221
da84ca26896d
raising ConfigurationError is cleaner; remove some unused imports
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4219
diff
changeset
|
414 |
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
|
415 |
"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
|
416 |
from logilab.common.daemon import daemonize |
5679 | 417 |
LOGGER.info('instance started in the background on %s', root_resource.base_url) |
5553 | 418 |
if daemonize(config['pid-file']): |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
419 |
return # child process |
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
420 |
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
|
421 |
if config['uid'] is not None: |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
422 |
try: |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
423 |
uid = int(config['uid']) |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
424 |
except ValueError: |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
425 |
from pwd import getpwnam |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
426 |
uid = getpwnam(config['uid']).pw_uid |
c1a8456cb5f9
should change process'user once pid file has been written
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3181
diff
changeset
|
427 |
os.setuid(uid) |
3606
8326aceecb46
fix startup as a daemon
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3558
diff
changeset
|
428 |
root_resource.start_service() |
5679 | 429 |
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
|
430 |
# 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
|
431 |
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
|
432 |
if config['profile']: |
4960
26b2468a1e73
[etwist] cleanup, use cProfile instead of hotshot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4914
diff
changeset
|
433 |
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
|
434 |
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
|
435 |
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
|
436 |
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
|
437 |
reactor.run(installSignalHandlers=signals) |