diff options
| author | tjp <tjp@ctrl-c.club> | 2024-01-14 19:54:15 -0700 |
|---|---|---|
| committer | tjp <tjp@ctrl-c.club> | 2024-01-14 19:54:15 -0700 |
| commit | dfebc9013b5414e9a3c5f940704e831c31ce35d2 (patch) | |
| tree | d9b34c1714ecc78f9546ec89907d1b5c8c4a34a6 /actions.go | |
| parent | b173ca9cb2a6d463efda27cf143a81e0d6caedb8 (diff) | |
fixes
Diffstat (limited to 'actions.go')
| -rw-r--r-- | actions.go | 62 |
1 files changed, 44 insertions, 18 deletions
@@ -2,6 +2,7 @@ package main import ( "bytes" + "context" "crypto/tls" "errors" "fmt" @@ -14,6 +15,7 @@ import ( "strconv" "strings" "syscall" + "time" "tildegit.org/tjp/sliderule" "tildegit.org/tjp/sliderule/gemini" @@ -72,22 +74,25 @@ It was written by TJP and released to the public domain. } func Navigate(state *BrowserState, target *url.URL, navIndex int, conf *Config) error { - hist := state.History - - if hist.Url == nil || target.String() != hist.Url.String() { - state.History = &History{ - Url: target, - Depth: hist.Depth + 1, - Back: hist, - NavIndex: navIndex, - } - hist.Forward = state.History + if state.Url == nil || target.String() != state.Url.String() { + pushHistory(state, target, navIndex) } state.Modal = nil return Reload(state, conf) } +func pushHistory(state *BrowserState, target *url.URL, navIndex int) { + hist := state.History + state.History = &History{ + Url: target, + Depth: hist.Depth + 1, + Back: hist, + NavIndex: navIndex, + } + hist.Forward = state.History +} + func gopherURL(u *url.URL) (string, sliderule.Status) { if u.Scheme != "gopher" || len(u.Path) < 2 || !strings.HasPrefix(u.Path, "/") { return u.String(), 0 @@ -173,6 +178,8 @@ outer: default: return fmt.Errorf("gemini response %s: %s", gemini.StatusName(response.Status), response.Meta.(string)) } + } else { + break } } @@ -190,10 +197,22 @@ outer: return HandleResource(state, conf) } +func requestCtx(timeout time.Duration) (context.Context, context.CancelFunc) { + ctx := context.Background() + if timeout > 0 { + return context.WithTimeout(ctx, timeout) + } + return ctx, func() {} +} + func fetch(state *BrowserState, u string, tlsConf *tls.Config) (*sliderule.Response, error) { + ctx, cancel := requestCtx(state.Timeout) + defer cancel() + tlsConf.ClientSessionCache = nil - response, err := sliderule.NewClient(tlsConf).Fetch(u) + response, err := sliderule.NewClient(tlsConf).Fetch(ctx, u) var tofuErr *TOFUViolation + if errors.As(err, &tofuErr) { writeError(err.Error()) state.Readline.SetPrompt("Trust new certificate instead (y/n)? [n] ") @@ -210,7 +229,9 @@ func fetch(state *BrowserState, u string, tlsConf *tls.Config) (*sliderule.Respo return nil, err } - return sliderule.NewClient(tlsConf).Fetch(u) + ctx, cancel = requestCtx(state.Timeout) + defer cancel() + return sliderule.NewClient(tlsConf).Fetch(ctx, u) } else if err != nil { return nil, err } @@ -218,8 +239,11 @@ func fetch(state *BrowserState, u string, tlsConf *tls.Config) (*sliderule.Respo } func upload(state *BrowserState, u string, body io.Reader, tlsConf *tls.Config) (*sliderule.Response, error) { + ctx, cancel := requestCtx(state.Timeout) + defer cancel() + tlsConf.ClientSessionCache = nil - response, err := sliderule.NewClient(tlsConf).Upload(u, body) + response, err := sliderule.NewClient(tlsConf).Upload(ctx, u, body) var tofuErr *TOFUViolation if errors.As(err, &tofuErr) { writeError(err.Error()) @@ -237,7 +261,9 @@ func upload(state *BrowserState, u string, body io.Reader, tlsConf *tls.Config) return nil, err } - return sliderule.NewClient(tlsConf).Upload(u, body) + ctx, cancel = requestCtx(state.Timeout) + defer cancel() + return sliderule.NewClient(tlsConf).Upload(ctx, u, body) } else if err != nil { return nil, err } @@ -306,16 +332,16 @@ func back(state *BrowserState) error { return nil } -func Back(state *BrowserState, num int) error { +func Back(state *BrowserState, conf *Config, num int) error { for i := 0; i < num; i += 1 { if err := back(state); err != nil { return err } } - return print(state) + return HandleResource(state, conf) } -func Forward(state *BrowserState, num int) error { +func Forward(state *BrowserState, conf *Config, num int) error { for i := 0; i < num; i += 1 { if state.Forward == nil { return ErrNoNextHistory @@ -324,7 +350,7 @@ func Forward(state *BrowserState, num int) error { } state.Modal = nil - return print(state) + return HandleResource(state, conf) } func Next(state *BrowserState, conf *Config) error { |
