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/message.py | 41 ++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'project1/proj1_s4498062/webhttp/message.py') diff --git a/project1/proj1_s4498062/webhttp/message.py b/project1/proj1_s4498062/webhttp/message.py index 059c765..2e1a962 100644 --- a/project1/proj1_s4498062/webhttp/message.py +++ b/project1/proj1_s4498062/webhttp/message.py @@ -5,6 +5,7 @@ This modules contains classes for representing HTTP responses and requests. import re +import encodings import regexes as r import weblogging as logging @@ -101,8 +102,7 @@ class Message(object): msg = '' msg += '%s\r\n' % self.startline() msg += '\r\n'.join([k + ": " + v for k, v in self.headers.iteritems()]) - msg += '\r\n\r\n' - msg += self.body + msg += '\r\n\r\n' + self.body return msg def __eq__(self, other): @@ -126,6 +126,38 @@ class Request(Message): [headers, body] = rest.split('\r\n\r\n', 1) self.parse_headers(headers) self.body = body + + def encodings(self): + requested = self.get_header('Accept-Encoding') + if requested == None: + return encodings.all + + encs = [] + requested = re.split(r.EncodingSplit, requested) + for value in requested: + try: + match = re.match(r.AcceptEncodingValue, value) + if match == None: + return [encodings.IDENTITY] + enc, q = match.groups() + # Unclear what should happen when some qvalues are omitted + q = q or '0.001' + if enc == '*': + for enc in encodings.all: + encs.append((encodings.get(enc), float(q))) + else: + encs.append((encodings.get(enc), float(q))) + except encodings.UnknownEncodingError: + pass + + rejected = [e[0] for e in encs if e[1] == 0] + accepted = [e for e in encs if e[1] != 0] + + if not encodings.IDENTITY in rejected + [a[0] for a in accepted]: + accepted.append((encodings.IDENTITY, 0.001)) + + accepted.sort(key=lambda x:x[1], reverse=True) + return [a[0] for a in accepted] def startline(self): return "%s %s %s" % (self.method, self.uri, self.version) @@ -145,6 +177,7 @@ class Response(Message): def __init__(self): """Initialize the Response""" super(Response, self).__init__() + self.set_header('Server', 'WebPy') def parse(self, msg): [respline, rest] = msg.split('\r\n', 1) @@ -161,6 +194,10 @@ class Response(Message): def set_content_length(self): self.set_header('Content-Length', len(self.body)) + + def decompress(self): + self.body = encodings.decode( + self.get_header('Content-Encoding'), self.body) def __str__(self): """Convert the Response to a string -- cgit v1.2.3