diff --git a/src/gmrequest.c b/src/gmrequest.c index a1cf1a8e..8626403f 100644 --- a/src/gmrequest.c +++ b/src/gmrequest.c @@ -493,7 +493,7 @@ void deinit_GmRequest(iGmRequest *d) { }  void setUrl_GmRequest(iGmRequest *d, const iString *url) { - set_String(&d->url, url); + set_String(&d->url, urlFragmentStripped_String(url)); /* Encode hostname to Punycode here because we want to submit the Punycode domain name in the request. (TODO: Pending possible Gemini spec change.) */ punyEncodeUrlHost_String(&d->url); diff --git a/src/gmutil.c b/src/gmutil.c index 0f1bc803..72074278 100644 --- a/src/gmutil.c +++ b/src/gmutil.c @@ -49,11 +49,12 @@ void init_Url(iUrl *d, const iString *text) { iRegExpMatch m; init_RegExpMatch(&m); if (matchString_RegExp(urlPattern_, text, &m)) { - d->scheme = capturedRange_RegExpMatch(&m, 2); - d->host = capturedRange_RegExpMatch(&m, 4); - d->port = (iRangecc){ d->host.end, d->host.end }; - d->path = capturedRange_RegExpMatch(&m, 5); - d->query = capturedRange_RegExpMatch(&m, 6); + d->scheme = capturedRange_RegExpMatch(&m, 2); + d->host = capturedRange_RegExpMatch(&m, 4); + d->port = (iRangecc){ d->host.end, d->host.end }; + d->path = capturedRange_RegExpMatch(&m, 5); + d->query = capturedRange_RegExpMatch(&m, 6); + d->fragment = capturedRange_RegExpMatch(&m, 8); /* starts with a hash */ /* Check if the authority contains a port. */ init_RegExpMatch(&m); if (matchRange_RegExp(authPattern_, d->host, &m)) { @@ -92,6 +93,7 @@ void stripDefaultUrlPort_String(iString *d) { }  const iString *urlFragmentStripped_String(const iString *d) { + /* Note: Could use `iUrl` here and leave out the fragment. */ const size_t fragPos = indexOf_String(d, '#'); if (fragPos != iInvalidPos) { return collect_String(newRange_String((iRangecc){ constBegin_String(d), @@ -264,6 +266,7 @@ const iString *absoluteUrl_String(const iString *d, const iString *urlMaybeRelat appendRange_String(absolute, orig.path); } appendRange_String(absolute, rel.query); + appendRange_String(absolute, rel.fragment); normalize_String(absolute); cleanUrlPath_String(absolute); return absolute; diff --git a/src/gmutil.h b/src/gmutil.h index 3fd1268d..1caf2445 100644 --- a/src/gmutil.h +++ b/src/gmutil.h @@ -96,6 +96,7 @@ struct Impl_Url { iRangecc port; iRangecc path; iRangecc query; + iRangecc fragment; };  void init_Url (iUrl *, const iString *text); diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 7fffc214..79a77f61 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -3345,7 +3345,7 @@ void deserializeState_DocumentWidget(iDocumentWidget *d, iStream *ins) {  void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { d->flags &= ~showLinkNumbers_DocumentWidgetFlag; - set_String(d->mod.url, url); + set_String(d->mod.url, urlFragmentStripped_String(url)); /* See if there a username in the URL. */ parseUser_DocumentWidget_(d); if (!isFromCache || !updateFromHistory_DocumentWidget_(d)) {