from httplib import responsesclass _HeaderContainer: """ Special dictionary for HTTP headers, as response may contain multiple headers with the same name """ _container = {} def add_header(self, header, value): """Obviously, adds a header""" if not header in self._container: self._container[header] = [] self._container[header].append(value) def set_header(self, header, value): """Like add_header, but for unique headers, such as Content-Type""" if header in self._container: del self._container[header] self.add_header(header, value) def get_header(self, header): """Get unique header. For multiple headers, alias to get_headers""" if not header in self._container: return None if len(self._container[header]) > 1: return self.get_headers(header) return self._container[header][0] def get_headers(self, header): """Obviously, gets multiple headers""" if not header in self._container: return [] return self._container[header] def http_headers(self): """Make HTTP representation of all headers in container""" httph = [] for header in self._container: for value in self.get_headers(header): httph.append("%s: %s" % (header, value)) return httph def http_response(self): """...""" return '\n'.join(self.http_headers())class Response: """HTTP response. Nuff said.""" _mime = "text/html" _headers = _HeaderContainer() _response = "" def __init__(self, request, code, content, message=None): """Initialize response - set response code, banner and header""" if not message: if code in responses: message = responses[code] else: message = 'Unknown' self._request = request self._rescode = code self._content = str(content) self._message = message def get_response(self): """Get raw response code from object""" self._create_response() return self._response def _create_response(self): """Make an HTTP representation of response object""" self._send_raw("%s %d %s" % (self._request.server.protocol, self._rescode, self._message)) self.set_header('Server', self._request.server.version) self.set_header('Date', self._request.server.date) self.set_header('Content-Type', self._mime) self.set_header('Content-Length', len(self._content)) self._send_headers() self._end_headers() self._send_body() def add_header(self, header, value): """Alias to _HeaderContainer.add_header""" self._headers.add_header(header, value) def set_header(self, header, value): """Alias to _HeaderContainer.set_header""" self._headers.set_header(header, value) def get_header(self, header): """Alias to _HeaderContainer.get_header""" return self._headers.get_header(header) def get_headers(self, header): """Alias to _HeaderContainer.get_headers""" return self._headers.get_headers(header) def set_mimetype(self, mime): """Set MIME-type of content""" self._mime = mime def get_mimetype(self): """Get MIME-type of content""" return self._mime def _send_raw(self, data): """Add one line to raw response""" self._response += data+"\n" def _send_headers(self): """Add _HeaderContainer.http_response() to raw response""" self._send_raw(self._headers.http_response()) def _end_headers(self): """Send empty line (transition from headers to body in HTTP)""" self._send_raw("") def _send_body(self): """Add content to raw response""" self._send_raw(self._content)def send(response): """Create and send response from Response object""" print response.get_response(),