From e76140557d804016563be73d8220c46a9c42ca7a Mon Sep 17 00:00:00 2001 From: James Bursa Date: Sat, 13 Jan 2007 00:19:02 +0000 Subject: [PATCH] Add fetch_http_code() to retrieve the HTTP status code of a fetch. svn path=/trunk/netsurf/; revision=3139 --- content/fetch.c | 66 ++++++++++++++++++++++++++++++------------------- content/fetch.h | 1 + 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/content/fetch.c b/content/fetch.c index cbff20644..0ab8ae843 100644 --- a/content/fetch.c +++ b/content/fetch.c @@ -1,7 +1,7 @@ /* * This file is part of NetSurf, http://netsurf-browser.org/ * Licensed under the GNU General Public License, - * http://www.opensource.org/licenses/gpl-license + * http://www.opensource.org/licenses/gpl-license * Copyright 2006 Daniel Silverstone * Copyright 2004 James Bursa * Copyright 2003 Phil Mellor @@ -72,9 +72,9 @@ struct fetch { char *host; /**< Host part of URL. */ char *location; /**< Response Location header, or 0. */ unsigned long content_length; /**< Response Content-Length, or 0. */ - long http_code; /**< HTTP response code, or 0. */ + long http_code; /**< HTTP response code, or 0. */ char *cookie_string; /**< Cookie string for this fetch */ - char *realm; /**< HTTP Auth Realm */ + char *realm; /**< HTTP Auth Realm */ char *post_urlenc; /**< Url encoded POST string, or 0. */ struct curl_httppost *post_multipart; /**< Multipart post data, or 0. */ struct cache_data cachedata; /**< Cache control data */ @@ -90,7 +90,7 @@ struct fetch { struct cache_handle { CURL *handle; /**< The cached cURL handle */ - char *host; /**< The host for which this handle is cached */ + char *host; /**< The host for which this handle is cached */ struct cache_handle *r_prev; /**< Previous cached handle in ring. */ struct cache_handle *r_next; /**< Next cached handle in ring. */ @@ -101,7 +101,7 @@ CURLM *fetch_curl_multi; /**< Global cURL multi handle. */ /** Curl handle with default options set; not used for transfers. */ static CURL *fetch_blank_curl; static struct fetch *fetch_ring = 0; /**< Ring of active fetches. */ -static struct fetch *queue_ring = 0; /**< Ring of queued fetches */ +static struct fetch *queue_ring = 0; /**< Ring of queued fetches */ static struct cache_handle *handle_ring = 0; /**< Ring of cached handles */ static char fetch_error_buffer[CURL_ERROR_SIZE]; /**< Error buffer for cURL. */ @@ -134,12 +134,12 @@ static int fetch_cert_verify_callback(X509_STORE_CTX *x509_ctx, void *parm); */ #define RING_INSERT(ring,element) \ LOG(("RING_INSERT(%s, %p(%s))", #ring, element, element->host)); \ - if (ring) { \ + if (ring) { \ element->r_next = ring; \ element->r_prev = ring->r_prev; \ ring->r_prev = element; \ element->r_prev->r_next = element; \ - } else \ + } else \ ring = element->r_prev = element->r_next = element /** Remove the given element from the specified ring. @@ -1046,22 +1046,23 @@ int fetch_curl_progress(void *clientp, double dltotal, double dlnow, size_t fetch_curl_data(void *data, size_t size, size_t nmemb, struct fetch *f) { - /* ensure we only have to get this information once */ - if (!f->http_code) - { - CURLcode code; - code = curl_easy_getinfo(f->curl_handle, CURLINFO_HTTP_CODE, - &f->http_code); - assert(code == CURLE_OK); - } + CURLcode code; - /* ignore body if this is a 401 reply by skipping it and reset - the HTTP response code to enable follow up fetches */ - if (f->http_code == 401) - { - f->http_code = 0; - return size * nmemb; - } + /* ensure we only have to get this information once */ + if (!f->http_code) + { + code = curl_easy_getinfo(f->curl_handle, CURLINFO_HTTP_CODE, + &f->http_code); + assert(code == CURLE_OK); + } + + /* ignore body if this is a 401 reply by skipping it and reset + the HTTP response code to enable follow up fetches */ + if (f->http_code == 401) + { + f->http_code = 0; + return size * nmemb; + } LOG(("fetch %p, size %u", f, size * nmemb)); @@ -1247,8 +1248,13 @@ bool fetch_process_headers(struct fetch *f) if (f->cachedata.res_time == 0) f->cachedata.res_time = time(0); - code = curl_easy_getinfo(f->curl_handle, CURLINFO_HTTP_CODE, &http_code); - assert(code == CURLE_OK); + if (!f->http_code) + { + code = curl_easy_getinfo(f->curl_handle, CURLINFO_HTTP_CODE, + &f->http_code); + assert(code == CURLE_OK); + } + http_code = f->http_code; LOG(("HTTP status code %li", http_code)); if (http_code == 304 && !f->post_urlenc && !f->post_multipart) { @@ -1265,7 +1271,7 @@ bool fetch_process_headers(struct fetch *f) return true; } - /* handle HTTP 401 (Authentication errors) */ + /* handle HTTP 401 (Authentication errors) */ #ifdef WITH_AUTH if (http_code == 401) { f->callback(FETCH_AUTH, f->p, f->realm,0); @@ -1442,6 +1448,16 @@ void fetch_change_callback(struct fetch *fetch, } +/** + * Get the HTTP response code. + */ + +long fetch_http_code(struct fetch *fetch) +{ + return fetch->http_code; +} + + #ifdef WITH_SSL /** * OpenSSL Certificate verification callback diff --git a/content/fetch.h b/content/fetch.h index 4f8795add..331207fe2 100644 --- a/content/fetch.h +++ b/content/fetch.h @@ -82,5 +82,6 @@ void fetch_change_callback(struct fetch *fetch, void (*callback)(fetch_msg msg, void *p, const void *data, unsigned long size), void *p); +long fetch_http_code(struct fetch *fetch); #endif