etwist/http.py
changeset 11057 0b59724cb3f2
parent 11052 058bb3dc685f
child 11058 23eb30449fe5
equal deleted inserted replaced
11052:058bb3dc685f 11057:0b59724cb3f2
     1 """twisted server for CubicWeb web instances
       
     2 
       
     3 :organization: Logilab
       
     4 :copyright: 2001-2011 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 class HTTPResponse(object):
       
    12     """An object representing an HTTP Response to be sent to the client.
       
    13     """
       
    14     def __init__(self, twisted_request, code=None, headers=None, stream=None):
       
    15         self._headers_out = headers
       
    16         self._twreq = twisted_request
       
    17         self._stream = stream
       
    18         self._code = code
       
    19 
       
    20         self._init_headers()
       
    21         self._finalize()
       
    22 
       
    23     def _init_headers(self):
       
    24         if self._headers_out is None:
       
    25             return
       
    26         # initialize headers
       
    27         for k, values in self._headers_out.getAllRawHeaders():
       
    28             self._twreq.responseHeaders.setRawHeaders(k, values)
       
    29         # add content-length if not present
       
    30         if (self._headers_out.getHeader('content-length') is None
       
    31             and self._stream is not None):
       
    32            self._twreq.setHeader('content-length', len(self._stream))
       
    33 
       
    34     def _finalize(self):
       
    35         # we must set code before writing anything, else it's too late
       
    36         if self._code is not None:
       
    37             self._twreq.setResponseCode(self._code)
       
    38         if self._stream is not None:
       
    39             self._twreq.write(str(self._stream))
       
    40         self._twreq.finish()
       
    41 
       
    42     def __repr__(self):
       
    43         return "<%s.%s code=%d>" % (self.__module__, self.__class__.__name__, self._code)