diff options
Diffstat (limited to 'project1/proj1_s4498062/webhttp/composer.py')
-rw-r--r-- | project1/proj1_s4498062/webhttp/composer.py | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/project1/proj1_s4498062/webhttp/composer.py b/project1/proj1_s4498062/webhttp/composer.py index f9bc0e0..1c61628 100644 --- a/project1/proj1_s4498062/webhttp/composer.py +++ b/project1/proj1_s4498062/webhttp/composer.py @@ -8,6 +8,7 @@ import re import time
from config import config
+import encodings
from message import Response
from resource import Resource, FileExistError, FileAccessError
import weblogging as logging
@@ -44,34 +45,47 @@ class ResponseComposer: return self.serve(request.uri, request=request)
- def serve(self, uri, code=200, etag=None, request=None, error_page=False):
- response = Response()
+ def serve(self, uri, code=200, etag=None, request=None):
+ resp = Response()
try:
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
+ resp.code = 304
else:
- response.code = code
- response.body = resource.get_content()
- response.set_header('ETag', resource.generate_etag())
- response.set_header('Connection', 'close')
- response.set_header('Content-Type', resource.get_content_type())
- response.set_content_length()
+ resp.code = code
+ resp.body = None
+ encs = req.encodings() if req != None else [encodings.IDENTITY]
+ for enc in encs:
+ try:
+ resp.body = resource.get_content(enc)
+ resp.set_header('Content-Encoding', encodings.str(enc))
+ break
+ except UnknownEncodingError:
+ pass
+ if resp.body == None:
+ return self.serve_error(406)
+ resp.set_header('ETag', resource.generate_etag())
+ resp.set_header('Connection', 'close')
+ resp.set_header('Content-Type', resource.get_content_type())
+ resp.set_content_length()
except FileExistError:
- if not error_page:
- return self.serve(config('error404'), code=404, error_page=True)
+ if code < 400:
+ return self.serve_error(404)
else:
- response.code = code
- response.set_header('Connection', 'close')
- response.body = 'Error %d' % code
- response.set_content_length()
+ resp.code = code
+ resp.set_header('Connection', 'close')
+ resp.body = 'Error %d' % code
+ resp.set_content_length()
except FileAccessError:
- return self.serve(config('error403'), code=403, error_page=True)
+ return self.serve_error(403)
+
+ return resp
- return response
+ def serve_error(self, code):
+ return self.serve(config('error%d' % code, default=None), code=code)
def make_date_string(self):
"""Make string of date and time
|