All pastes #1727704 Raw Edit

Untitled

public python v1 · immutable
#1727704 ·published 2009-12-26 19:19 UTC
rendered paste body
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(),