summaryrefslogtreecommitdiff
path: root/project1/proj1_s4498062/webhttp/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'project1/proj1_s4498062/webhttp/server.py')
-rw-r--r--project1/proj1_s4498062/webhttp/server.py236
1 files changed, 118 insertions, 118 deletions
diff --git a/project1/proj1_s4498062/webhttp/server.py b/project1/proj1_s4498062/webhttp/server.py
index 5db8620..70d1dd6 100644
--- a/project1/proj1_s4498062/webhttp/server.py
+++ b/project1/proj1_s4498062/webhttp/server.py
@@ -1,118 +1,118 @@
-"""HTTP Server
-
-This module contains a HTTP server
-"""
-
-import threading
-import socket
-
-from composer import ResponseComposer
-from parser import RequestParser
-import weblogging as logging
-from config import config
-
-class ConnectionHandler(threading.Thread):
- """Connection Handler for HTTP Server"""
-
- def __init__(self, conn_socket, addr, timeout):
- """Initialize the HTTP Connection Handler
-
- Args:
- conn_socket (socket): socket used for connection with client
- addr (str): ip address of client
- timeout (int): seconds until timeout
- """
- super(ConnectionHandler, self).__init__()
- self.daemon = True
- self.conn_socket = conn_socket
- self.addr = addr
- self.timeout = timeout
- self.done = False
-
- def handle_connection(self):
- """Handle a new connection"""
- self.rp = RequestParser()
- self.rc = ResponseComposer(timeout=self.timeout)
-
- self.conn_socket.settimeout(self.timeout)
-
- try:
- while not self.done:
- data = self.conn_socket.recv(32)
- if len(data) == 0:
- break
- self.handle_data(data)
- except socket.timeout:
- logging.debug('%s connection timed out.' % self.addr[0])
- finally:
- self.conn_socket.shutdown(socket.SHUT_RDWR)
- self.conn_socket.close()
- logging.debug('%s connection closed.' % self.addr[0])
-
- def handle_data(self, data):
- for req in self.rp.parse_requests(data):
- logging.info("<-- (%s) %s" % (self.addr[0], req.startline()))
- resp = self.rc.compose_response(req)
- logging.info("--> (%s) %s" % (self.addr[0], resp.startline()))
- self.send(resp)
-
- if resp.get_header('Connection') == 'close':
- self.done = True
- return
-
- def send(self, data):
- sent = self.conn_socket.send(str(data))
- if sent == 0:
- raise RuntimeError('Socket broken')
-
- def run(self):
- """Run the thread of the connection handler"""
- try:
- self.handle_connection()
- except socket.error, e:
- logging.error('Error in handling connection with %s: %s' %
- (self.addr[0], str(e)))
-
-
-class Server:
- """HTTP Server"""
-
- def __init__(self, configfile, **kwargs):
- """Initialize the HTTP server
-
- Args:
- hostname (str): hostname of the server
- server_port (int): port that the server is listening on
- timeout (int): seconds until timeout
- """
- self.read_config(configfile, **kwargs)
- self.done = False
-
- def read_config(self, configfile, **kwargs):
- config().read(configfile)
-
- if not config().has_section('webhttp'):
- config().add_section('webhttp')
-
- for name, val in kwargs.items():
- if val != None:
- config().set('webhttp', name, str(val))
-
- def run(self):
- """Run the HTTP Server and start listening"""
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.socket.bind((config('hostname', default='localhost'),
- config('port', type=int, default=8001)))
- self.socket.listen(config('max_connections', type=int, default=1000))
- while not self.done:
- (csocket, addr) = self.socket.accept()
- logging.debug('%s connection accepted.' % addr[0])
- ch = ConnectionHandler(csocket, addr, config('timeout', type=int))
- ch.start()
-
- def shutdown(self):
- """Safely shut down the HTTP server"""
- self.socket.shutdown(socket.SHUT_RDWR)
- self.socket.close()
- self.done = True
-
+"""HTTP Server
+
+This module contains a HTTP server
+"""
+
+import threading
+import socket
+
+from composer import ResponseComposer
+from parser import RequestParser
+import weblogging as logging
+from config import config
+
+class ConnectionHandler(threading.Thread):
+ """Connection Handler for HTTP Server"""
+
+ def __init__(self, conn_socket, addr, timeout):
+ """Initialize the HTTP Connection Handler
+
+ Args:
+ conn_socket (socket): socket used for connection with client
+ addr (str): ip address of client
+ timeout (int): seconds until timeout
+ """
+ super(ConnectionHandler, self).__init__()
+ self.daemon = True
+ self.conn_socket = conn_socket
+ self.addr = addr
+ self.timeout = timeout
+ self.done = False
+
+ def handle_connection(self):
+ """Handle a new connection"""
+ self.rp = RequestParser()
+ self.rc = ResponseComposer(timeout=self.timeout)
+
+ self.conn_socket.settimeout(self.timeout)
+
+ try:
+ while not self.done:
+ data = self.conn_socket.recv(32)
+ if len(data) == 0:
+ break
+ self.handle_data(data)
+ except socket.timeout:
+ logging.debug('%s connection timed out.' % self.addr[0])
+ finally:
+ self.conn_socket.shutdown(socket.SHUT_RDWR)
+ self.conn_socket.close()
+ logging.debug('%s connection closed.' % self.addr[0])
+
+ def handle_data(self, data):
+ for req in self.rp.parse_requests(data):
+ logging.info("<-- (%s) %s" % (self.addr[0], req.startline()))
+ resp = self.rc.compose_response(req)
+ logging.info("--> (%s) %s" % (self.addr[0], resp.startline()))
+ self.send(resp)
+
+ if resp.get_header('Connection') == 'close':
+ self.done = True
+ return
+
+ def send(self, data):
+ sent = self.conn_socket.send(str(data))
+ if sent == 0:
+ raise RuntimeError('Socket broken')
+
+ def run(self):
+ """Run the thread of the connection handler"""
+ try:
+ self.handle_connection()
+ except socket.error, e:
+ logging.error('Error in handling connection with %s: %s' %
+ (self.addr[0], str(e)))
+
+
+class Server:
+ """HTTP Server"""
+
+ def __init__(self, configfile, **kwargs):
+ """Initialize the HTTP server
+
+ Args:
+ hostname (str): hostname of the server
+ server_port (int): port that the server is listening on
+ timeout (int): seconds until timeout
+ """
+ self.read_config(configfile, **kwargs)
+ self.done = False
+
+ def read_config(self, configfile, **kwargs):
+ config().read(configfile)
+
+ if not config().has_section('webhttp'):
+ config().add_section('webhttp')
+
+ for name, val in kwargs.items():
+ if val != None:
+ config().set('webhttp', name, str(val))
+
+ def run(self):
+ """Run the HTTP Server and start listening"""
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.socket.bind((config('hostname', default='localhost'),
+ config('port', type=int, default=8001)))
+ self.socket.listen(config('max_connections', type=int, default=1000))
+ while not self.done:
+ (csocket, addr) = self.socket.accept()
+ logging.debug('%s connection accepted.' % addr[0])
+ ch = ConnectionHandler(csocket, addr, config('timeout', type=int))
+ ch.start()
+
+ def shutdown(self):
+ """Safely shut down the HTTP server"""
+ self.socket.shutdown(socket.SHUT_RDWR)
+ self.socket.close()
+ self.done = True
+