diff --git a/netlib/http/request.py b/netlib/http/request.py index 6406a9804..67aa17cee 100644 --- a/netlib/http/request.py +++ b/netlib/http/request.py @@ -162,7 +162,7 @@ class Request(Message): def path(self): """ HTTP request path, e.g. "/index.html". - Guaranteed to start with a slash. + Guaranteed to start with a slash, except for OPTIONS requests, which may just be "*". """ if self.data.path is None: return None diff --git a/netlib/utils.py b/netlib/utils.py index dda768086..ebd192f3f 100644 --- a/netlib/utils.py +++ b/netlib/utils.py @@ -330,6 +330,8 @@ def unparse_url(scheme, host, port, path=""): Args: All args must be str. """ + if path == "*": + path = "" return "%s://%s%s" % (scheme, hostport(scheme, host, port), path) diff --git a/test/netlib/http/test_request.py b/test/netlib/http/test_request.py index 50ad2d058..91fd8ce33 100644 --- a/test/netlib/http/test_request.py +++ b/test/netlib/http/test_request.py @@ -107,6 +107,14 @@ class TestRequestUtils(object): with raises(ValueError): request.url = "not-a-url" + def test_url_options(self): + request = treq(method="OPTIONS", path="*") + assert request.url == "http://address:22" + + def test_url_authority(self): + request = treq(first_line_format="authority") + assert request.url == "address:22" + def test_pretty_host(self): request = treq() # Without host header @@ -140,6 +148,10 @@ class TestRequestUtils(object): request.headers["host"] = "other" assert request.pretty_url == "http://address:22/path" + def test_pretty_url_options(self): + request = treq(method="OPTIONS", path="*") + assert request.pretty_url == "http://address:22" + def test_pretty_url_authority(self): request = treq(first_line_format="authority") assert request.pretty_url == "address:22"