From 198db6f0003935e5f900719fa0b848924b8921bb Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Fri, 4 Mar 2016 18:33:12 +0100 Subject: Project one until step 8 in the readme --- project1/proj1_s4498062/webhttp/message.py | 75 ++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 15 deletions(-) (limited to 'project1/proj1_s4498062/webhttp/message.py') diff --git a/project1/proj1_s4498062/webhttp/message.py b/project1/proj1_s4498062/webhttp/message.py index fb47f88..2dc4240 100644 --- a/project1/proj1_s4498062/webhttp/message.py +++ b/project1/proj1_s4498062/webhttp/message.py @@ -3,22 +3,29 @@ This modules contains classes for representing HTTP responses and requests. """ +import re + +import regexes as r +import weblogging as logging + reasondict = { # Dictionary for code reasons # Format: code : "Reason" - 500 : "Internal Server Error" + 200 : 'OK', + 403 : 'Forbidden', + 404 : 'Not Found', + 500 : 'Internal Server Error' } class Message(object): - """Class that stores a HTTP Message""" + """Class that stores an HTTP Message""" def __init__(self): """Initialize the Message""" self.version = "HTTP/1.1" - self.startline = "" self.body = "" - self.headerdict = dict() + self.headers = dict() def set_header(self, name, value): """Add a header and its value @@ -27,7 +34,7 @@ class Message(object): name (str): name of header value (str): value of header """ - self.headerdict[name] = value + self.headers[name] = str(value) def get_header(self, name): """Get the value of a header @@ -38,29 +45,56 @@ class Message(object): Returns: str: value of header, empty if header does not exist """ - if name in self.headerdict: - return self.headerdict[name] + if name in self.headers: + return self.headers[name] else: return "" - + + def parse_headers(self, msg): + for name, value in re.findall(r.MessageHeader, msg): + self.set_header(name, value.strip()) + logging.debug("%s: %s" % (name, value.strip())) + + def startline(self): + return '' + def __str__(self): """Convert the Message to a string Returns: str: representation the can be sent over socket """ - message = "" - return message + msg = '' + msg += '%s\r\n' % self.startline() + msg += '\r\n'.join([k + ": " + v for k, v in self.headers.iteritems()]) + msg += '\r\n\r\n' + msg += self.body + return msg + + def __eq__(self, other): + return self.__dict__ == other.__dict__ class Request(Message): - """Class that stores a HTTP request""" + """Class that stores an HTTP request""" def __init__(self): """Initialize the Request""" super(Request, self).__init__() self.method = "" self.uri = "" + + def parse(self, msg): + [reqline, rest] = msg.split('\r\n', 1) + reqline = re.match(r.RequestLine, reqline + '\r\n') + self.method, self.uri, self.version = reqline.groups() + + [headers, body] = rest.split('\r\n\r\n', 1) + self.parse_headers(headers) + self.body = body + + def startline(self): + return "%s %s %s" % (self.method, self.uri, self.version) def __str__(self): """Convert the Request to a string @@ -68,17 +102,28 @@ class Request(Message): Returns: str: representation the can be sent over socket """ - self.startline = "" return super(Request, self).__str__() class Response(Message): - """Class that stores a HTTP Response""" + """Class that stores an HTTP Response""" def __init__(self): """Initialize the Response""" super(Response, self).__init__() - self.code = 500 + + def parse(self, msg): + [respline, rest] = msg.split('\r\n', 1) + respline = re.match(r.StatusLine, respline + '\r\n') + self.version = respline.group(1) + self.code = int(respline.group(2)) + + [headers, body] = rest.split('\r\n\r\n', 1) + self.parse_headers(headers) + self.body = body + + def startline(self): + return "%s %d %s" % (self.version, self.code, reasondict[self.code]) def __str__(self): """Convert the Response to a string @@ -86,5 +131,5 @@ class Response(Message): Returns: str: representation the can be sent over socket """ - self.startline = "" return super(Response, self).__str__() + -- cgit v1.2.3