transfer: clear the old autoreferer

Verify in test 2505

Closes #21322
This commit is contained in:
Daniel Stenberg 2026-04-15 08:11:33 +02:00
parent c60d90cd65
commit fa057ea3de
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 145 additions and 3 deletions

View file

@ -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:

View file

@ -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;

View file

@ -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 \
\

67
tests/data/test2505 Normal file
View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="US-ASCII"?>
<testcase>
<info>
<keywords>
HTTP
referer
autoreferer
</keywords>
</info>
# Server-side
<reply>
<data crlf="headers" nocheck="yes">
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
</data>
<data2 crlf="headers" nocheck="yes">
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
</data2>
</reply>
# Client-side
<client>
<server>
http
</server>
<tool>
lib%TESTNUMBER
</tool>
<name>
verify CURLOPT_AUTOREFERER switched off
</name>
<command>
http://%HOSTIP:%HTTPPORT
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<protocol crlf="headers">
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: */*
</protocol>
</verify>
</testcase>

View file

@ -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 \

71
tests/libtest/lib2505.c Normal file
View file

@ -0,0 +1,71 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) Linus Nielsen Feltzing <linus@haxx.se>
*
* 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;
}