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