From 804ae3b864e1fe47ea38ac1a2283019387c33ac0 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Sat, 5 Mar 2016 10:25:03 +0100 Subject: Step 11: content encoding (only gzip for the moment) --- project1/proj1_s4498062/webhttp/composer.py | 48 +++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'project1/proj1_s4498062/webhttp/composer.py') 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 -- cgit v1.2.3