accept -u to set Basic Auth on forwarded req

This commit is contained in:
Bel LaPointe
2026-02-23 17:53:35 -07:00
parent 68cbaa03e3
commit 89801782fb
2 changed files with 15 additions and 9 deletions

16
main.go
View File

@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"context" "context"
"database/sql" "database/sql"
"encoding/base64"
"encoding/json" "encoding/json"
"flag" "flag"
"io" "io"
@@ -29,6 +30,7 @@ var httpc = &http.Client{
type Handler struct { type Handler struct {
tmpl *template.Template tmpl *template.Template
target *url.URL target *url.URL
targetBasicAuth string
idempotency *sql.DB idempotency *sql.DB
} }
@@ -57,7 +59,7 @@ func (h Handler) serveHTTP(w http.ResponseWriter, r *http.Request) error {
log.Println("!", err) log.Println("!", err)
} }
resp, err := proxy(h.target, r, io.NopCloser(bytes.NewReader(b))) resp, err := proxy(h.target, h.targetBasicAuth, r, io.NopCloser(bytes.NewReader(b)))
if err != nil { if err != nil {
return err return err
} }
@@ -79,16 +81,17 @@ func main() {
p := fs.Int("p", 28080, "port") p := fs.Int("p", 28080, "port")
t := fs.String("t", "{{ . }}", "template") t := fs.String("t", "{{ . }}", "template")
y := fs.String("y", "http://localhost:41912", "target") y := fs.String("y", "http://localhost:41912", "target")
targetBasicAuth := fs.String("u", "", "user:pass target-basic-auth")
db := fs.String("db", "/tmp/json-adapter.db", "sqlite db for idempotency") db := fs.String("db", "/tmp/json-adapter.db", "sqlite db for idempotency")
if err := fs.Parse(os.Args[1:]); err != nil { if err := fs.Parse(os.Args[1:]); err != nil {
panic(err) panic(err)
} }
if err := run(*p, *t, *y, *db); err != nil { if err := run(*p, *t, *y, *targetBasicAuth, *db); err != nil {
panic(err) panic(err)
} }
} }
func run(p int, t string, y string, db string) error { func run(p int, t string, y string, targetBasicAuth string, db string) error {
idempotency, err := sql.Open("sqlite", db) idempotency, err := sql.Open("sqlite", db)
if err != nil { if err != nil {
return err return err
@@ -109,8 +112,8 @@ func run(p int, t string, y string, db string) error {
if err != nil { if err != nil {
return err return err
} }
h := Handler{tmpl: tmpl, target: u, targetBasicAuth: targetBasicAuth, idempotency: idempotency}
h := Handler{tmpl: tmpl, target: u, idempotency: idempotency}
log.Println("listening on", p) log.Println("listening on", p)
return http.ListenAndServe(":"+strconv.Itoa(p), h) return http.ListenAndServe(":"+strconv.Itoa(p), h)
} }
@@ -130,11 +133,14 @@ func adapt(r io.Reader, tmpl *template.Template) ([]byte, error) {
return buff.Bytes(), nil return buff.Bytes(), nil
} }
func proxy(u *url.URL, r *http.Request, rc io.ReadCloser) (*http.Response, error) { func proxy(u *url.URL, targetBasicAuth string, r *http.Request, rc io.ReadCloser) (*http.Response, error) {
req, err := http.NewRequest(r.Method, u.String(), rc) req, err := http.NewRequest(r.Method, u.String(), rc)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if targetBasicAuth != "" {
req.Header.Set("Authorization", "Basic "+base64.URLEncoding.EncodeToString([]byte(targetBasicAuth)))
}
req = req.WithContext(r.Context()) req = req.WithContext(r.Context())
for k, v := range r.Header { for k, v := range r.Header {

View File

@@ -45,7 +45,7 @@ func TestRun(t *testing.T) {
} }
go func() { go func() {
if err := run(p, tmpl, y, db); err != nil { if err := run(p, tmpl, y, "", db); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}() }()