From c715da2cdea68d293af44d2799d979e96e02ccfe Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 27 Oct 2020 22:18:23 +0200 Subject: Added a network/TLS error page There is now an error page shown when the TLS request fails for some reason. Error page theming is also updated at the time when the error page is composed. --- src/gmrequest.c | 10 ++++++++-- src/gmutil.c | 4 ++++ src/gmutil.h | 2 ++ src/ui/documentwidget.c | 24 ++++++++++++++---------- 4 files changed, 28 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/gmrequest.c b/src/gmrequest.c index 3faa2833..bb6ac23e 100644 --- a/src/gmrequest.c +++ b/src/gmrequest.c @@ -111,7 +111,8 @@ enum iGmRequestState { initialized_GmRequestState, receivingHeader_GmRequestState, receivingBody_GmRequestState, - finished_GmRequestState + finished_GmRequestState, + failure_GmRequestState, }; struct Impl_GmRequest { @@ -301,7 +302,12 @@ static void requestFinished_GmRequest_(iAnyObject *obj) { } SDL_RemoveTimer(d->timeoutId); d->timeoutId = 0; - d->state = finished_GmRequestState; + d->state = (status_TlsRequest(d->req) == error_TlsRequestStatus ? failure_GmRequestState + : finished_GmRequestState); + if (d->state == failure_GmRequestState) { + d->resp.statusCode = tlsFailure_GmStatusCode; + set_String(&d->resp.meta, errorMessage_TlsRequest(d->req)); + } checkServerCertificate_GmRequest_(d); unlock_Mutex(&d->mutex); iNotifyAudience(d, finished, GmRequestFinished); diff --git a/src/gmutil.c b/src/gmutil.c index 43586e55..5f09a176 100644 --- a/src/gmutil.c +++ b/src/gmutil.c @@ -237,6 +237,10 @@ static const struct { "Too Many Redirects", "You may be stuck in a redirection loop. The next redirected URL is below if you " "want to continue manually."} }, + { tlsFailure_GmStatusCode, + { 0x1f5a7, /* networked computers */ + "Network/TLS Failure", + "We could not communicate with the requested host." } }, { temporaryFailure_GmStatusCode, { 0x1f50c, /* electric plug */ "Temporary Failure", diff --git a/src/gmutil.h b/src/gmutil.h index 88572f22..8b4f7033 100644 --- a/src/gmutil.h +++ b/src/gmutil.h @@ -40,6 +40,8 @@ enum iGmStatusCode { failedToOpenFile_GmStatusCode, unknownStatusCode_GmStatusCode, invalidLocalResource_GmStatusCode, + tlsFailure_GmStatusCode, + none_GmStatusCode = 0, /* general status code categories */ categoryInput_GmStatusCode = 1, diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 9e8e644e..60e08459 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -666,6 +666,16 @@ static void setSource_DocumentWidget_(iDocumentWidget *d, const iString *source) refresh_Widget(as_Widget(d)); } +static void updateTheme_DocumentWidget_(iDocumentWidget *d) { + if (isEmpty_String(d->titleUser)) { + setThemeSeed_GmDocument(d->doc, + collect_Block(newRange_Block(urlHost_String(d->mod.url)))); + } + else { + setThemeSeed_GmDocument(d->doc, &d->titleUser->chars); + } +} + static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode code, const iString *meta) { iString *src = collectNewCStr_String("# "); @@ -678,6 +688,9 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode case tooManyRedirects_GmStatusCode: appendFormat_String(src, "\n=> %s\n", cstr_String(meta)); break; + case tlsFailure_GmStatusCode: + appendFormat_String(src, "\n\n>%s\n", cstr_String(meta)); + break; case failedToOpenFile_GmStatusCode: case certificateNotValid_GmStatusCode: appendFormat_String(src, "\n\n%s", cstr_String(meta)); @@ -702,21 +715,12 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode } } setSource_DocumentWidget_(d, src); + updateTheme_DocumentWidget_(d); init_Anim(&d->scrollY, 0); init_Anim(&d->sideOpacity, 0); d->state = ready_RequestState; } -static void updateTheme_DocumentWidget_(iDocumentWidget *d) { - if (isEmpty_String(d->titleUser)) { - setThemeSeed_GmDocument(d->doc, - collect_Block(newRange_Block(urlHost_String(d->mod.url)))); - } - else { - setThemeSeed_GmDocument(d->doc, &d->titleUser->chars); - } -} - static void updateFetchProgress_DocumentWidget_(iDocumentWidget *d) { iLabelWidget *prog = findWidget_App("document.progress"); const size_t dlSize = d->request ? size_Block(body_GmRequest(d->request)) : 0; -- cgit v1.2.3