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 */
}
#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
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 */
/* 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();
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);
}
}
}
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
#include "connect.h"
#include "cfilters.h"
#include "strdup.h"
+#include "bufref.h"
#include "curlx/strparse.h"
/* 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;
/*
* 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:
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);
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);
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
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
#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