diff -r eaec839ad3fe -r 1dea6e0fdfc1 etwist/http.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etwist/http.py Tue Apr 06 16:50:53 2010 +0200 @@ -0,0 +1,71 @@ +"""twisted server for CubicWeb web instances + +:organization: Logilab +:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. +:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr +:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses +""" + +__docformat__ = "restructuredtext en" + +from cubicweb.web.http_headers import Headers + +class HTTPResponse(object): + """An object representing an HTTP Response to be sent to the client. + """ + def __init__(self, twisted_request, code=None, headers=None, stream=None): + self._headers_out = headers + self._twreq = twisted_request + self._stream = stream + self._code = code + + self._init_headers() + self._finalize() + + def _init_headers(self): + if self._headers_out is None: + return + + # initialize cookies + cookies = self._headers_out.getHeader('set-cookie') or [] + for cookie in cookies: + self._twreq.addCookie(cookie.name, cookie.value, cookie.expires, + cookie.domain, cookie.path, #TODO max-age + comment = cookie.comment, secure=cookie.secure) + self._headers_out.removeHeader('set-cookie') + + # initialize other headers + for k, v in self._headers_out.getAllRawHeaders(): + self._twreq.setHeader(k, v[0]) + + # add content-length if not present + if (self._headers_out.getHeader('content-length') is None + and self._stream is not None): + self._twreq.setHeader('content-length', len(self._stream)) + + + def _finalize(self): + if self._stream is not None: + self._twreq.write(str(self._stream)) + if self._code is not None: + self._twreq.setResponseCode(self._code) + self._twreq.finish() + + def __repr__(self): + return "<%s.%s code=%d>" % (self.__module__, self.__class__.__name__, self._code) + + +def not_modified_response(twisted_request, headers_in): + headers_out = Headers() + + for header in ( + # Required from sec 10.3.5: + 'date', 'etag', 'content-location', 'expires', + 'cache-control', 'vary', + # Others: + 'server', 'proxy-authenticate', 'www-authenticate', 'warning'): + value = headers_in.getRawHeaders(header) + if value is not None: + headers_out.setRawHeaders(header, value) + return HTTPResponse(twisted_request=twisted_request, + headers=headers_out)