On 06-06-2014 17:23, Angus Robertson - Magenta Systems Ltd wrote:
>From which RFC (and section)?
Not easy to get it from the RFCs or from the online discussions, but
I've now checked how Firefox and Chrome are implementing it and it seems
there are some exceptions for the 301, 302 and 303 codes.
In Chromium:
std::string URLRequest::ComputeMethodForRedirect(
const std::string& method,
int http_status_code) {
// For 303 redirects, all request methods except HEAD are converted
to GET,
// as per the latest httpbis draft. The draft also allows POST
requests to
// be converted to GETs when following 301/302 redirects, for historical
// reasons. Most major browsers do this and so shall we. Both RFC
2616 and
// the httpbis draft say to prompt the user to confirm the generation
of new
// requests, other than GET and HEAD requests, but IE omits these
prompts and
// so shall we.
// See:
https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-17#section-7.3
if ((http_status_code == 303 && method != "HEAD") ||
((http_status_code == 301 || http_status_code == 302) &&
method == "POST")) {
return "GET";
}
return method;
}
Same in FF:
HttpBaseChannel::ShouldRewriteRedirectToGET(uint32_t httpStatus,
nsHttpRequestHead::ParsedMethodType method)
{
// for 301 and 302, only rewrite POST
if (httpStatus == 301 || httpStatus == 302)
return method == nsHttpRequestHead::kMethod_Post;
// rewrite for 303 unless it was HEAD
if (httpStatus == 303)
return method != nsHttpRequestHead::kMethod_Head;
// otherwise, such as for 307, do not rewrite
return false;
}
So I suppose we can adopt this behavior too, i.e.
if ((FStatusCode=303) and (FRequestType <> httpHEAD)) or
((FRequestType = httpPOST) and ((FStatusCode=301) or
(FStatusCode=302))) then
FRequestType := httpGET;
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be