diff options
Diffstat (limited to 'project1/proj1_s4498062/webhttp/composer.py')
-rw-r--r-- | project1/proj1_s4498062/webhttp/composer.py | 54 |
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
|