From 59f904d8de005755f87aa0a4312ab7570a62c6f7 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 24 May 2004 07:13:48 +0000 Subject: [PATCH] Robert D. Young reported that CURLOPT_COOKIEFILE and CURLOPT_COOKIE could not be used both in one request. Fixed it and added test case 172 to verify. --- CHANGES | 4 ++++ lib/http.c | 45 +++++++++++++++++++++++----------------- lib/url.c | 1 - lib/urldata.h | 1 - tests/data/Makefile.am | 3 ++- tests/data/test172 | 47 ++++++++++++++++++++++++++++++++++++++++++ tests/data/test6 | 2 +- 7 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 tests/data/test172 diff --git a/CHANGES b/CHANGES index 3dfb5cde0..a4ea90706 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Daniel (24 May 2004) +- Robert D. Young reported that CURLOPT_COOKIEFILE and CURLOPT_COOKIE could + not be used both in one request. Fixed it and added test case 172 to verify. + Daniel (21 May 2004) - While talking to host a.b.c, libcurl did wrongly not accept cookies that were set to the domain .a.b.c (that is with a dot prefix). This is now fixed diff --git a/lib/http.c b/lib/http.c index 41b0398de..64bbb1c3f 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1236,6 +1236,7 @@ CURLcode Curl_http(struct connectdata *conn) char *ptr; char *request; Curl_HttpReq httpreq = data->set.httpreq; + char *addcookies = NULL; if(!conn->proto.http) { /* Only allocate this struct if we don't already have it! */ @@ -1316,11 +1317,8 @@ CURLcode Curl_http(struct connectdata *conn) else conn->allocptr.ref = NULL; - Curl_safefree(conn->allocptr.cookie); if(data->set.cookie && !checkheaders(data, "Cookie:")) - conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->set.cookie); - else - conn->allocptr.cookie = NULL; + addcookies = data->set.cookie; if(!conn->bits.upload_chunky && (httpreq != HTTPREQ_GET)) { /* not a chunky transfer yet, but data is to be sent */ @@ -1578,7 +1576,6 @@ CURLcode Curl_http(struct connectdata *conn) "%s" /* userpwd */ "%s" /* range */ "%s" /* user agent */ - "%s" /* cookie */ "%s" /* host */ "%s" /* pragma */ "%s" /* accept */ @@ -1596,7 +1593,6 @@ CURLcode Curl_http(struct connectdata *conn) conn->allocptr.rangeline:"", (data->set.useragent && *data->set.useragent && conn->allocptr.uagent)? conn->allocptr.uagent:"", - (conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: */ (conn->allocptr.host?conn->allocptr.host:""), /* Host: host */ http->p_pragma?http->p_pragma:"", http->p_accept?http->p_accept:"", @@ -1609,18 +1605,19 @@ CURLcode Curl_http(struct connectdata *conn) if(result) return result; - if(data->cookies) { - struct Cookie *co; /* no cookies from start */ - - 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(data->cookies || addcookies) { + struct Cookie *co=NULL; /* no cookies from start */ + int count=0; + 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(co) { - int count=0; struct Cookie *store=co; /* now loop through all cookies that matched */ while(co) { @@ -1639,11 +1636,21 @@ CURLcode Curl_http(struct connectdata *conn) } 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(addcookies && (CURLE_OK == result)) { + if(!count) + result = add_bufferf(req_buffer, "Cookie: "); + if(CURLE_OK == result) { + result = add_bufferf(req_buffer, "%s%s", + count?"; ":"", + addcookies); + count++; + } + } + if(count && (CURLE_OK == result)) + result = add_buffer(req_buffer, "\r\n", 2); + if(result) return result; } diff --git a/lib/url.c b/lib/url.c index f8c8caf85..d55086fed 100644 --- a/lib/url.c +++ b/lib/url.c @@ -1415,7 +1415,6 @@ CURLcode Curl_disconnect(struct connectdata *conn) Curl_safefree(conn->allocptr.accept_encoding); Curl_safefree(conn->allocptr.rangeline); Curl_safefree(conn->allocptr.ref); - Curl_safefree(conn->allocptr.cookie); Curl_safefree(conn->allocptr.host); Curl_safefree(conn->allocptr.cookiehost); diff --git a/lib/urldata.h b/lib/urldata.h index d52502f7b..21f3ce7c0 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -527,7 +527,6 @@ struct connectdata { char *userpwd; /* free later if not NULL! */ char *rangeline; /* free later if not NULL! */ char *ref; /* free later if not NULL! */ - char *cookie; /* free later if not NULL! */ char *host; /* free later if not NULL */ char *cookiehost; /* free later if not NULL */ } allocptr; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index a6446d7d6..8ed9d8e2d 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -23,7 +23,8 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test203 test93 test94 test95 test509 test510 test97 test98 test99 \ test150 test151 test152 test153 test154 test155 test156 test157 \ test158 test159 test511 test160 test161 test162 test163 test164 \ - test512 test165 test166 test167 test168 test169 test170 test171 + test512 test165 test166 test167 test168 test169 test170 test171 \ + test172 # The following tests have been removed from the dist since they no longer # work. We need to fix the test suite's FTPS server first, then bring them diff --git a/tests/data/test172 b/tests/data/test172 new file mode 100644 index 000000000..ff1cb7abe --- /dev/null +++ b/tests/data/test172 @@ -0,0 +1,47 @@ +# Server-side + + +HTTP/1.1 200 OK +Content-Length: 4 +Connection: close + +boo + + + +# Client-side + + +http + + +HTTP with cookies file and custom added cookie + + +http://%HOSTIP:%HOSTPORT/we/want/172 -b log/jar172.txt -b "tool=curl; name=fool" + + +# Netscape HTTP Cookie File +# http://www.netscape.com/newsref/std/cookie_spec.html +# This file was generated by libcurl! Edit at your own risk. + +.127.0.0.1 TRUE /silly/ FALSE 0 ismatch this +.127.0.0.1 TRUE / FALSE 0 partmatch present +127.0.0.1 FALSE /we/want/ FALSE 1391252187 nodomain value + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /we/want/172 HTTP/1.1 +Host: 127.0.0.1:8999 +Pragma: no-cache +Accept: */* +Cookie: nodomain=value; partmatch=present; tool=curl; name=fool + + + diff --git a/tests/data/test6 b/tests/data/test6 index fbd5c16ab..9a0d02cc3 100644 --- a/tests/data/test6 +++ b/tests/data/test6 @@ -31,10 +31,10 @@ http://%HOSTIP:%HOSTPORT/we/want/that/page/6 -b "name=contents;name2=content2" GET /we/want/that/page/6 HTTP/1.1 -Cookie: name=contents;name2=content2 Host: 127.0.0.1:8999 Pragma: no-cache Accept: */* +Cookie: name=contents;name2=content2