diff --git a/CHANGELOG.md b/CHANGELOG.md index 90d24a8..6860177 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The user's terminal theme colors are used by default (#181) - By default, non-gemini URI schemes are opened in the default application. This requires a config change for previous users, see the [wiki](https://github.com/makeworld-the-better-one/amfora/wiki/Handling-Other-URL-Schemes) (#207) - Windows uses paths set by `XDG` variables over `APPDATA` if they are set (#255) +- Treat status codes like 22 as equivalent to 20 as per the latest spec (#266) ## Removed - Favicon support (#199) @@ -41,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Regression where lists would not appear if `bullets = false` (#234, #235) - Support multiple bookmarks with the same name - Cert change message grammar: "an security" -> "a security" (#274) +- Display an error modal for status codes that can't be handled ## [1.8.0] - 2021-02-17 diff --git a/display/handlers.go b/display/handlers.go index e926c6e..4020e97 100644 --- a/display/handlers.go +++ b/display/handlers.go @@ -2,6 +2,7 @@ package display import ( "errors" + "fmt" "mime" "net" "net/url" @@ -381,12 +382,14 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) { // Could be a non 20 status code, or a different kind of document // Handle each status code - switch res.Status { + // Except 20, that's handled after the switch + status := gemini.CleanStatus(res.Status) + switch status { case 10, 11: var userInput string var ok bool - if res.Status == 10 { + if status == 10 { // Regular input userInput, ok = Input(res.Meta, false) } else { @@ -423,7 +426,7 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) { // Prompt before redirecting autoRedirect := justAddsSlash || viper.GetBool("a-general.auto_redirect") if redirect || (autoRedirect && numRedirects < 5) || YesNo("Follow redirect?\n"+redir) { - if res.Status == gemini.StatusRedirectPermanent { + if status == gemini.StatusRedirectPermanent { go cache.AddRedir(u, redir) } return ret(handleURL(t, redir, numRedirects+1)) @@ -468,6 +471,12 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) { case 62: Error("Certificate Not Valid", escapeMeta(res.Meta)) return ret("", false) + default: + if !gemini.StatusInRange(status) { + // Status code not in a valid range + Error("Status Code Error", fmt.Sprintf("Out of range status code: %d", status)) + return ret("", false) + } } // Status code 20, but not a document that can be displayed diff --git a/go.mod b/go.mod index 09a7631..4ca9052 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell/v2 v2.3.3 github.com/google/go-cmp v0.5.0 // indirect - github.com/makeworld-the-better-one/go-gemini v0.11.0 + github.com/makeworld-the-better-one/go-gemini v0.12.1 github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.3.1 // indirect github.com/mmcdole/gofeed v1.1.2 diff --git a/go.sum b/go.sum index 1d76995..bec5ded 100644 --- a/go.sum +++ b/go.sum @@ -138,8 +138,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/makeworld-the-better-one/go-gemini v0.11.0 h1:MNGiULJFvcqls9oCy40tE897hDeKvNmEK9i5kRucgQk= -github.com/makeworld-the-better-one/go-gemini v0.11.0/go.mod h1:F+3x+R1xeYK90jMtBq+U+8Sh64r2dHleDZ/en3YgSmg= +github.com/makeworld-the-better-one/go-gemini v0.12.1 h1:cWHvCHL31Caq3Rm9elCFFoQeyrn92Kv7KummsVxCOFg= +github.com/makeworld-the-better-one/go-gemini v0.12.1/go.mod h1:F+3x+R1xeYK90jMtBq+U+8Sh64r2dHleDZ/en3YgSmg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= diff --git a/subscriptions/subscriptions.go b/subscriptions/subscriptions.go index ecee735..ba99ddf 100644 --- a/subscriptions/subscriptions.go +++ b/subscriptions/subscriptions.go @@ -251,7 +251,9 @@ func getResource(url string) (string, *gemini.Response, error) { return url, nil, err } - if res.Status == gemini.StatusSuccess { + status := gemini.CleanStatus(res.Status) + + if status == gemini.StatusSuccess { // No redirects return url, res, nil } @@ -266,8 +268,8 @@ func getResource(url string) (string, *gemini.Response, error) { urls := make([]*urlPkg.URL, 0) // Loop through redirects - for (res.Status == gemini.StatusRedirectPermanent || res.Status == gemini.StatusRedirectTemporary) && i < 5 { - redirs = append(redirs, res.Status) + for (status == gemini.StatusRedirectPermanent || status == gemini.StatusRedirectTemporary) && i < 5 { + redirs = append(redirs, status) urls = append(urls, parsed) tmp, err := parsed.Parse(res.Meta) @@ -302,7 +304,7 @@ func getResource(url string) (string, *gemini.Response, error) { if i < 5 { // The server stopped redirecting after <5 redirects - if res.Status == gemini.StatusSuccess { + if status == gemini.StatusSuccess { // It ended by succeeding for j := range redirs {