better rocket parsing, support for multiline headers

This commit is contained in:
mdipierro
2012-09-29 18:39:53 -05:00
parent 57ad1ec1cf
commit 07c667f469
2 changed files with 17 additions and 21 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.0.9 (2012-09-29 18:35:01) dev Version 2.0.9 (2012-09-29 18:39:44) dev
+16 -20
View File
@@ -1457,33 +1457,29 @@ class Worker(Thread):
def read_headers(self, sock_file): def read_headers(self, sock_file):
try: try:
headers = dict() headers = dict()
l = sock_file.readline() lname = lval = ''
lname = None
lval = None
while True: while True:
line = sock_file.readline()
if PY3K: if PY3K:
try: try:
l = str(l, 'ISO-8859-1') line = str(line, 'ISO-8859-1')
except UnicodeDecodeError: except UnicodeDecodeError:
self.err_log.warning('Client sent invalid header: ' + repr(l)) self.err_log.warning('Client sent invalid header: ' + repr(line))
if line == '\r\n':
if l.strip() == '': if lname: headers[str(lname)] = str(lval)
break break
elif line.strip() == '' or '\0' in line:
if l[0] in ' \t' and lname: raise BadRequest("Empty line in hader")
elif line[0] in ' \t' and lname:
# Some headers take more than one line # Some headers take more than one line
lval += ',' + l.strip() lval += ' ' + line.strip()
else: elif ':' in line:
# HTTP header values are latin-1 encoded if lname: headers[str(lname)] = str(lval)
l = l.split(':', 1) lname, lval = line.split(':', 1)
# HTTP header names are us-ascii encoded # HTTP header names are us-ascii encoded
lname = lname.strip().upper().replace('-', '_')
lname = l[0].strip().upper().replace('-', '_') # HTTP header values are latin-1 encoded
lval = l[-1].strip() lval = lval.strip()
headers[str(lname)] = str(lval)
l = sock_file.readline()
except socket.timeout: except socket.timeout:
raise SocketTimeout("Socket timed out before request.") raise SocketTimeout("Socket timed out before request.")