summaryrefslogtreecommitdiff
path: root/project1/proj1_s4498062/webhttp/composer.py
diff options
context:
space:
mode:
authorCamil Staps2016-03-05 10:25:03 +0100
committerCamil Staps2016-03-05 10:25:03 +0100
commit804ae3b864e1fe47ea38ac1a2283019387c33ac0 (patch)
tree043122a7497dd162b1bcecc548eb723307d99f5e /project1/proj1_s4498062/webhttp/composer.py
parentProject 1: Config system; ETags; error pages (diff)
Step 11: content encoding (only gzip for the moment)
Diffstat (limited to 'project1/proj1_s4498062/webhttp/composer.py')
-rw-r--r--project1/proj1_s4498062/webhttp/composer.py48
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