summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortjp <tjp@ctrl-c.club>2024-01-10 11:05:59 -0700
committertjp <tjp@ctrl-c.club>2024-01-10 11:05:59 -0700
commit11ff0bb82e7fe99acea43ae1327ff97c28240209 (patch)
tree9a032f732f41ccc626a40bea1018f563da140d98
parentfd7d73df415f908bfaf2fc7847ab085552980a13 (diff)
fixes to input and redirect handling
-rw-r--r--actions.go74
1 files changed, 47 insertions, 27 deletions
diff --git a/actions.go b/actions.go
index 448ac06..4196232 100644
--- a/actions.go
+++ b/actions.go
@@ -2,6 +2,7 @@ package main
import (
"bytes"
+ "crypto/tls"
"errors"
"fmt"
"io"
@@ -114,7 +115,7 @@ func Reload(state *BrowserState, conf *Config) error {
urlStr, _ = gopherURL(state.Url)
}
- client := sliderule.NewClient(tlsConfig(state))
+ tlsConf := tlsConfig(state)
var response *sliderule.Response
var err error
@@ -126,42 +127,51 @@ func Reload(state *BrowserState, conf *Config) error {
body := io.LimitReader(bytes.NewBuffer(input), int64(len(input)))
state.Url.Fragment = ""
- response, err = client.Upload(state.Url.String(), body)
+ response, err = upload(state.Url.String(), body, tlsConf)
state.Url.Fragment = "prompt"
if err != nil {
return err
}
} else {
- response, err = client.Fetch(urlStr)
+ response, err = fetch(urlStr, tlsConf)
if err != nil {
return err
}
}
- if state.Url.Scheme == "gemini" {
- switch response.Status {
- case gemini.StatusInput:
- state.Readline.SetPrompt("input: ")
- line, err := state.Readline.Readline()
- if err != nil {
- return err
- }
-
- state.Url.RawQuery = url.QueryEscape(strings.TrimRight(line, "\n"))
- response, err = client.Fetch(state.Url.String())
- if err != nil {
- return err
- }
- case gemini.StatusSensitiveInput:
- line, err := state.Readline.ReadPassword("password: ")
- if err != nil {
- return err
- }
-
- state.Url.RawQuery = url.QueryEscape(strings.TrimRight(string(line), "\n"))
- response, err = client.Fetch(state.Url.String())
- if err != nil {
- return err
+outer:
+ for {
+ if state.Url.Scheme == "gemini" {
+ switch response.Status {
+ case gemini.StatusInput:
+ state.Readline.SetPrompt(response.Meta.(string) + " ")
+ line, err := state.Readline.Readline()
+ if err != nil {
+ return err
+ }
+
+ state.Url = response.Request.URL
+ state.Url.RawQuery = url.QueryEscape(strings.TrimRight(line, "\n"))
+ response, err = fetch(state.Url.String(), tlsConf)
+ if err != nil {
+ return err
+ }
+ case gemini.StatusSensitiveInput:
+ line, err := state.Readline.ReadPassword(response.Meta.(string) + " ")
+ if err != nil {
+ return err
+ }
+
+ state.Url = response.Request.URL
+ state.Url.RawQuery = url.QueryEscape(strings.TrimRight(string(line), "\n"))
+ response, err = fetch(state.Url.String(), tlsConf)
+ if err != nil {
+ return err
+ }
+ case gemini.StatusSuccess:
+ break outer
+ default:
+ return fmt.Errorf("gemini response %s: %s", gemini.StatusName(response.Status), response.Meta.(string))
}
}
}
@@ -180,6 +190,16 @@ func Reload(state *BrowserState, conf *Config) error {
return HandleResource(state, conf)
}
+func fetch(u string, tlsConf *tls.Config) (*sliderule.Response, error) {
+ tlsConf.ClientSessionCache = nil
+ return sliderule.NewClient(tlsConf).Fetch(u)
+}
+
+func upload(u string, body io.Reader, tlsConf *tls.Config) (*sliderule.Response, error) {
+ tlsConf.ClientSessionCache = nil
+ return sliderule.NewClient(tlsConf).Upload(u, body)
+}
+
func externalMessage() ([]byte, error) {
tmpf, err := os.CreateTemp("", "*")
if err != nil {