summaryrefslogtreecommitdiff
path: root/project1/proj1_s4498062/webhttp/composer.py
diff options
context:
space:
mode:
authorCamil Staps2016-03-04 23:09:53 +0100
committerCamil Staps2016-03-04 23:10:12 +0100
commit5372ebb8be5a5e6669129b6dc78fa6f333b6e186 (patch)
tree37e96eeb9749a3f9cfae44082d72514f49785156 /project1/proj1_s4498062/webhttp/composer.py
parentProject one until step 8 in the readme (diff)
Project 1: Config system; ETags; error pages
Diffstat (limited to 'project1/proj1_s4498062/webhttp/composer.py')
-rw-r--r--project1/proj1_s4498062/webhttp/composer.py54
1 files changed, 37 insertions, 17 deletions
diff --git a/project1/proj1_s4498062/webhttp/composer.py b/project1/proj1_s4498062/webhttp/composer.py
index 5123d31..f9bc0e0 100644
--- a/project1/proj1_s4498062/webhttp/composer.py
+++ b/project1/proj1_s4498062/webhttp/composer.py
@@ -4,11 +4,13 @@ This module contains a composer, which can compose responses to
HTTP requests from a client.
"""
+import re
import time
-import webhttp.message
-from webhttp.resource import Resource, FileExistError, FileAccessError
-import webhttp.weblogging as logging
+from config import config
+from message import Response
+from resource import Resource, FileExistError, FileAccessError
+import weblogging as logging
class ResponseComposer:
"""Class that composes a HTTP response to a HTTP request"""
@@ -31,25 +33,43 @@ class ResponseComposer:
webhttp.Response: response to request
"""
- response = webhttp.message.Response()
+ response = Response()
- # Stub code
+ if re.search(r'\/\.\.?(\/|$)', request.uri):
+ response.code = 403
+ response.set_header('Connection', 'close')
+ response.body = 'Don\'t even think about it.'
+ response.set_content_length()
+ return response
+
+ return self.serve(request.uri, request=request)
+
+ def serve(self, uri, code=200, etag=None, request=None, error_page=False):
+ response = Response()
try:
- resource = Resource(request.uri)
- response.code = 200
- response.set_header('Content-Length', resource.get_content_length())
+ resource = Resource(uri)
+ req = request
+ if req != None and (
+ resource.etag_match(req.get_header('If-None-Match')) or \
+ not resource.etag_match(req.get_header('If-Match') or '*')):
+ response.code = 304
+ else:
+ response.code = code
+ response.body = resource.get_content()
+ response.set_header('ETag', resource.generate_etag())
response.set_header('Connection', 'close')
- response.body = resource.get_content()
+ response.set_header('Content-Type', resource.get_content_type())
+ response.set_content_length()
except FileExistError:
- response.code = 404
- response.set_header("Content-Length", 9)
- response.set_header("Connection", "close")
- response.body = "Not found"
+ if not error_page:
+ return self.serve(config('error404'), code=404, error_page=True)
+ else:
+ response.code = code
+ response.set_header('Connection', 'close')
+ response.body = 'Error %d' % code
+ response.set_content_length()
except FileAccessError:
- response.code = 403
- response.set_header("Content-Length", 13)
- response.set_header("Connection", "close")
- response.body = "Access denied"
+ return self.serve(config('error403'), code=403, error_page=True)
return response