|
1 """twisted server for CubicWeb web instances |
|
2 |
|
3 :organization: Logilab |
|
4 :copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
|
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
|
6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
|
7 """ |
|
8 |
|
9 __docformat__ = "restructuredtext en" |
|
10 |
|
11 from cubicweb.web.http_headers import Headers |
|
12 |
|
13 class HTTPResponse(object): |
|
14 """An object representing an HTTP Response to be sent to the client. |
|
15 """ |
|
16 def __init__(self, twisted_request, code=None, headers=None, stream=None): |
|
17 self._headers_out = headers |
|
18 self._twreq = twisted_request |
|
19 self._stream = stream |
|
20 self._code = code |
|
21 |
|
22 self._init_headers() |
|
23 self._finalize() |
|
24 |
|
25 def _init_headers(self): |
|
26 if self._headers_out is None: |
|
27 return |
|
28 |
|
29 # initialize cookies |
|
30 cookies = self._headers_out.getHeader('set-cookie') or [] |
|
31 for cookie in cookies: |
|
32 self._twreq.addCookie(cookie.name, cookie.value, cookie.expires, |
|
33 cookie.domain, cookie.path, #TODO max-age |
|
34 comment = cookie.comment, secure=cookie.secure) |
|
35 self._headers_out.removeHeader('set-cookie') |
|
36 |
|
37 # initialize other headers |
|
38 for k, v in self._headers_out.getAllRawHeaders(): |
|
39 self._twreq.setHeader(k, v[0]) |
|
40 |
|
41 # add content-length if not present |
|
42 if (self._headers_out.getHeader('content-length') is None |
|
43 and self._stream is not None): |
|
44 self._twreq.setHeader('content-length', len(self._stream)) |
|
45 |
|
46 |
|
47 def _finalize(self): |
|
48 if self._stream is not None: |
|
49 self._twreq.write(str(self._stream)) |
|
50 if self._code is not None: |
|
51 self._twreq.setResponseCode(self._code) |
|
52 self._twreq.finish() |
|
53 |
|
54 def __repr__(self): |
|
55 return "<%s.%s code=%d>" % (self.__module__, self.__class__.__name__, self._code) |
|
56 |
|
57 |
|
58 def not_modified_response(twisted_request, headers_in): |
|
59 headers_out = Headers() |
|
60 |
|
61 for header in ( |
|
62 # Required from sec 10.3.5: |
|
63 'date', 'etag', 'content-location', 'expires', |
|
64 'cache-control', 'vary', |
|
65 # Others: |
|
66 'server', 'proxy-authenticate', 'www-authenticate', 'warning'): |
|
67 value = headers_in.getRawHeaders(header) |
|
68 if value is not None: |
|
69 headers_out.setRawHeaders(header, value) |
|
70 return HTTPResponse(twisted_request=twisted_request, |
|
71 headers=headers_out) |