mirror of
https://github.com/curl/curl.git
synced 2026-08-26 08:03:31 +03:00
CURLOPT_POSTREDIR: also allow 303 to do POST on the redirected URL
As it turns out, some people do want that after all.
This commit is contained in:
parent
a0b3535735
commit
0b516b7162
6 changed files with 23 additions and 17 deletions
|
|
@ -1864,7 +1864,7 @@ CURLcode Curl_follow(struct SessionHandle *data,
|
|||
*/
|
||||
if((data->set.httpreq == HTTPREQ_POST
|
||||
|| data->set.httpreq == HTTPREQ_POST_FORM)
|
||||
&& !data->set.post301) {
|
||||
&& !(data->set.keep_post & CURL_REDIR_POST_301)) {
|
||||
infof(data,
|
||||
"Violate RFC 2616/10.3.2 and switch from POST to GET\n");
|
||||
data->set.httpreq = HTTPREQ_GET;
|
||||
|
|
@ -1892,7 +1892,7 @@ CURLcode Curl_follow(struct SessionHandle *data,
|
|||
*/
|
||||
if((data->set.httpreq == HTTPREQ_POST
|
||||
|| data->set.httpreq == HTTPREQ_POST_FORM)
|
||||
&& !data->set.post302) {
|
||||
&& !(data->set.keep_post & CURL_REDIR_POST_302)) {
|
||||
infof(data,
|
||||
"Violate RFC 2616/10.3.3 and switch from POST to GET\n");
|
||||
data->set.httpreq = HTTPREQ_GET;
|
||||
|
|
@ -1900,9 +1900,10 @@ CURLcode Curl_follow(struct SessionHandle *data,
|
|||
break;
|
||||
|
||||
case 303: /* See Other */
|
||||
/* Disable both types of POSTs, since doing a second POST when
|
||||
* following isn't what anyone would want! */
|
||||
if(data->set.httpreq != HTTPREQ_GET) {
|
||||
/* Disable both types of POSTs, unless the user explicitely
|
||||
asks for POST after POST */
|
||||
if(data->set.httpreq != HTTPREQ_GET
|
||||
&& !(data->set.keep_post & CURL_REDIR_POST_303)) {
|
||||
data->set.httpreq = HTTPREQ_GET; /* enforce GET request */
|
||||
infof(data, "Disables POST, goes with %s\n",
|
||||
data->set.opt_no_body?"HEAD":"GET");
|
||||
|
|
|
|||
|
|
@ -1111,12 +1111,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
|||
* CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
|
||||
* CURL_REDIR_POST_301 - POST is kept as POST after 301
|
||||
* CURL_REDIR_POST_302 - POST is kept as POST after 302
|
||||
* CURL_REDIR_POST_ALL - POST is kept as POST after 301 and 302
|
||||
* CURL_REDIR_POST_303 - POST is kept as POST after 303
|
||||
* CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
|
||||
* other - POST is kept as POST after 301 and 302
|
||||
*/
|
||||
long postRedir = va_arg(param, long);
|
||||
data->set.post301 = (postRedir & CURL_REDIR_POST_301)?TRUE:FALSE;
|
||||
data->set.post302 = (postRedir & CURL_REDIR_POST_302)?TRUE:FALSE;
|
||||
data->set.keep_post = postRedir & CURL_REDIR_POST_ALL;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -1368,9 +1368,9 @@ struct UserDefined {
|
|||
long followlocation; /* as in HTTP Location: */
|
||||
long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1
|
||||
for infinity */
|
||||
bool post301; /* Obey RFC 2616/10.3.2 and keep POSTs as POSTs after a
|
||||
301 */
|
||||
bool post302; /* keep POSTs as POSTs after a 302 */
|
||||
|
||||
int keep_post; /* keep POSTs as POSTs after a 30x request; each
|
||||
bit represents a request, from 301 to 303 */
|
||||
bool free_referer; /* set TRUE if 'referer' points to a string we
|
||||
allocated */
|
||||
void *postfields; /* if POST, set the fields' values here */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue