diff options
author | Camil Staps | 2016-03-04 18:33:12 +0100 |
---|---|---|
committer | Camil Staps | 2016-03-04 18:33:12 +0100 |
commit | 198db6f0003935e5f900719fa0b848924b8921bb (patch) | |
tree | 783956c7f4ced78e864a0ea7503bf5a63bef7370 /project1/proj1_s4498062/webhttp/server.py | |
parent | Added framework project 1 (diff) |
Project one until step 8 in the readme
Diffstat (limited to 'project1/proj1_s4498062/webhttp/server.py')
-rw-r--r-- | project1/proj1_s4498062/webhttp/server.py | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/project1/proj1_s4498062/webhttp/server.py b/project1/proj1_s4498062/webhttp/server.py index b540ac4..b385636 100644 --- a/project1/proj1_s4498062/webhttp/server.py +++ b/project1/proj1_s4498062/webhttp/server.py @@ -3,9 +3,13 @@ This module contains a HTTP server
"""
+from configparser import SafeConfigParser
import threading
import socket
+from composer import ResponseComposer
+from parser import RequestParser
+import weblogging as logging
class ConnectionHandler(threading.Thread):
"""Connection Handler for HTTP Server"""
@@ -18,7 +22,7 @@ class ConnectionHandler(threading.Thread): addr (str): ip address of client
timeout (int): seconds until timeout
"""
- super(HTTPConnectionHandler, self).__init__()
+ super(ConnectionHandler, self).__init__()
self.daemon = True
self.conn_socket = conn_socket
self.addr = addr
@@ -26,17 +30,35 @@ class ConnectionHandler(threading.Thread): def handle_connection(self):
"""Handle a new connection"""
- pass
+ rp = RequestParser()
+ rc = ResponseComposer(timeout=self.timeout)
+
+ while True:
+ data = self.conn_socket.recv(4096)
+ if len(data) == 0:
+ break
+ for req in rp.parse_requests(data):
+ logging.info("<-- %s" % req.startline())
+ resp = rc.compose_response(req)
+ logging.info("--> %s" % resp.startline())
+ sent = self.conn_socket.send(str(resp))
+ if sent == 0:
+ raise RuntimeError('Socket broken')
+
+ self.conn_socket.close()
def run(self):
"""Run the thread of the connection handler"""
- self.handle_connection()
+ try:
+ self.handle_connection()
+ except socket.error, e:
+ print('ERR ' + str(e))
class Server:
"""HTTP Server"""
- def __init__(self, hostname, server_port, timeout):
+ def __init__(self, config, **kwargs):
"""Initialize the HTTP server
Args:
@@ -44,15 +66,26 @@ class Server: server_port (int): port that the server is listening on
timeout (int): seconds until timeout
"""
- self.hostname = hostname
- self.server_port = server_port
- self.timeout = timeout
+ self.read_config(config, **kwargs)
self.done = False
+
+ def read_config(self, config, **kwargs):
+ self.cp = SafeConfigParser()
+ self.cp.read(config)
+ if not self.cp.has_section('webhttp'):
+ self.cp.add_section('webhttp')
+ for (name, val) in self.cp.items('webhttp') + kwargs.items():
+ setattr(self, name, val)
def run(self):
"""Run the HTTP Server and start listening"""
+ serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ serversocket.bind((self.hostname, self.port))
+ serversocket.listen(5)
while not self.done:
- pass
+ (clientsocket, addr) = serversocket.accept()
+ ch = ConnectionHandler(clientsocket, addr, self.timeout)
+ ch.run()
def shutdown(self):
"""Safely shut down the HTTP server"""
|