diff options
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 7f76a436..b954040a 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -183,6 +183,7 @@ struct Impl_DocumentWidget { | |||
183 | int certFlags; | 183 | int certFlags; |
184 | iDate certExpiry; | 184 | iDate certExpiry; |
185 | iString * certSubject; | 185 | iString * certSubject; |
186 | int redirectCount; | ||
186 | iBool selecting; | 187 | iBool selecting; |
187 | iRangecc selectMark; | 188 | iRangecc selectMark; |
188 | iRangecc foundMark; | 189 | iRangecc foundMark; |
@@ -221,6 +222,7 @@ void init_DocumentWidget(iDocumentWidget *d) { | |||
221 | d->isRequestUpdated = iFalse; | 222 | d->isRequestUpdated = iFalse; |
222 | d->media = new_ObjectList(); | 223 | d->media = new_ObjectList(); |
223 | d->doc = new_GmDocument(); | 224 | d->doc = new_GmDocument(); |
225 | d->redirectCount = 0; | ||
224 | d->initNormScrollY = 0; | 226 | d->initNormScrollY = 0; |
225 | d->scrollY = 0; | 227 | d->scrollY = 0; |
226 | d->smoothScroll = 0; | 228 | d->smoothScroll = 0; |
@@ -512,6 +514,7 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode | |||
512 | if (meta) { | 514 | if (meta) { |
513 | switch (code) { | 515 | switch (code) { |
514 | case nonGeminiRedirect_GmStatusCode: | 516 | case nonGeminiRedirect_GmStatusCode: |
517 | case tooManyRedirects_GmStatusCode: | ||
515 | appendFormat_String(src, "\n=> %s\n", cstr_String(meta)); | 518 | appendFormat_String(src, "\n=> %s\n", cstr_String(meta)); |
516 | break; | 519 | break; |
517 | case failedToOpenFile_GmStatusCode: | 520 | case failedToOpenFile_GmStatusCode: |
@@ -750,6 +753,10 @@ void setInitialScroll_DocumentWidget(iDocumentWidget *d, float normScrollY) { | |||
750 | d->initNormScrollY = normScrollY; | 753 | d->initNormScrollY = normScrollY; |
751 | } | 754 | } |
752 | 755 | ||
756 | void setRedirectCount_DocumentWidget(iDocumentWidget *d, int count) { | ||
757 | d->redirectCount = count; | ||
758 | } | ||
759 | |||
753 | iBool isRequestOngoing_DocumentWidget(const iDocumentWidget *d) { | 760 | iBool isRequestOngoing_DocumentWidget(const iDocumentWidget *d) { |
754 | return d->state == fetching_RequestState || d->state == receivedPartialResponse_RequestState; | 761 | return d->state == fetching_RequestState || d->state == receivedPartialResponse_RequestState; |
755 | } | 762 | } |
@@ -849,8 +856,12 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
849 | else { | 856 | else { |
850 | /* Only accept redirects that use gemini scheme. */ | 857 | /* Only accept redirects that use gemini scheme. */ |
851 | const iString *dstUrl = absoluteUrl_String(d->mod.url, meta_GmRequest(d->request)); | 858 | const iString *dstUrl = absoluteUrl_String(d->mod.url, meta_GmRequest(d->request)); |
852 | if (equalCase_Rangecc(urlScheme_String(dstUrl), "gemini")) { | 859 | if (d->redirectCount >= 5) { |
853 | postCommandf_App("open redirect:1 url:%s", cstr_String(dstUrl)); | 860 | showErrorPage_DocumentWidget_(d, tooManyRedirects_GmStatusCode, dstUrl); |
861 | } | ||
862 | else if (equalCase_Rangecc(urlScheme_String(dstUrl), "gemini")) { | ||
863 | postCommandf_App( | ||
864 | "open redirect:%d url:%s", d->redirectCount + 1, cstr_String(dstUrl)); | ||
854 | } | 865 | } |
855 | else { | 866 | else { |
856 | showErrorPage_DocumentWidget_(d, nonGeminiRedirect_GmStatusCode, dstUrl); | 867 | showErrorPage_DocumentWidget_(d, nonGeminiRedirect_GmStatusCode, dstUrl); |