diff --git a/Doc/lib/liburllib.tex b/Doc/lib/liburllib.tex index a8ee7bc8151..386f33e730d 100644 --- a/Doc/lib/liburllib.tex +++ b/Doc/lib/liburllib.tex @@ -257,12 +257,12 @@ actually retrieve a resource at an \file{https:} URL. \begin{classdesc}{FancyURLopener}{...} \class{FancyURLopener} subclasses \class{URLopener} providing default -handling for the following HTTP response codes: 301, 302, 303 and 401. -For 301, 302 and 303 response codes, the \mailheader{Location} header -is used to fetch the actual URL. For 401 response codes -(authentication required), basic HTTP authentication is performed. -For 301, 302 and 303 response codes, recursion is bounded by the value -of the \var{maxtries} attribute, which defaults 10. +handling for the following HTTP response codes: 301, 302, 303, 307 and +401. For the 30x response codes listed above, the +\mailheader{Location} header is used to fetch the actual URL. For 401 +response codes (authentication required), basic HTTP authentication is +performed. For the 30x response codes, recursion is bounded by the +value of the \var{maxtries} attribute, which defaults to 10. \note{According to the letter of \rfc{2616}, 301 and 302 responses to POST requests must not be automatically redirected without diff --git a/Doc/lib/liburllib2.tex b/Doc/lib/liburllib2.tex index f88fd256dc9..783105f7a7b 100644 --- a/Doc/lib/liburllib2.tex +++ b/Doc/lib/liburllib2.tex @@ -424,8 +424,11 @@ redirect. Otherwise, raise \exception{HTTPError} if no other if you can't but another \class{Handler} might. \note{The default implementation of this method does not strictly - follow \rfc{2616}: it allows automatic 302 redirection of POST - requests, because essentially all HTTP clients do this.} + follow \rfc{2616}, which says that 301 and 302 responses to POST + requests must not be automatically redirected without confirmation by + the user. In reality, browsers do allow automatic redirection of + these responses, changing the POST to a GET, and the default + implementation reproduces this behaviour.} \end{methoddesc} @@ -446,9 +449,14 @@ The same as \method{http_error_301()}, but called for the \begin{methoddesc}[HTTPRedirectHandler]{http_error_303}{req, fp, code, msg, hdrs} The same as \method{http_error_301()}, but called for the -`see other' redirect response. +`see other' response. \end{methoddesc} +\begin{methoddesc}[HTTPRedirectHandler]{http_error_307}{req, + fp, code, msg, hdrs} +The same as \method{http_error_301()}, but called for the +`temporary redirect' response. + \subsection{ProxyHandler Objects \label{proxy-handler}} \begin{methoddescni}[ProxyHandler]{\var{protocol}_open}{request} diff --git a/Lib/urllib2.py b/Lib/urllib2.py index ac556b56468..df3729ab80c 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -431,9 +431,9 @@ class HTTPRedirectHandler(BaseHandler): """ m = req.get_method() if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") - or code in (302, 303) and m == "POST"): - # Strictly (according to RFC 2616), 302 in response to a - # POST MUST NOT cause a redirection without confirmation + or code in (301, 302, 303) and m == "POST"): + # Strictly (according to RFC 2616), 301 or 302 in response + # to a POST MUST NOT cause a redirection without confirmation # from the user (of urllib2, in this case). In practice, # essentially all clients do redirect in this case, so we # do the same. @@ -480,9 +480,9 @@ class HTTPRedirectHandler(BaseHandler): http_error_301 = http_error_303 = http_error_307 = http_error_302 - inf_msg = "The HTTP server returned a redirect error that would" \ + inf_msg = "The HTTP server returned a redirect error that would " \ "lead to an infinite loop.\n" \ - "The last 302 error message was:\n" + "The last 30x error message was:\n" class ProxyHandler(BaseHandler): # Proxies must be in front