summaryrefslogtreecommitdiff
path: root/project1/proj1_s4498062/webhttp/message.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/message.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/message.py')
-rw-r--r--project1/proj1_s4498062/webhttp/message.py41
1 files changed, 39 insertions, 2 deletions
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