fixes to input and redirect handling

This commit is contained in:
tjp 2024-01-10 11:05:59 -07:00
parent fd7d73df41
commit 11ff0bb82e
1 changed files with 45 additions and 25 deletions

View File

@ -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
}
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.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 = 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.RawQuery = url.QueryEscape(strings.TrimRight(string(line), "\n"))
response, err = client.Fetch(state.Url.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 {