From e50c61bc866ff4358e6ef320b4f1f31b979bd45e Mon Sep 17 00:00:00 2001 From: Nate Prewitt Date: Wed, 10 Aug 2016 11:02:26 -0600 Subject: [PATCH] removing Content-Type and Transfer-Encoding headers on redirect --- requests/sessions.py | 7 ++++--- tests/test_requests.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/requests/sessions.py b/requests/sessions.py index 8d8d9105..bcbcc880 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -140,9 +140,10 @@ class SessionRedirectMixin(object): # https://github.com/kennethreitz/requests/issues/1084 if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - if 'Content-Length' in prepared_request.headers: - del prepared_request.headers['Content-Length'] - + # https://github.com/kennethreitz/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) prepared_request.body = None headers = prepared_request.headers diff --git a/tests/test_requests.py b/tests/test_requests.py index efbc7ed0..3f791334 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -221,6 +221,41 @@ class TestRequests: assert r.history[0].status_code == 303 assert r.history[0].is_redirect + def test_header_and_body_removal_on_redirect(self, httpbin): + purged_headers = ('Content-Length', 'Content-Type') + ses = requests.Session() + req = requests.Request('POST', httpbin('post'), data={'test': 'data'}) + prep = ses.prepare_request(req) + resp = ses.send(prep) + + # Mimic a redirect response + resp.status_code = 302 + resp.headers['location'] = 'get' + + # Run request through resolve_redirects + next_resp = next(ses.resolve_redirects(resp, prep)) + assert next_resp.request.body is None + for header in purged_headers: + assert header not in next_resp.request.headers + + def test_transfer_enc_removal_on_redirect(self, httpbin): + purged_headers = ('Transfer-Encoding', 'Content-Type') + ses = requests.Session() + req = requests.Request('POST', httpbin('post'), data=(b'x' for x in range(1))) + prep = ses.prepare_request(req) + assert 'Transfer-Encoding' in prep.headers + resp = ses.send(prep) + + # Mimic a redirect response + resp.status_code = 302 + resp.headers['location'] = 'get' + + # Run request through resolve_redirect + next_resp = next(ses.resolve_redirects(resp, prep)) + assert next_resp.request.body is None + for header in purged_headers: + assert header not in next_resp.request.headers + def test_HTTP_200_OK_GET_WITH_PARAMS(self, httpbin): heads = {'User-agent': 'Mozilla/5.0'}