diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-08-03 21:13:19 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-08-03 21:13:19 +0100 |
commit | 09eb89e3c3b7ce98d66369ca5d6c41283caf9873 (patch) | |
tree | 7bc9d9015bdec9ad99c6373bbebe26cf215f960b /content/llcache.c | |
parent | 84a9c5accf63a5cfdbf288f3aba137fc5945aa02 (diff) | |
download | netsurf-09eb89e3c3b7ce98d66369ca5d6c41283caf9873.tar.gz netsurf-09eb89e3c3b7ce98d66369ca5d6c41283caf9873.tar.bz2 |
Migrate query dispatch up from llcache to hlcache
As a first step in refactoring query handling to be managed
by `browser_window`, this migrates the calling of the query
handler from the llcache object code up to the hlcache.
In theory this may result in multiple queries happening for one
object, but we mitigate multiple-responses in the llcache so
all should be well.
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'content/llcache.c')
-rw-r--r-- | content/llcache.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/content/llcache.c b/content/llcache.c index 34b43d702..71282f2dd 100644 --- a/content/llcache.c +++ b/content/llcache.c @@ -206,12 +206,6 @@ struct llcache_object { * Core llcache control context. */ struct llcache_s { - /** Handler for fetch-related queries */ - llcache_query_callback query_cb; - - /** Data for fetch-related query handler */ - void *query_cb_pw; - /** Head of the low-level cached object list */ llcache_object *cached_objects; @@ -2267,10 +2261,18 @@ static nserror llcache_query_handle_response(bool proceed, void *cbpw) llcache_event event; llcache_object *object = cbpw; + if (object->fetch.outstanding_query == false) { + /* This object has already had its query answered */ + return NSERROR_OK; + } + object->fetch.outstanding_query = false; + /* Tell all the users that we're leaving query state */ + event.type = LLCACHE_EVENT_QUERY_FINISHED; + /* Refetch, using existing fetch parameters, if client allows us to */ - if (proceed) + if (llcache_send_event_to_users(object, &event) == NSERROR_OK && proceed) return llcache_object_refetch(object); /* Invalidate cache-control data */ @@ -2317,38 +2319,31 @@ static nserror llcache_fetch_auth(llcache_object *object, const char *realm) auth = urldb_get_auth_details(object->url, realm); if (auth == NULL || object->fetch.tried_with_auth == true) { + llcache_query query; + llcache_event event; + /* No authentication details, or tried what we had, so ask */ object->fetch.tried_with_auth = false; - if (llcache->query_cb != NULL) { - llcache_query query; - - /* Emit query for authentication details */ - query.type = LLCACHE_QUERY_AUTH; - query.url = object->url; - query.data.auth.realm = realm; - - object->fetch.outstanding_query = true; + /* Emit query for authentication details */ + query.type = LLCACHE_QUERY_AUTH; + query.url = object->url; + query.data.auth.realm = realm; - error = llcache->query_cb(&query, llcache->query_cb_pw, - llcache_query_handle_response, object); - if (error != NSERROR_OK) { - /* do not continue if error querying user */ - error = llcache_query_handle_response(false, - object); - } - } else { - llcache_event event; + /* Construct the query event */ + event.type = LLCACHE_EVENT_QUERY; + event.data.query.query = &query; + event.data.query.cb = llcache_query_handle_response; + event.data.query.cb_pw = object; - /* Mark object complete */ - object->fetch.state = LLCACHE_FETCH_COMPLETE; + object->fetch.outstanding_query = true; - /* Inform client(s) that object fetch failed */ - event.type = LLCACHE_EVENT_ERROR; - /** \todo More appropriate error message */ - event.data.msg = messages_get("FetchFailed"); + error = llcache_send_event_to_users(object, &event); - error = llcache_send_event_to_users(object, &event); + if (error != NSERROR_OK) { + /* do not continue if error querying user */ + error = llcache_query_handle_response(false, + object); } } else { /* Flag that we've tried to refetch with credentials, so @@ -2383,8 +2378,9 @@ static nserror llcache_fetch_cert_error(llcache_object *object, object->fetch.tainted_tls = true; /* Only give the user a chance if HSTS isn't in use for this fetch */ - if (object->fetch.hsts_in_use == false && llcache->query_cb != NULL) { + if (object->fetch.hsts_in_use == false) { llcache_query query; + llcache_event event; /* Emit query for TLS */ query.type = LLCACHE_QUERY_SSL; @@ -2392,10 +2388,16 @@ static nserror llcache_fetch_cert_error(llcache_object *object, query.data.ssl.certs = certs; query.data.ssl.num = num; + /* Construct the query event */ + event.type = LLCACHE_EVENT_QUERY; + event.data.query.query = &query; + event.data.query.cb = llcache_query_handle_response; + event.data.query.cb_pw = object; + object->fetch.outstanding_query = true; - error = llcache->query_cb(&query, llcache->query_cb_pw, - llcache_query_handle_response, object); + error = llcache_send_event_to_users(object, &event); + if (error != NSERROR_OK) { /* do not continue if error querying user */ error = llcache_query_handle_response(false, object); @@ -3496,8 +3498,6 @@ llcache_initialise(const struct llcache_parameters *prm) return NSERROR_NOMEM; } - llcache->query_cb = prm->cb; - llcache->query_cb_pw = prm->cb_ctx; llcache->limit = prm->limit; llcache->minimum_lifetime = prm->minimum_lifetime; llcache->minimum_bandwidth = prm->minimum_bandwidth; |