mirror of
https://github.com/curl/curl.git
synced 2025-02-23 15:10:03 +08:00
Moved the fetching of the list of matching cookies to make it easier to free
that list in case something goes wrong in the function and we must bail out. Courtesy of the torture testing.
This commit is contained in:
parent
b8541929c8
commit
63f97b38eb
69
lib/http.c
69
lib/http.c
@ -1230,7 +1230,6 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
char *buf = data->state.buffer; /* this is a short cut to the buffer */
|
char *buf = data->state.buffer; /* this is a short cut to the buffer */
|
||||||
CURLcode result=CURLE_OK;
|
CURLcode result=CURLE_OK;
|
||||||
struct HTTP *http;
|
struct HTTP *http;
|
||||||
struct Cookie *co=NULL; /* no cookies from start */
|
|
||||||
char *ppath = conn->path;
|
char *ppath = conn->path;
|
||||||
char *host = conn->host.name;
|
char *host = conn->host.name;
|
||||||
const char *te = ""; /* tranfer-encoding */
|
const char *te = ""; /* tranfer-encoding */
|
||||||
@ -1399,15 +1398,6 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->cookies) {
|
|
||||||
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
|
||||||
co = Curl_cookie_getlist(data->cookies,
|
|
||||||
conn->allocptr.cookiehost?
|
|
||||||
conn->allocptr.cookiehost:host, ppath,
|
|
||||||
(bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE));
|
|
||||||
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (conn->bits.httpproxy &&
|
if (conn->bits.httpproxy &&
|
||||||
!data->set.tunnel_thru_httpproxy &&
|
!data->set.tunnel_thru_httpproxy &&
|
||||||
!(conn->protocol&PROT_HTTPS)) {
|
!(conn->protocol&PROT_HTTPS)) {
|
||||||
@ -1611,40 +1601,51 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
http->p_pragma?http->p_pragma:"",
|
http->p_pragma?http->p_pragma:"",
|
||||||
http->p_accept?http->p_accept:"",
|
http->p_accept?http->p_accept:"",
|
||||||
(data->set.encoding && *data->set.encoding && conn->allocptr.accept_encoding)?
|
(data->set.encoding && *data->set.encoding && conn->allocptr.accept_encoding)?
|
||||||
conn->allocptr.accept_encoding:"", /* 08/28/02 jhrg */
|
conn->allocptr.accept_encoding:"",
|
||||||
(data->change.referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> <CRLF> */,
|
(data->change.referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> */,
|
||||||
te
|
te
|
||||||
);
|
);
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if(co) {
|
if(data->cookies) {
|
||||||
int count=0;
|
struct Cookie *co; /* no cookies from start */
|
||||||
struct Cookie *store=co;
|
|
||||||
/* now loop through all cookies that matched */
|
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
||||||
while(co) {
|
co = Curl_cookie_getlist(data->cookies,
|
||||||
if(co->value) {
|
conn->allocptr.cookiehost?
|
||||||
if(0 == count) {
|
conn->allocptr.cookiehost:host, ppath,
|
||||||
result = add_bufferf(req_buffer, "Cookie: ");
|
(bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE));
|
||||||
|
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
|
||||||
|
|
||||||
|
if(co) {
|
||||||
|
int count=0;
|
||||||
|
struct Cookie *store=co;
|
||||||
|
/* now loop through all cookies that matched */
|
||||||
|
while(co) {
|
||||||
|
if(co->value) {
|
||||||
|
if(0 == count) {
|
||||||
|
result = add_bufferf(req_buffer, "Cookie: ");
|
||||||
|
if(result)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
result = add_bufferf(req_buffer,
|
||||||
|
"%s%s=%s", count?"; ":"",
|
||||||
|
co->name, co->value);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
break;
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
result = add_bufferf(req_buffer,
|
co = co->next; /* next cookie please */
|
||||||
"%s%s=%s", count?"; ":"", co->name, co->value);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
co = co->next; /* next cookie please */
|
if(count && (CURLE_OK == result))
|
||||||
|
result = add_buffer(req_buffer, "\r\n", 2);
|
||||||
|
|
||||||
|
Curl_cookie_freelist(store); /* free the cookie list */
|
||||||
}
|
}
|
||||||
if(count) {
|
if(result)
|
||||||
result = add_buffer(req_buffer, "\r\n", 2);
|
return result;
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
Curl_cookie_freelist(store); /* free the cookie list */
|
|
||||||
co=NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->set.timecondition) {
|
if(data->set.timecondition) {
|
||||||
|
Loading…
Reference in New Issue
Block a user