Use new go-gemini to handle invalid status codes, show error modal for out of range ones

Ref #266
This commit is contained in:
makeworld 2021-12-07 19:07:20 -05:00
parent 790d7ace6c
commit 1c4d13b055
5 changed files with 23 additions and 10 deletions

View File

@ -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

View File

@ -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

2
go.mod
View File

@ -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

4
go.sum
View File

@ -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=

View File

@ -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 {