From 5372ebb8be5a5e6669129b6dc78fa6f333b6e186 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Fri, 4 Mar 2016 23:09:53 +0100 Subject: Project 1: Config system; ETags; error pages --- project1/proj1_s4498062/webhttp/composer.py | 54 ++++++++++++++++++++--------- 1 file changed, 37 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 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 -- cgit v1.2.3