diff options
Diffstat (limited to 'content/fetchers/about.c')
-rw-r--r-- | content/fetchers/about.c | 136 |
1 files changed, 136 insertions, 0 deletions
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 @@ -95,6 +95,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 */ static inline bool @@ -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, + "<html>\n<head>\n" + "<title>%s</title>\n" + "<link rel=\"stylesheet\" type=\"text/css\" " + "href=\"resource:internal.css\">\n" + "</head>\n" + "<body id =\"fetcherror\">\n" + "<h1>%s</h1>\n", + title, title); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, + "<form method=\"post\"" + " enctype=\"multipart/form-data\">"); + 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, "<div><p>%s</p></div>", description); + free(description); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + } + res = ssenddataf(ctx, "<div><p>%s</p></div>", reason); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, + "<div id=\"buttons\">" + "<input type=\"submit\" id=\"back\" name=\"back\" " + "value=\"%s\" class=\"default-action\">" + "<input type=\"submit\" id=\"retry\" name=\"retry\" " + "value=\"%s\">" + "</div>", + 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, + "<input type=\"hidden\" name=\"siteurl\" value=\"%s\">", + url_s); + free(url_s); + if (res != NSERROR_OK) { + goto fetch_about_query_fetcherror_handler_aborted; + } + + res = ssenddataf(ctx, "</form></body>\n</html>\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 } }; |