mirror of
https://github.com/python/cpython.git
synced 2024-12-01 13:55:45 +08:00
bpo-40321: Support HTTP response status code 308 in urllib.request (#19588)
* Support HTTP response status code 308 in urllib. HTTP response status code 308 is defined in https://tools.ietf.org/html/rfc7538 to be the permanent redirect variant of 307 (temporary redirect). * Update documentation to include http_error_308() * Add blurb for bpo-40321 fix Co-authored-by: Roland Crosby <roland@rolandcrosby.com>
This commit is contained in:
parent
241bda785a
commit
c379bc5ec9
@ -879,6 +879,12 @@ HTTPRedirectHandler Objects
|
||||
response.
|
||||
|
||||
|
||||
.. method:: HTTPRedirectHandler.http_error_308(req, fp, code, msg, hdrs)
|
||||
|
||||
The same as :meth:`http_error_301`, but called for the 'permanent redirect'
|
||||
response.
|
||||
|
||||
|
||||
.. _http-cookie-processor:
|
||||
|
||||
HTTPCookieProcessor Objects
|
||||
|
@ -11,8 +11,8 @@ option. The OpenerDirector is a composite object that invokes the
|
||||
Handlers needed to open the requested URL. For example, the
|
||||
HTTPHandler performs HTTP GET and POST requests and deals with
|
||||
non-error returns. The HTTPRedirectHandler automatically deals with
|
||||
HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler
|
||||
deals with digest authentication.
|
||||
HTTP 301, 302, 303, 307 and 308 redirect errors, and the
|
||||
HTTPDigestAuthHandler deals with digest authentication.
|
||||
|
||||
urlopen(url, data=None) -- Basic usage is the same as original
|
||||
urllib. pass the url and optionally data to post to an HTTP URL, and
|
||||
@ -661,7 +661,7 @@ class HTTPRedirectHandler(BaseHandler):
|
||||
but another Handler might.
|
||||
"""
|
||||
m = req.get_method()
|
||||
if (not (code in (301, 302, 303, 307) and m in ("GET", "HEAD")
|
||||
if (not (code in (301, 302, 303, 307, 308) and m in ("GET", "HEAD")
|
||||
or code in (301, 302, 303) and m == "POST")):
|
||||
raise HTTPError(req.full_url, code, msg, headers, fp)
|
||||
|
||||
@ -748,7 +748,7 @@ class HTTPRedirectHandler(BaseHandler):
|
||||
|
||||
return self.parent.open(new, timeout=req.timeout)
|
||||
|
||||
http_error_301 = http_error_303 = http_error_307 = http_error_302
|
||||
http_error_301 = http_error_303 = http_error_307 = http_error_308 = http_error_302
|
||||
|
||||
inf_msg = "The HTTP server returned a redirect error that would " \
|
||||
"lead to an infinite loop.\n" \
|
||||
@ -2211,6 +2211,13 @@ class FancyURLopener(URLopener):
|
||||
else:
|
||||
return self.http_error_default(url, fp, errcode, errmsg, headers)
|
||||
|
||||
def http_error_308(self, url, fp, errcode, errmsg, headers, data=None):
|
||||
"""Error 308 -- relocated, but turn POST into error."""
|
||||
if data is None:
|
||||
return self.http_error_301(url, fp, errcode, errmsg, headers, data)
|
||||
else:
|
||||
return self.http_error_default(url, fp, errcode, errmsg, headers)
|
||||
|
||||
def http_error_401(self, url, fp, errcode, errmsg, headers, data=None,
|
||||
retry=False):
|
||||
"""Error 401 -- authentication required.
|
||||
|
@ -0,0 +1,2 @@
|
||||
Adds support for HTTP 308 redirects to :mod:`urllib`. Patch by Jochem
|
||||
Schulenklopper.
|
Loading…
Reference in New Issue
Block a user