summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xpaste/httpserver.py15
-rw-r--r--tests/test_httpserver.py45
2 files changed, 59 insertions, 1 deletions
diff --git a/paste/httpserver.py b/paste/httpserver.py
index 6b4fea7..179e526 100755
--- a/paste/httpserver.py
+++ b/paste/httpserver.py
@@ -42,6 +42,19 @@ except ImportError:
__all__ = ['WSGIHandlerMixin', 'WSGIServer', 'WSGIHandler', 'serve']
__version__ = "0.5"
+
+def _get_headers(headers, k):
+ """
+ Private function for abstracting differences in getting HTTP request
+ headers on Python 2 vs. Python 3
+ """
+
+ if hasattr(headers, 'get_all'):
+ return headers.get_all(k) # Python 3 - email.message.Message
+ else:
+ return headers.getheaders(k) # Python 2 - mimetools.Message
+
+
class ContinueHook(object):
"""
When a client request includes a 'Expect: 100-continue' header, then
@@ -256,7 +269,7 @@ class WSGIHandlerMixin:
key = 'HTTP_' + k.replace("-","_").upper()
if key in ('HTTP_CONTENT_TYPE','HTTP_CONTENT_LENGTH'):
continue
- self.wsgi_environ[key] = ','.join(self.headers.get(k))
+ self.wsgi_environ[key] = ','.join(_get_headers(self.headers, k))
if hasattr(self.connection,'get_context'):
self.wsgi_environ['wsgi.url_scheme'] = 'https'
diff --git a/tests/test_httpserver.py b/tests/test_httpserver.py
new file mode 100644
index 0000000..3d72c79
--- /dev/null
+++ b/tests/test_httpserver.py
@@ -0,0 +1,45 @@
+import email
+
+from paste.httpserver import WSGIHandler
+from six.moves import StringIO
+
+
+class MockServer(object):
+ server_address = ('127.0.0.1', 80)
+
+
+class MockSocket(object):
+ def makefile(self, mode, bufsize):
+ return StringIO()
+
+
+def test_environ():
+ mock_socket = MockSocket()
+ mock_client_address = '1.2.3.4'
+ mock_server = MockServer()
+
+ wsgi_handler = WSGIHandler(mock_socket, mock_client_address, mock_server)
+ wsgi_handler.command = 'GET'
+ wsgi_handler.path = '/path'
+ wsgi_handler.request_version = 'HTTP/1.0'
+ wsgi_handler.headers = email.message_from_string('Host: mywebsite')
+
+ wsgi_handler.wsgi_setup()
+
+ assert wsgi_handler.wsgi_environ['HTTP_HOST'] == 'mywebsite'
+
+
+def test_environ_with_multiple_values():
+ mock_socket = MockSocket()
+ mock_client_address = '1.2.3.4'
+ mock_server = MockServer()
+
+ wsgi_handler = WSGIHandler(mock_socket, mock_client_address, mock_server)
+ wsgi_handler.command = 'GET'
+ wsgi_handler.path = '/path'
+ wsgi_handler.request_version = 'HTTP/1.0'
+ wsgi_handler.headers = email.message_from_string('Host: host1\nHost: host2')
+
+ wsgi_handler.wsgi_setup()
+
+ assert wsgi_handler.wsgi_environ['HTTP_HOST'] == 'host1,host2'