diff --git a/eventlet/httpc.py b/eventlet/httpc.py index 411c571..e0621d7 100644 --- a/eventlet/httpc.py +++ b/eventlet/httpc.py @@ -279,6 +279,11 @@ class NotModified(ConnectionError): """ 304 Not Modified """ pass + +class TemporaryRedirect(Retriable): + """ 307 Temporary Redirect """ + pass + class BadRequest(ConnectionError): """ 400 Bad Request """ @@ -311,6 +316,7 @@ status_to_error_map = { 302: Found, 303: SeeOther, 304: NotModified, + 307: TemporaryRedirect, 400: BadRequest, 403: Forbidden, 404: NotFound, diff --git a/eventlet/httpc_test.py b/eventlet/httpc_test.py index 50cdbb4..a8f4ecb 100644 --- a/eventlet/httpc_test.py +++ b/eventlet/httpc_test.py @@ -211,15 +211,21 @@ class TestHttpc(TestBase, tests.TestCase): lambda: httpc.delete(self.base_url() + 'b0gu5')) -class Site301(BasicSite): +class RedirectSite(BasicSite): + response_code = 301 + def handle_request(self, req): if req.path().startswith('/redirect/'): url = ('http://' + req.get_header('host') + req.uri().replace('/redirect/', '/')) - req.response(301, headers={'location': url}, body='') + req.response(self.response_code, headers={'location': url}, + body='') return return Site.handle_request(self, req) +class Site301(RedirectSite): + pass + class Site302(BasicSite): def handle_request(self, req): @@ -239,14 +245,12 @@ class Site302(BasicSite): return Site.handle_request(self, req) -class Site303(BasicSite): - def handle_request(self, req): - if req.path().startswith('/redirect/'): - url = ('http://' + req.get_header('host') + - req.uri().replace('/redirect/', '/')) - req.response(303, headers={'location': url}, body='') - return - return Site.handle_request(self, req) +class Site303(RedirectSite): + response_code = 303 + + +class Site307(RedirectSite): + response_code = 307 class TestHttpc301(TestBase, tests.TestCase): @@ -309,5 +313,21 @@ class TestHttpc303(TestBase, tests.TestCase): self.assertEquals(response, data) +class TestHttpc307(TestBase, tests.TestCase): + site_class = Site307 + + def base_url(self): + return 'http://localhost:31337/redirect/' + + def test_post(self): + data = 'hello world' + try: + response = httpc.post(self.base_url() + 'hello', data=data) + self.assert_(False) + except httpc.TemporaryRedirect, err: + response = err.retry() + self.assertEquals(response, data) + + if __name__ == '__main__': tests.main()