diff --git a/main.go b/main.go index f230201..0a8bb7c 100644 --- a/main.go +++ b/main.go @@ -7,11 +7,12 @@ import ( "io" "log" "net/http" - "net/http/httputil" "net/url" "os" "strconv" + "strings" "text/template" + "time" ) func main() { @@ -32,7 +33,13 @@ func main() { if err != nil { panic(err) } - proxy := httputil.NewSingleHostReverseProxy(u) + + c := &http.Client{ + Timeout: time.Minute, + Transport: &http.Transport{ + DisableKeepAlives: true, + }, + } handle := func(w http.ResponseWriter, r *http.Request) error { var v interface{} @@ -43,9 +50,36 @@ func main() { if err := tmpl.Execute(buff, v); err != nil { return err } - r.Body = io.NopCloser(buff) - r.ContentLength = int64(len(buff.Bytes())) - proxy.ServeHTTP(w, r) + + log.Printf("%+v => %s => %s", v, buff.Bytes(), u.String()) + + req, err := http.NewRequest(r.Method, u.String(), io.NopCloser(buff)) + if err != nil { + return err + } + req = req.WithContext(r.Context()) + for k, v := range r.Header { + switch strings.ToLower(k) { + case "content-length": + default: + req.Header.Set(k, v) + } + } + resp, err := c.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + for k, v := range resp.Header { + w.Header().Set(k, v[0]) + for _, v := range v[1:] { + w.Header().Add(k, v) + } + } + w.WriteHeader(resp.StatusCode) + io.Copy(w, resp.Body) + return nil } log.Println("listening on", *p)