bpo-40321: Support HTTP response status code 308 in urllib.request (#… · python/cpython@c379bc5 (original) (raw)

`@@ -11,8 +11,8 @@

`

11

11

`Handlers needed to open the requested URL. For example, the

`

12

12

`HTTPHandler performs HTTP GET and POST requests and deals with

`

13

13

`non-error returns. The HTTPRedirectHandler automatically deals with

`

14

``

`-

HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler

`

15

``

`-

deals with digest authentication.

`

``

14

`+

HTTP 301, 302, 303, 307 and 308 redirect errors, and the

`

``

15

`+

HTTPDigestAuthHandler deals with digest authentication.

`

16

16

``

17

17

`urlopen(url, data=None) -- Basic usage is the same as original

`

18

18

`urllib. pass the url and optionally data to post to an HTTP URL, and

`

`@@ -661,7 +661,7 @@ def redirect_request(self, req, fp, code, msg, headers, newurl):

`

661

661

` but another Handler might.

`

662

662

` """

`

663

663

`m = req.get_method()

`

664

``

`-

if (not (code in (301, 302, 303, 307) and m in ("GET", "HEAD")

`

``

664

`+

if (not (code in (301, 302, 303, 307, 308) and m in ("GET", "HEAD")

`

665

665

`or code in (301, 302, 303) and m == "POST")):

`

666

666

`raise HTTPError(req.full_url, code, msg, headers, fp)

`

667

667

``

`@@ -748,7 +748,7 @@ def http_error_302(self, req, fp, code, msg, headers):

`

748

748

``

749

749

`return self.parent.open(new, timeout=req.timeout)

`

750

750

``

751

``

`-

http_error_301 = http_error_303 = http_error_307 = http_error_302

`

``

751

`+

http_error_301 = http_error_303 = http_error_307 = http_error_308 = http_error_302

`

752

752

``

753

753

`inf_msg = "The HTTP server returned a redirect error that would " \

`

754

754

`"lead to an infinite loop.\n" \

`

`@@ -2211,6 +2211,13 @@ def http_error_307(self, url, fp, errcode, errmsg, headers, data=None):

`

2211

2211

`else:

`

2212

2212

`return self.http_error_default(url, fp, errcode, errmsg, headers)

`

2213

2213

``

``

2214

`+

def http_error_308(self, url, fp, errcode, errmsg, headers, data=None):

`

``

2215

`+

"""Error 308 -- relocated, but turn POST into error."""

`

``

2216

`+

if data is None:

`

``

2217

`+

return self.http_error_301(url, fp, errcode, errmsg, headers, data)

`

``

2218

`+

else:

`

``

2219

`+

return self.http_error_default(url, fp, errcode, errmsg, headers)

`

``

2220

+

2214

2221

`def http_error_401(self, url, fp, errcode, errmsg, headers, data=None,

`

2215

2222

`retry=False):

`

2216

2223

`"""Error 401 -- authentication required.

`