|
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
|
@@ -659,7 +659,7 @@ def redirect_request(self, req, fp, code, msg, headers, newurl):
|
659 | 659 | but another Handler might.
|
660 | 660 | """
|
661 | 661 | m = req.get_method()
|
662 |
| - if (not (code in (301, 302, 303, 307) and m in ("GET", "HEAD") |
| 662 | + if (not (code in (301, 302, 303, 307, 308) and m in ("GET", "HEAD") |
663 | 663 | or code in (301, 302, 303) and m == "POST")):
|
664 | 664 | raise HTTPError(req.full_url, code, msg, headers, fp)
|
665 | 665 |
|
@@ -746,7 +746,7 @@ def http_error_302(self, req, fp, code, msg, headers):
|
746 | 746 |
|
747 | 747 | return self.parent.open(new, timeout=req.timeout)
|
748 | 748 |
|
749 |
| - http_error_301 = http_error_303 = http_error_307 = http_error_302 |
| 749 | + http_error_301 = http_error_303 = http_error_307 = http_error_308 = http_error_302 |
750 | 750 |
|
751 | 751 | inf_msg = "The HTTP server returned a redirect error that would " \
|
752 | 752 | "lead to an infinite loop.\n" \
|
@@ -2209,6 +2209,13 @@ def http_error_307(self, url, fp, errcode, errmsg, headers, data=None):
|
2209 | 2209 | else:
|
2210 | 2210 | return self.http_error_default(url, fp, errcode, errmsg, headers)
|
2211 | 2211 |
|
| 2212 | + def http_error_308(self, url, fp, errcode, errmsg, headers, data=None): |
| 2213 | + """Error 308 -- relocated, but turn POST into error.""" |
| 2214 | + if data is None: |
| 2215 | + return self.http_error_301(url, fp, errcode, errmsg, headers, data) |
| 2216 | + else: |
| 2217 | + return self.http_error_default(url, fp, errcode, errmsg, headers) |
| 2218 | + |
2212 | 2219 | def http_error_401(self, url, fp, errcode, errmsg, headers, data=None,
|
2213 | 2220 | retry=False):
|
2214 | 2221 | """Error 401 -- authentication required.
|
|
0 commit comments