Fix redirect HTTP method handling (#3577)

Authored by: coletdjnz
This commit is contained in:
coletdev 2022-05-02 15:40:26 +12:00 committed by GitHub
parent b4f536626a
commit afac4caa7d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1587,9 +1587,21 @@ def redirect_request(self, req, fp, code, msg, headers, newurl):
CONTENT_HEADERS = ("content-length", "content-type") CONTENT_HEADERS = ("content-length", "content-type")
# NB: don't use dict comprehension for python 2.6 compatibility # NB: don't use dict comprehension for python 2.6 compatibility
newheaders = {k: v for k, v in req.headers.items() if k.lower() not in CONTENT_HEADERS} newheaders = {k: v for k, v in req.headers.items() if k.lower() not in CONTENT_HEADERS}
# A 303 must either use GET or HEAD for subsequent request
# https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.4
if code == 303 and m != 'HEAD':
m = 'GET'
# 301 and 302 redirects are commonly turned into a GET from a POST
# for subsequent requests by browsers, so we'll do the same.
# https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.2
# https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.3
if code in (301, 302) and m == 'POST':
m = 'GET'
return compat_urllib_request.Request( return compat_urllib_request.Request(
newurl, headers=newheaders, origin_req_host=req.origin_req_host, newurl, headers=newheaders, origin_req_host=req.origin_req_host,
unverifiable=True) unverifiable=True, method=m)
def extract_timezone(date_str): def extract_timezone(date_str):