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 | |
| parent | d9c0501a75e6473127b7886a42eb4a94d22aa632 (diff) | |
| download | paste-dbfc6fff608542c540ff8ec9511eb55ed7a787f5.tar.gz | |
Fix case with continuation headers
| -rw-r--r-- | docs/news.txt | 3 | ||||
| -rw-r--r-- | paste/proxy.py | 43 |
2 files changed, 33 insertions, 13 deletions
diff --git a/docs/news.txt b/docs/news.txt index 347f963..14ceec0 100644 --- a/docs/news.txt +++ b/docs/news.txt @@ -37,6 +37,9 @@ svn trunk * Remove port from ``paste.request.construct_url`` if it's the default port (e.g., port 80 for ``http``). +* ``paste.proxy`` works with headers with continuations in the + response (i.e., a header that spans multiple lines). + 1.3 --- 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'): """ |
