summaryrefslogtreecommitdiff
path: root/src/ui/documentwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r--src/ui/documentwidget.c15
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
756void setRedirectCount_DocumentWidget(iDocumentWidget *d, int count) {
757 d->redirectCount = count;
758}
759
753iBool isRequestOngoing_DocumentWidget(const iDocumentWidget *d) { 760iBool 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);