diff options
author | ianb <devnull@localhost> | 2007-04-17 21:12:31 +0000 |
---|---|---|
committer | ianb <devnull@localhost> | 2007-04-17 21:12:31 +0000 |
commit | dbfc6fff608542c540ff8ec9511eb55ed7a787f5 (patch) | |
tree | 822f6816ed62f73da1b3e8f86e8d424f55671ae5 /paste | |
parent | d9c0501a75e6473127b7886a42eb4a94d22aa632 (diff) | |
download | paste-dbfc6fff608542c540ff8ec9511eb55ed7a787f5.tar.gz |
Fix case with continuation headers
Diffstat (limited to 'paste')
-rw-r--r-- | paste/proxy.py | 43 |
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'): """ |