fixes to input and redirect handling
This commit is contained in:
parent
fd7d73df41
commit
11ff0bb82e
70
actions.go
70
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
|
||||
}
|
||||
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 {
|
||||
|
|
Loading…
Reference in New Issue