summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2017-05-29 13:28:01 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2017-06-26 23:31:15 +0200
commit42654d08c2ca1bee18b6947a39228a35c2409deb (patch)
treec4a04897c2f77018840f201e1d9d89d62b10cdb2 /methods
parentcbbf185c3c55effe47f218a07e7b1f324973a8a6 (diff)
deal with 3xx httpcodes as required by HTTP/1.1 spec
An unknown code should be handled the same as the x00 code of this group, but for redirections we used to treat 300 (and a few others) as an error while unknown codes were considered redirections. Instead we check now explicitly for the redirection codes we support for redirecting (and add the 308 defined in RFC 7538) to avoid future problems if new 3xx codes are added expecting certain behaviours. Potentially strange would have been e.g. "305 Use Proxy" sending a Location for the proxy to use – which wouldn't have worked and resulted in an error anyhow, but probably confused users in the process.
Diffstat (limited to 'methods')
-rw-r--r--methods/basehttp.cc24
1 files changed, 12 insertions, 12 deletions
diff --git a/methods/basehttp.cc b/methods/basehttp.cc
index d7d9bccd0..5eb8a8e7e 100644
--- a/methods/basehttp.cc
+++ b/methods/basehttp.cc
@@ -286,18 +286,18 @@ BaseHttpMethod::DealWithHeaders(FetchResult &Res, RequestState &Req)
return IMS_HIT;
}
- /* Redirect
- *
- * Note that it is only OK for us to treat all redirection the same
- * because we *always* use GET, not other HTTP methods. There are
- * three redirection codes for which it is not appropriate that we
- * redirect. Pass on those codes so the error handling kicks in.
- */
- if (AllowRedirect
- && (Req.Result > 300 && Req.Result < 400)
- && (Req.Result != 300 // Multiple Choices
- && Req.Result != 304 // Not Modified
- && Req.Result != 306)) // (Not part of HTTP/1.1, reserved)
+ /* Note that it is only OK for us to treat all redirection the same
+ because we *always* use GET, not other HTTP methods.
+ Codes not mentioned are handled as errors later as required by the
+ HTTP spec to handle unknown codes the same as the x00 code. */
+ constexpr unsigned int RedirectCodes[] = {
+ 301, // Moved Permanently
+ 302, // Found
+ 303, // See Other
+ 307, // Temporary Redirect
+ 308, // Permanent Redirect
+ };
+ if (AllowRedirect && std::find(std::begin(RedirectCodes), std::end(RedirectCodes), Req.Result) != std::end(RedirectCodes))
{
if (Req.Location.empty() == true)
;