diff options
-rwxr-xr-x | paste/httpserver.py | 15 | ||||
-rw-r--r-- | tests/test_httpserver.py | 45 |
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' |