From 7ed2ab44d5328f6ac2053160d4d8abe847ef8dbc Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 16 Mar 2016 22:41:42 +0100 Subject: Project 1: started with persistent connections --- project1/proj1_s4498062/webhttp/composer.py | 6 +++--- project1/proj1_s4498062/webhttp/server.py | 24 +++++++++++++++++------- project1/proj1_s4498062/webhttp/weblogging.py | 10 ++++++++++ 3 files changed, 30 insertions(+), 10 deletions(-) (limited to 'project1') 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) + -- cgit v1.2.3