diff options
-rw-r--r-- | lib/transfer.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/transfer.c b/lib/transfer.c index dcdb4708d..0a544e8d2 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1262,7 +1262,6 @@ CURLcode Curl_perform(struct SessionHandle *data) */ switch(data->info.httpcode) { case 300: /* Multiple Choices */ - case 301: /* Moved Permanently */ case 306: /* Not used */ case 307: /* Temporary Redirect */ default: /* for all unknown ones */ @@ -1270,6 +1269,27 @@ CURLcode Curl_perform(struct SessionHandle *data) * seem to be OK to POST to. */ break; + case 301: /* Moved Permanently */ + /* (quote from RFC2616, section 10.3.2): + * + * Note: When automatically redirecting a POST request after + * receiving a 301 status code, some existing HTTP/1.0 user agents + * will erroneously change it into a GET request. + * + * ---- + * Warning: Because most of importants user agents do this clear + * RFC2616 violation, many webservers expect this misbehavior. So + * these servers often answers to a POST request with an error page. + * To be sure that libcurl gets the page that most user agents + * would get, libcurl has to force GET: + */ + if( data->set.httpreq == HTTPREQ_POST + || data->set.httpreq == HTTPREQ_POST_FORM) { + infof(data, + "Violate RFC 2616/10.3.2 and switch from POST to GET\n"); + data->set.httpreq = HTTPREQ_GET; + } + break; case 302: /* Found */ /* (From 10.3.3) |