diff options
| -rw-r--r-- | actions.go | 74 |
1 files changed, 47 insertions, 27 deletions
@@ -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 { |
