author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
Thu, 15 Mar 2012 18:34:59 +0100 | |
changeset 8314 | cfd6ab461849 |
parent 8312 | 6c2119509fac |
child 8396 | 8d58fcf68539 |
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
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:
4721
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""WSGI request handler for cubicweb |
19 |
||
20 |
""" |
|
21 |
||
8314
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
22 |
|
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
23 |
|
0 | 24 |
__docformat__ = "restructuredtext en" |
25 |
||
8314
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
26 |
from itertools import chain, repeat, izip |
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
27 |
|
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
28 |
from cubicweb import AuthenticationError |
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:
4721
diff
changeset
|
29 |
from cubicweb.web import Redirect, DirectResponse, StatusResponse, LogOut |
0 | 30 |
from cubicweb.web.application import CubicWebPublisher |
31 |
from cubicweb.wsgi.request import CubicWebWsgiRequest |
|
32 |
||
33 |
# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html |
|
34 |
STATUS_CODE_TEXT = { |
|
35 |
100: 'CONTINUE', |
|
36 |
101: 'SWITCHING PROTOCOLS', |
|
37 |
200: 'OK', |
|
38 |
201: 'CREATED', |
|
39 |
202: 'ACCEPTED', |
|
40 |
203: 'NON-AUTHORITATIVE INFORMATION', |
|
41 |
204: 'NO CONTENT', |
|
42 |
205: 'RESET CONTENT', |
|
43 |
206: 'PARTIAL CONTENT', |
|
44 |
300: 'MULTIPLE CHOICES', |
|
45 |
301: 'MOVED PERMANENTLY', |
|
46 |
302: 'FOUND', |
|
47 |
303: 'SEE OTHER', |
|
48 |
304: 'NOT MODIFIED', |
|
49 |
305: 'USE PROXY', |
|
50 |
306: 'RESERVED', |
|
51 |
307: 'TEMPORARY REDIRECT', |
|
52 |
400: 'BAD REQUEST', |
|
53 |
401: 'UNAUTHORIZED', |
|
54 |
402: 'PAYMENT REQUIRED', |
|
55 |
403: 'FORBIDDEN', |
|
56 |
404: 'NOT FOUND', |
|
57 |
405: 'METHOD NOT ALLOWED', |
|
58 |
406: 'NOT ACCEPTABLE', |
|
59 |
407: 'PROXY AUTHENTICATION REQUIRED', |
|
60 |
408: 'REQUEST TIMEOUT', |
|
61 |
409: 'CONFLICT', |
|
62 |
410: 'GONE', |
|
63 |
411: 'LENGTH REQUIRED', |
|
64 |
412: 'PRECONDITION FAILED', |
|
65 |
413: 'REQUEST ENTITY TOO LARGE', |
|
66 |
414: 'REQUEST-URI TOO LONG', |
|
67 |
415: 'UNSUPPORTED MEDIA TYPE', |
|
68 |
416: 'REQUESTED RANGE NOT SATISFIABLE', |
|
69 |
417: 'EXPECTATION FAILED', |
|
70 |
500: 'INTERNAL SERVER ERROR', |
|
71 |
501: 'NOT IMPLEMENTED', |
|
72 |
502: 'BAD GATEWAY', |
|
73 |
503: 'SERVICE UNAVAILABLE', |
|
74 |
504: 'GATEWAY TIMEOUT', |
|
75 |
505: 'HTTP VERSION NOT SUPPORTED', |
|
76 |
} |
|
77 |
||
78 |
class WSGIResponse(object): |
|
79 |
"""encapsulates the wsgi response parameters |
|
80 |
(code, headers and body if there is one) |
|
81 |
""" |
|
82 |
def __init__(self, code, req, body=None): |
|
83 |
text = STATUS_CODE_TEXT.get(code, 'UNKNOWN STATUS CODE') |
|
84 |
self.status = '%s %s' % (code, text) |
|
8314
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
85 |
self.headers = list(chain(*[izip(repeat(k), v) |
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
86 |
for k, v in req.headers_out.getAllRawHeaders()])) |
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
87 |
self.headers = [(str(k), str(v)) for k, v in self.headers] |
0 | 88 |
if body: |
89 |
self.body = [body] |
|
90 |
else: |
|
91 |
self.body = [] |
|
92 |
||
93 |
def __iter__(self): |
|
94 |
return iter(self.body) |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
95 |
|
0 | 96 |
|
97 |
||
98 |
class CubicWebWSGIApplication(object): |
|
99 |
"""This is the wsgi application which will be called by the |
|
100 |
wsgi server with the WSGI ``environ`` and ``start_response`` |
|
101 |
parameters. |
|
102 |
||
103 |
XXX: missing looping tasks and proper repository shutdown when |
|
104 |
the application is stopped. |
|
105 |
NOTE: no pyro |
|
106 |
""" |
|
107 |
||
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
|
108 |
def __init__(self, config, vreg=None): |
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
|
109 |
self.appli = CubicWebPublisher(config, vreg=vreg) |
0 | 110 |
self.config = config |
8314
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
111 |
self.base_url = config['base-url'] |
cfd6ab461849
[Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8312
diff
changeset
|
112 |
self.https_url = config['https-url'] |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2058
diff
changeset
|
113 |
self.url_rewriter = self.appli.vreg['components'].select_or_none('urlrewriter') |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
114 |
|
0 | 115 |
def _render(self, req): |
116 |
"""this function performs the actual rendering |
|
117 |
""" |
|
118 |
if self.base_url is None: |
|
119 |
self.base_url = self.config._base_url = req.base_url() |
|
120 |
try: |
|
8312
6c2119509fac
[web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8309
diff
changeset
|
121 |
path = req.path |
6c2119509fac
[web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8309
diff
changeset
|
122 |
result = self.appli.handle_request(req, path) |
0 | 123 |
except DirectResponse, ex: |
8312
6c2119509fac
[web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8309
diff
changeset
|
124 |
return ex.response |
6c2119509fac
[web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8309
diff
changeset
|
125 |
return WSGIResponse(req.status_out, req, result) |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
126 |
|
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
127 |
|
0 | 128 |
def __call__(self, environ, start_response): |
129 |
"""WSGI protocol entry point""" |
|
8309
48ef505aa9f9
[request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8272
diff
changeset
|
130 |
req = CubicWebWsgiRequest(environ, self.appli.vreg) |
0 | 131 |
response = self._render(req) |
132 |
start_response(response.status, response.headers) |
|
133 |
return response.body |
|
134 |
||
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
135 |
|
0 | 136 |
|
7083
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5442
diff
changeset
|
137 |
# these are overridden by set_log_methods below |
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5442
diff
changeset
|
138 |
# only defining here to prevent pylint from complaining |
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5442
diff
changeset
|
139 |
info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None |
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5442
diff
changeset
|
140 |
|
0 | 141 |
|
142 |
from logging import getLogger |
|
143 |
from cubicweb import set_log_methods |
|
144 |
set_log_methods(CubicWebWSGIApplication, getLogger('cubicweb.wsgi')) |