summaryrefslogtreecommitdiff
path: root/project1/proj1_s4498062/webhttp
diff options
context:
space:
mode:
Diffstat (limited to 'project1/proj1_s4498062/webhttp')
-rw-r--r--project1/proj1_s4498062/webhttp/composer.py6
-rw-r--r--project1/proj1_s4498062/webhttp/server.py24
-rw-r--r--project1/proj1_s4498062/webhttp/weblogging.py10
3 files changed, 30 insertions, 10 deletions
diff --git a/project1/proj1_s4498062/webhttp/composer.py b/project1/proj1_s4498062/webhttp/composer.py
index 1c61628..9e29e6c 100644
--- a/project1/proj1_s4498062/webhttp/composer.py
+++ b/project1/proj1_s4498062/webhttp/composer.py
@@ -38,7 +38,7 @@ class ResponseComposer:
if re.search(r'\/\.\.?(\/|$)', request.uri):
response.code = 403
- response.set_header('Connection', 'close')
+ response.set_header('Connection', 'keep-alive')
response.body = 'Don\'t even think about it.'
response.set_content_length()
return response
@@ -68,7 +68,7 @@ class ResponseComposer:
if resp.body == None:
return self.serve_error(406)
resp.set_header('ETag', resource.generate_etag())
- resp.set_header('Connection', 'close')
+ resp.set_header('Connection', 'keep-alive')
resp.set_header('Content-Type', resource.get_content_type())
resp.set_content_length()
except FileExistError:
@@ -76,7 +76,7 @@ class ResponseComposer:
return self.serve_error(404)
else:
resp.code = code
- resp.set_header('Connection', 'close')
+ resp.set_header('Connection', 'keep-alive')
resp.body = 'Error %d' % code
resp.set_content_length()
except FileAccessError:
diff --git a/project1/proj1_s4498062/webhttp/server.py b/project1/proj1_s4498062/webhttp/server.py
index 7eeec27..f400978 100644
--- a/project1/proj1_s4498062/webhttp/server.py
+++ b/project1/proj1_s4498062/webhttp/server.py
@@ -33,13 +33,22 @@ class ConnectionHandler(threading.Thread):
self.rp = RequestParser()
self.rc = ResponseComposer(timeout=self.timeout)
- while True:
- data = self.conn_socket.recv(4096)
- if len(data) == 0:
- break
- self.handle_data(data)
+ self.conn_socket.settimeout(self.timeout)
- self.conn_socket.close()
+ # TODO: should not be persistent when client sends Connection: close
+ # or can we safely assume that in this case the client will close the
+ # transport channel, so that recv() returns something empty?
+ try:
+ while True:
+ data = self.conn_socket.recv(4096)
+ if len(data) == 0:
+ break
+ self.handle_data(data)
+ except socket.timeout:
+ logging.debug('Connection to %s timed out.' % self.addr[0])
+ finally:
+ self.conn_socket.close()
+ logging.debug('Connection to %s closed.' % self.addr[0])
def handle_data(self, data):
for req in self.rp.parse_requests(data):
@@ -58,7 +67,8 @@ class ConnectionHandler(threading.Thread):
try:
self.handle_connection()
except socket.error, e:
- print('ERR ' + str(e))
+ logging.error('Error in handling connection with %s: %s' %
+ (self.addr[0], str(e)))
class Server:
diff --git a/project1/proj1_s4498062/webhttp/weblogging.py b/project1/proj1_s4498062/webhttp/weblogging.py
index d1792a3..1bd84a1 100644
--- a/project1/proj1_s4498062/webhttp/weblogging.py
+++ b/project1/proj1_s4498062/webhttp/weblogging.py
@@ -7,3 +7,13 @@ def debug(msg, *args, **kwargs):
def info(msg, *args, **kwargs):
logging.getLogger(name).info(str(msg), *args, **kwargs)
+
+def warning(msg, *args, **kwargs):
+ logging.getLogger(name).warning(str(msg), *args, **kwargs)
+
+def error(msg, *args, **kwargs):
+ logging.getLogger(name).error(str(msg), *args, **kwargs)
+
+def critical(msg, *args, **kwargs):
+ logging.getLogger(name).critical(str(msg), *args, **kwargs)
+