etwist/http.py
changeset 5155 1dea6e0fdfc1
child 5513 07b32d9d8804
equal deleted inserted replaced
5125:eaec839ad3fe 5155:1dea6e0fdfc1
       
     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)