diff --git a/lib/setopt.c b/lib/setopt.c index dae4218b70..e832ef1afd 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -1958,7 +1958,6 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option, * String to set in the HTTP Referer: field. */ result = Curl_setstropt(&s->str[STRING_SET_REFERER], ptr); - Curl_bufref_set(&data->state.referer, s->str[STRING_SET_REFERER], 0, NULL); break; case CURLOPT_USERAGENT: diff --git a/lib/transfer.c b/lib/transfer.c index a2fce9331b..fd1a903dab 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -537,6 +537,11 @@ CURLcode Curl_pretransfer(struct Curl_easy *data) data->state.authproxy.want = data->set.proxyauth; curlx_safefree(data->info.wouldredirect); Curl_data_priority_clear_state(data); + if(data->set.http_auto_referer) + Curl_bufref_free(&data->state.referer); + if(data->set.str[STRING_SET_REFERER]) + Curl_bufref_set(&data->state.referer, data->set.str[STRING_SET_REFERER], + 0, NULL); if(data->state.httpreq == HTTPREQ_PUT) data->state.infilesize = data->set.filesize; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 673a12d3d2..857389450e 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -265,7 +265,7 @@ test2309 \ \ test2400 test2401 test2402 test2403 test2404 test2405 test2406 test2407 \ \ -test2500 test2501 test2502 test2503 test2504 \ +test2500 test2501 test2502 test2503 test2504 test2505 \ \ test2600 test2601 test2602 test2603 test2604 test2605 \ \ diff --git a/tests/data/test2505 b/tests/data/test2505 new file mode 100644 index 0000000000..8fac590b37 --- /dev/null +++ b/tests/data/test2505 @@ -0,0 +1,67 @@ + + + + +HTTP +referer +autoreferer + + + +# Server-side + + +HTTP/1.1 301 redirect +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: server.example.com +Content-Length: 47 +Location: %TESTNUMBER0002 + +file contents should appear once for each file + + + +HTTP/1.1 200 OK +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: server.example.com +Content-Length: 47 + +file contents should appear once for each file + + + +# Client-side + + +http + + +lib%TESTNUMBER + + +verify CURLOPT_AUTOREFERER switched off + + +http://%HOSTIP:%HTTPPORT + + + +# Verify data after the test has been "shot" + + +GET / HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /%TESTNUMBER0002 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Referer: http://%HOSTIP:%HTTPPORT/ + +GET / HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index 249c6fda87..bdf8a1dbea 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -112,7 +112,7 @@ TESTS_C = \ lib2023.c lib2032.c lib2082.c \ lib2301.c lib2302.c lib2304.c lib2306.c lib2308.c lib2309.c \ lib2402.c lib2404.c lib2405.c \ - lib2502.c lib2504.c \ + lib2502.c lib2504.c lib2505.c \ lib2700.c \ lib3010.c lib3025.c lib3026.c lib3027.c lib3033.c lib3034.c \ lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c \ diff --git a/tests/libtest/lib2505.c b/tests/libtest/lib2505.c new file mode 100644 index 0000000000..c170259874 --- /dev/null +++ b/tests/libtest/lib2505.c @@ -0,0 +1,71 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Linus Nielsen Feltzing + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ +#include "first.h" + +#include "testtrace.h" + +static size_t sink2505(char *ptr, size_t size, size_t nmemb, void *ud) +{ + (void)ptr; + (void)ud; + return size * nmemb; +} + +static CURLcode test_lib2505(const char *URL) +{ + CURL *curl; + CURLcode result = CURLE_OUT_OF_MEMORY; + + if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + curl_mfprintf(stderr, "curl_global_init() failed\n"); + return TEST_ERR_MAJOR_BAD; + } + + curl = curl_easy_init(); + if(!curl) { + curl_mfprintf(stderr, "curl_easy_init() failed\n"); + curl_global_cleanup(); + return TEST_ERR_MAJOR_BAD; + } + + test_setopt(curl, CURLOPT_WRITEFUNCTION, sink2505); + test_setopt(curl, CURLOPT_AUTOREFERER, 1L); + test_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + test_setopt(curl, CURLOPT_URL, URL); + + result = curl_easy_perform(curl); + curl_mprintf("req1=%d\n", (int)result); + + test_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L); + test_setopt(curl, CURLOPT_URL, URL); + + result = curl_easy_perform(curl); + curl_mprintf("req2=%d\n", (int)result); + +test_cleanup: + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return result; +}