summaryrefslogtreecommitdiff
path: root/content/fetch.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2004-10-01 21:31:55 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2004-10-01 21:31:55 +0000
commit49ce807e3cebf9f36fc908d7b7c0bfe00ce32e2c (patch)
treef3750ef9047ff8493715e10e2b84e292c1b56fe1 /content/fetch.c
parent39ad1632eb78e8c632d3e66711d09f2bb982a4e8 (diff)
downloadnetsurf-49ce807e3cebf9f36fc908d7b7c0bfe00ce32e2c.tar.gz
netsurf-49ce807e3cebf9f36fc908d7b7c0bfe00ce32e2c.tar.bz2
[project @ 2004-10-01 21:31:55 by jmb]
A somewhat better implementation of referrers which no longer sends the referer if the URL schemes don't match. Things to do: 1) Preservation of referer across redirects (see comment in browser.c:284) 2) GUI templates/code for configuration of referer sending (simple on/off toggle only) 3) Make referer sending when fetching objects/stylesheets for a page pay attention to option_send_referer? 4) Handle the case where the referer is in the form of http://moo:foo@mysite.com/ (ie the login details embedded in the referer - not good). svn path=/import/netsurf/; revision=1297
Diffstat (limited to 'content/fetch.c')
-rw-r--r--content/fetch.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/content/fetch.c b/content/fetch.c
index c072a1e5a..89351b452 100644
--- a/content/fetch.c
+++ b/content/fetch.c
@@ -228,6 +228,7 @@ struct fetch * fetch_start(char *url, char *referer,
CURLMcode codem;
struct curl_slist *slist;
url_func_result res;
+ char *ref1 = 0, *ref2 = 0;
fetch = malloc(sizeof (*fetch));
if (!fetch)
@@ -238,6 +239,18 @@ struct fetch * fetch_start(char *url, char *referer,
if (res == URL_FUNC_NOMEM)
goto failed;
+ res = url_scheme(url, &ref1);
+ /* we only fail memory exhaustion */
+ if (res == URL_FUNC_NOMEM)
+ goto failed;
+
+ if (referer) {
+ res = url_scheme(referer, &ref2);
+ /* we only fail memory exhaustion */
+ if (res == URL_FUNC_NOMEM)
+ goto failed;
+ }
+
LOG(("fetch %p, url '%s'", fetch, url));
/* construct a new fetch structure */
@@ -250,8 +263,11 @@ struct fetch * fetch_start(char *url, char *referer,
fetch->cookies = cookies;
fetch->url = strdup(url);
fetch->referer = 0;
- if (referer)
- fetch->referer = strdup(referer);
+ /* only send the referer if the schemes match */
+ if (referer) {
+ if (ref1 && ref2 && strcasecmp(ref1, ref2) == 0)
+ fetch->referer = strdup(referer);
+ }
fetch->p = p;
fetch->headers = 0;
fetch->host = host;
@@ -269,11 +285,23 @@ struct fetch * fetch_start(char *url, char *referer,
fetch->prev = 0;
fetch->next = 0;
- if (!fetch->url || (referer && !fetch->referer) ||
+ if (!fetch->url || (referer &&
+ (ref1 && ref2 && strcasecmp(ref1, ref2) == 0) &&
+ !fetch->referer) ||
(post_urlenc && !fetch->post_urlenc) ||
(post_multipart && !fetch->post_multipart))
goto failed;
+ /* these aren't needed past here */
+ if (ref1) {
+ free(ref1);
+ ref1 = 0;
+ }
+ if (ref2) {
+ free(ref2);
+ ref2 = 0;
+ }
+
#define APPEND(list, value) \
slist = curl_slist_append(list, value); \
if (!slist) \
@@ -336,6 +364,10 @@ struct fetch * fetch_start(char *url, char *referer,
failed:
free(host);
+ if (ref1)
+ free(ref1);
+ if (ref2)
+ free(ref2);
free(fetch->url);
free(fetch->referer);
free(fetch->post_urlenc);