This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
mandaye/mandaye/http.py

99 lines
2.7 KiB
Python

"""
Mandaye HTTP object: Response, Request and Headers
"""
import Cookie
class HTTPHeader(dict):
""" Mandaye class to manage HTTP header
"""
def load_httpmessage(self, headers):
""" headers: HTTPMessage (httplib)
"""
for key in headers.keys():
self[key] = headers.getheaders(key)
def addheader(self, name, value):
""" name: field name
value: string with the field value """
if isinstance(value, str):
self[name] = [value]
else:
raise TypeError('Header value must be a string')
def addheaders(self, name, values):
""" name: field name
values: list of field values """
self[name] = value
def getheader(self, name):
if self.has_key(name):
return self[name][0]
else:
return None
def getheaders(self):
res = {}
for key, values in self.iteritems():
res[key] = ', '.join(values)
return res
def addsetcookies(self, cookies):
""" cookies: Cookie.SimpleCookie object """
self['set-cookie'] = []
for cookie in cookies.values():
self['set-cookie'].append(cookie.output(header=""))
def items(self):
items = super(HTTPHeader, self).items()
new_items = []
for (key, values) in items:
for value in values:
new_items.append((key, value))
return new_items
class HTTPRequest(object):
def __init__(self, cookies, headers, msg=None):
""" cookies:
"""
self.cookies = cookies
self.headers = headers
self.msg = msg
class HTTPResponse(object):
""" Mandaye HTTP Response
"""
def __init__(self, code=None, status=None, headers=None, msg=None, cookies=None):
"""
code: integer return code (200, 302, 404, ..)
status: string with http status (ex: OK, Not Found, ...)
headers: dictionary with the headers
msg: message body str
"""
self.code = code
self.status = status
self.headers = headers
self.msg = msg
self.cookies = cookies
if not headers:
self.headers = HTTPHeader()
if not cookies:
self.cookies = Cookie.BaseCookie()
def load_from_urllib(self, response):
""" response: urrlib.addinfourl
"""
self.headers.load_httpmessage(response.headers)
if self.headers.has_key('set-cookie'):
del self.headers['set-cookie']
for setcookie in response.headers.getheaders('set-cookie'):
self.cookies.load("Set-Cookie: %s" % setcookie)
self.code = response.code
self.status = response.msg
self.msg = response.read()