mirror of
https://github.com/curl/curl.git
synced 2026-04-14 23:51:42 +03:00
parent
36542b7349
commit
2cb868242d
7 changed files with 27 additions and 36 deletions
16
lib/easy.c
16
lib/easy.c
|
|
@ -977,6 +977,7 @@ CURL *curl_easy_duphandle(CURL *d)
|
|||
Curl_hash_str, curlx_str_key_compare, dupeasy_meta_freeentry);
|
||||
curlx_dyn_init(&outcurl->state.headerb, CURL_MAX_HTTP_HEADER);
|
||||
Curl_bufref_init(&outcurl->state.url);
|
||||
Curl_bufref_init(&outcurl->state.referer);
|
||||
Curl_netrc_init(&outcurl->state.netrc);
|
||||
|
||||
/* the connection pool is setup on demand */
|
||||
|
|
@ -1016,16 +1017,19 @@ CURL *curl_easy_duphandle(CURL *d)
|
|||
}
|
||||
#endif
|
||||
|
||||
if(Curl_bufref_ptr(&data->state.url))
|
||||
if(Curl_bufref_ptr(&data->state.url)) {
|
||||
Curl_bufref_set(&outcurl->state.url,
|
||||
curlx_strdup(Curl_bufref_ptr(&data->state.url)), 0,
|
||||
curl_free);
|
||||
|
||||
if(data->state.referer) {
|
||||
outcurl->state.referer = curlx_strdup(data->state.referer);
|
||||
if(!outcurl->state.referer)
|
||||
if(!Curl_bufref_ptr(&outcurl->state.url))
|
||||
goto fail;
|
||||
}
|
||||
if(Curl_bufref_ptr(&data->state.referer)) {
|
||||
Curl_bufref_set(&outcurl->state.referer,
|
||||
curlx_strdup(Curl_bufref_ptr(&data->state.referer)), 0,
|
||||
curl_free);
|
||||
if(!Curl_bufref_ptr(&outcurl->state.referer))
|
||||
goto fail;
|
||||
outcurl->state.referer_alloc = TRUE;
|
||||
}
|
||||
|
||||
/* Reinitialize an SSL engine for the new handle
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info,
|
|||
break;
|
||||
case CURLINFO_REFERER:
|
||||
/* Return the referrer header for this request, or NULL if unset */
|
||||
*param_charp = data->state.referer;
|
||||
*param_charp = Curl_bufref_ptr(&data->state.referer);
|
||||
break;
|
||||
case CURLINFO_PRIMARY_IP:
|
||||
/* Return the ip address of the most recent (primary) connection */
|
||||
|
|
|
|||
15
lib/http.c
15
lib/http.c
|
|
@ -1235,11 +1235,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl,
|
|||
/* We are asked to automatically set the previous URL as the referer
|
||||
when we get the next URL. We pick the ->url field, which may or may
|
||||
not be 100% correct */
|
||||
|
||||
if(data->state.referer_alloc) {
|
||||
Curl_safefree(data->state.referer);
|
||||
data->state.referer_alloc = FALSE;
|
||||
}
|
||||
Curl_bufref_free(&data->state.referer);
|
||||
|
||||
/* Make a copy of the URL without credentials and fragment */
|
||||
u = curl_url();
|
||||
|
|
@ -1262,8 +1258,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl,
|
|||
if(uc || !referer)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
data->state.referer = referer;
|
||||
data->state.referer_alloc = TRUE; /* yes, free this later */
|
||||
Curl_bufref_set(&data->state.referer, referer, 0, curl_free);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2867,8 +2862,10 @@ static CURLcode http_add_hd(struct Curl_easy *data,
|
|||
|
||||
case H1_HD_REFERER:
|
||||
Curl_safefree(data->state.aptr.ref);
|
||||
if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer")))
|
||||
result = curlx_dyn_addf(req, "Referer: %s\r\n", data->state.referer);
|
||||
if(Curl_bufref_ptr(&data->state.referer) &&
|
||||
!Curl_checkheaders(data, STRCONST("Referer")))
|
||||
result = curlx_dyn_addf(req, "Referer: %s\r\n",
|
||||
Curl_bufref_ptr(&data->state.referer));
|
||||
break;
|
||||
|
||||
#ifndef CURL_DISABLE_PROXY
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "connect.h"
|
||||
#include "cfilters.h"
|
||||
#include "strdup.h"
|
||||
#include "bufref.h"
|
||||
#include "curlx/strparse.h"
|
||||
|
||||
|
||||
|
|
@ -536,9 +537,10 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
|
|||
|
||||
/* Referrer */
|
||||
Curl_safefree(data->state.aptr.ref);
|
||||
if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer")))
|
||||
data->state.aptr.ref = curl_maprintf("Referer: %s\r\n",
|
||||
data->state.referer);
|
||||
if(Curl_bufref_ptr(&data->state.referer) &&
|
||||
!Curl_checkheaders(data, STRCONST("Referer")))
|
||||
data->state.aptr.ref =
|
||||
curl_maprintf("Referer: %s\r\n", Curl_bufref_ptr(&data->state.referer));
|
||||
|
||||
p_referrer = data->state.aptr.ref;
|
||||
|
||||
|
|
|
|||
|
|
@ -1754,12 +1754,8 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option,
|
|||
/*
|
||||
* String to set in the HTTP Referer: field.
|
||||
*/
|
||||
if(data->state.referer_alloc) {
|
||||
Curl_safefree(data->state.referer);
|
||||
data->state.referer_alloc = FALSE;
|
||||
}
|
||||
result = Curl_setstropt(&s->str[STRING_SET_REFERER], ptr);
|
||||
data->state.referer = s->str[STRING_SET_REFERER];
|
||||
Curl_bufref_set(&data->state.referer, s->str[STRING_SET_REFERER], 0, NULL);
|
||||
break;
|
||||
|
||||
case CURLOPT_USERAGENT:
|
||||
|
|
|
|||
13
lib/url.c
13
lib/url.c
|
|
@ -180,11 +180,7 @@ void Curl_freeset(struct Curl_easy *data)
|
|||
Curl_safefree(data->set.blobs[j]);
|
||||
}
|
||||
|
||||
if(data->state.referer_alloc) {
|
||||
Curl_safefree(data->state.referer);
|
||||
data->state.referer_alloc = FALSE;
|
||||
}
|
||||
data->state.referer = NULL;
|
||||
Curl_bufref_free(&data->state.referer);
|
||||
Curl_bufref_free(&data->state.url);
|
||||
|
||||
Curl_mime_cleanpart(&data->set.mimepost);
|
||||
|
|
@ -271,11 +267,7 @@ CURLcode Curl_close(struct Curl_easy **datap)
|
|||
Curl_safefree(data->state.first_host);
|
||||
Curl_ssl_free_certinfo(data);
|
||||
|
||||
if(data->state.referer_alloc) {
|
||||
Curl_safefree(data->state.referer);
|
||||
data->state.referer_alloc = FALSE;
|
||||
}
|
||||
data->state.referer = NULL;
|
||||
Curl_bufref_free(&data->state.referer);
|
||||
|
||||
up_free(data);
|
||||
curlx_dyn_free(&data->state.headerb);
|
||||
|
|
@ -514,6 +506,7 @@ CURLcode Curl_open(struct Curl_easy **curl)
|
|||
Curl_hash_str, curlx_str_key_compare, easy_meta_freeentry);
|
||||
curlx_dyn_init(&data->state.headerb, CURL_MAX_HTTP_HEADER);
|
||||
Curl_bufref_init(&data->state.url);
|
||||
Curl_bufref_init(&data->state.referer);
|
||||
Curl_req_init(&data->req);
|
||||
Curl_initinfo(data);
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
|
|
|
|||
|
|
@ -1027,7 +1027,7 @@ struct UrlState {
|
|||
CURLU *uh; /* URL handle for the current parsed URL */
|
||||
struct urlpieces up;
|
||||
struct bufref url; /* work URL, initially copied from UserDefined */
|
||||
char *referer; /* referer string */
|
||||
struct bufref referer; /* referer string */
|
||||
struct curl_slist *resolve; /* set to point to the set.resolve list when
|
||||
this should be dealt with in pretransfer */
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
|
|
@ -1123,7 +1123,6 @@ struct UrlState {
|
|||
#ifdef CURL_LIST_ONLY_PROTOCOL
|
||||
BIT(list_only); /* list directory contents */
|
||||
#endif
|
||||
BIT(referer_alloc); /* referer string is malloc()ed */
|
||||
BIT(wildcard_resolve); /* Set to true if any resolve change is a wildcard */
|
||||
BIT(upload); /* upload request */
|
||||
BIT(internal); /* internal: true if this easy handle was created for
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue