urldata: change 'keep_post' into three distinct bitfields

Closes #20262
This commit is contained in:
Daniel Stenberg 2026-01-12 11:07:01 +01:00
parent 31fbbb322e
commit 9e0b02c19c
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
3 changed files with 11 additions and 8 deletions

View file

@ -1413,7 +1413,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl,
if((data->state.httpreq == HTTPREQ_POST ||
data->state.httpreq == HTTPREQ_POST_FORM ||
data->state.httpreq == HTTPREQ_POST_MIME) &&
!(data->set.keep_post & CURL_REDIR_POST_301)) {
!data->set.post301) {
http_switch_to_get(data, 301);
switch_to_get = TRUE;
}
@ -1438,7 +1438,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl,
if((data->state.httpreq == HTTPREQ_POST ||
data->state.httpreq == HTTPREQ_POST_FORM ||
data->state.httpreq == HTTPREQ_POST_MIME) &&
!(data->set.keep_post & CURL_REDIR_POST_302)) {
!data->set.post302) {
http_switch_to_get(data, 302);
switch_to_get = TRUE;
}
@ -1454,7 +1454,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl,
((data->state.httpreq != HTTPREQ_POST &&
data->state.httpreq != HTTPREQ_POST_FORM &&
data->state.httpreq != HTTPREQ_POST_MIME) ||
!(data->set.keep_post & CURL_REDIR_POST_303))) {
!data->set.post303)) {
http_switch_to_get(data, 303);
switch_to_get = TRUE;
}

View file

@ -963,7 +963,9 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
/* no return error on too high numbers since the bitmask could be
extended in a future */
return CURLE_BAD_FUNCTION_ARGUMENT;
s->keep_post = arg & CURL_REDIR_POST_ALL;
s->post301 = !!(arg & CURL_REDIR_POST_301);
s->post302 = !!(arg & CURL_REDIR_POST_302);
s->post303 = !!(arg & CURL_REDIR_POST_303);
break;
case CURLOPT_HEADEROPT:

View file

@ -1469,10 +1469,8 @@ struct UserDefined {
*/
uint8_t ftp_create_missing_dirs;
#endif
uint8_t use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
IMAP or POP3 or others! (type: curl_usessl)*/
char keep_post; /* keep POSTs as POSTs after a 30x request; each
bit represents a request, from 301 to 303 */
uint8_t use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or IMAP or
POP3 or others! (type: curl_usessl)*/
uint8_t timecondition; /* kind of time comparison: curl_TimeCond */
uint8_t method; /* what kind of HTTP request: Curl_HttpReq */
uint8_t httpwant; /* when non-zero, a specific HTTP version requested
@ -1587,6 +1585,9 @@ struct UserDefined {
BIT(ws_raw_mode);
BIT(ws_no_auto_pong);
#endif
BIT(post301); /* keep POSTs as POSTs after a 301 request */
BIT(post302); /* keep POSTs as POSTs after a 302 request */
BIT(post303); /* keep POSTs as POSTs after a 303 request */
};
#ifndef CURL_DISABLE_MIME