summaryrefslogtreecommitdiff
path: root/paste/proxy.py
diff options
context:
space:
mode:
authorianb <devnull@localhost>2007-04-17 21:12:31 +0000
committerianb <devnull@localhost>2007-04-17 21:12:31 +0000
commitdbfc6fff608542c540ff8ec9511eb55ed7a787f5 (patch)
tree822f6816ed62f73da1b3e8f86e8d424f55671ae5 /paste/proxy.py
parentd9c0501a75e6473127b7886a42eb4a94d22aa632 (diff)
downloadpaste-dbfc6fff608542c540ff8ec9511eb55ed7a787f5.tar.gz
Fix case with continuation headers
Diffstat (limited to 'paste/proxy.py')
-rw-r--r--paste/proxy.py43
1 files changed, 30 insertions, 13 deletions
diff --git a/paste/proxy.py b/paste/proxy.py
index 1fa38c3..faed5a7 100644
--- a/paste/proxy.py
+++ b/paste/proxy.py
@@ -102,13 +102,8 @@ class Proxy(object):
path,
body, headers)
res = conn.getresponse()
- headers_out = []
- for full_header in res.msg.headers:
- header, value = full_header.split(':', 1)
- value = value.strip()
- if header.lower() not in filtered_headers:
- headers_out.append((header, value))
-
+ headers_out = parse_headers(res.msg)
+
status = '%s %s' % (res.status, res.reason)
start_response(status, headers_out)
# @@: Default?
@@ -221,12 +216,7 @@ class TransparentProxy(object):
conn.request(environ['REQUEST_METHOD'],
path, body, headers)
res = conn.getresponse()
- headers_out = []
- for full_header in res.msg.headers:
- header, value = full_header.split(':', 1)
- value = value.strip()
- if header.lower() not in filtered_headers:
- headers_out.append((header, value))
+ headers_out = parse_headers(res.msg)
status = '%s %s' % (res.status, res.reason)
start_response(status, headers_out)
@@ -239,6 +229,33 @@ class TransparentProxy(object):
conn.close()
return [body]
+def parse_headers(message):
+ """
+ Turn a Message object into a list of WSGI-style headers.
+ """
+ headers_out = []
+ for full_header in message.headers:
+ if not full_header:
+ # Shouldn't happen, but we'll just ignore
+ continue
+ if full_header[0].isspace():
+ # Continuation line, add to the last header
+ if not headers_out:
+ raise ValueError(
+ "First header starts with a space (%r)" % full_header)
+ last_header, last_value = headers_out.pop()
+ value = last_value + ' ' + full_header.strip()
+ headers_out.append((last_header, value))
+ continue
+ try:
+ header, value = full_header.split(':', 1)
+ except:
+ raise ValueError("Invalid header: %r" % full_header)
+ value = value.strip()
+ if header.lower() not in filtered_headers:
+ headers_out.append((header, value))
+ return headers_out
+
def make_transparent_proxy(
global_conf, force_host=None, force_scheme='http'):
"""