summaryrefslogtreecommitdiff
path: root/actions.go
diff options
context:
space:
mode:
authortjp <tjp@ctrl-c.club>2024-01-14 19:54:15 -0700
committertjp <tjp@ctrl-c.club>2024-01-14 19:54:15 -0700
commitdfebc9013b5414e9a3c5f940704e831c31ce35d2 (patch)
treed9b34c1714ecc78f9546ec89907d1b5c8c4a34a6 /actions.go
parentb173ca9cb2a6d463efda27cf143a81e0d6caedb8 (diff)
fixes
Diffstat (limited to 'actions.go')
-rw-r--r--actions.go62
1 files changed, 44 insertions, 18 deletions
diff --git a/actions.go b/actions.go
index fa861fd..c91e479 100644
--- a/actions.go
+++ b/actions.go
@@ -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 {