From 4b0c3f0efef2239dd5d62a9e73eeec4037c056a4 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Wed, 30 Oct 2019 18:56:38 +0000 Subject: add internal query handler for fetch errors Any errors from the fetch which are not already handled are reported with an internal query page instead of a modal dialog. This is much less invasive for the user and much more in keeping with how this is handled by other browsers. The handler is similar to the timeout handler but the functionality is kept separate as it is intended timeout handling be extended in future. --- content/fetchers/about.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) (limited to 'content/fetchers') diff --git a/content/fetchers/about.c b/content/fetchers/about.c index d8a5fa793..e98c6ec35 100644 --- a/content/fetchers/about.c +++ b/content/fetchers/about.c @@ -94,6 +94,11 @@ static const char *privacy_description_fallback = "A privacy error occurred whil */ static const char *timeout_description_fallback = "A connection to %s could not be established. The site may be temporarily unavailable or too busy to respond."; +/** + * fetcherror query description if messages fails to retrieve usable text + */ +static const char *fetcherror_description_fallback = "An error occoured when connecting to %s"; + /** * issue fetch callbacks with locking */ @@ -1239,6 +1244,130 @@ fetch_about_query_timeout_handler_aborted: } +/** + * Handler to generate about scheme fetch error query page + * + * \param ctx The fetcher context. + * \return true if handled false if aborted. + */ +static bool +fetch_about_query_fetcherror_handler(struct fetch_about_context *ctx) +{ + nserror res; + char *url_s; + size_t url_l; + const char *reason = ""; + const char *title; + struct nsurl *siteurl = NULL; + char *description = NULL; + const struct fetch_multipart_data *curmd; /* mutipart data iterator */ + + /* extract parameters from multipart post data */ + curmd = ctx->multipart; + while (curmd != NULL) { + if (strcmp(curmd->name, "siteurl") == 0) { + res = nsurl_create(curmd->value, &siteurl); + if (res != NSERROR_OK) { + return fetch_about_srverror(ctx); + } + } else if (strcmp(curmd->name, "reason") == 0) { + reason = curmd->value; + } + curmd = curmd->next; + } + + if (siteurl == NULL) { + return fetch_about_srverror(ctx); + } + + /* content is going to return ok */ + fetch_set_http_code(ctx->fetchh, 200); + + /* content type */ + if (fetch_about_send_header(ctx, "Content-Type: text/html; charset=utf-8")) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + title = messages_get("FetchErrorTitle"); + res = ssenddataf(ctx, + "\n\n" + "%s\n" + "\n" + "\n" + "\n" + "

%s

\n", + title, title); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, + "
"); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = get_query_description(siteurl, + "FetchErrorDescription", + fetcherror_description_fallback, + &description); + if (res == NSERROR_OK) { + res = ssenddataf(ctx, "

%s

", description); + free(description); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + } + res = ssenddataf(ctx, "

%s

", reason); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, + "
" + "" + "" + "
", + messages_get("Backtoprevious"), + messages_get("TryAgain")); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = nsurl_get(siteurl, NSURL_COMPLETE, &url_s, &url_l); + if (res != NSERROR_OK) { + url_s = strdup(""); + } + res = ssenddataf(ctx, + "", + url_s); + free(url_s); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, "
\n\n"); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + fetch_about_send_finished(ctx); + + nsurl_unref(siteurl); + + return true; + +fetch_about_query_fetcherror_handler_aborted: + nsurl_unref(siteurl); + + return false; +} + + /* Forward declaration because this handler requires the handler table. */ static bool fetch_about_about_handler(struct fetch_about_context *ctx); @@ -1352,6 +1481,13 @@ struct about_handlers about_handler_list[] = { NULL, fetch_about_query_timeout_handler, true + }, + { + "query/fetcherror", + SLEN("query/fetcherror"), + NULL, + fetch_about_query_fetcherror_handler, + true } }; -- cgit v1.2.3