From fe7e3acbca3a0b9b3e46d7ffed3ca9e45eed97f8 Mon Sep 17 00:00:00 2001 From: Michael Quigley Date: Thu, 21 Jul 2022 15:26:44 -0400 Subject: [PATCH] more proxy debugging --- http/http.go | 14 ++++++++++++-- proxy/proxy.go | 24 ++++++++++++++++-------- util/headers.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 util/headers.go diff --git a/http/http.go b/http/http.go index ae1296d8..1511fc55 100644 --- a/http/http.go +++ b/http/http.go @@ -2,6 +2,7 @@ package http import ( "fmt" + "github.com/openziti-test-kitchen/zrok/util" "github.com/openziti/sdk-golang/ziti" "github.com/openziti/sdk-golang/ziti/config" "github.com/pkg/errors" @@ -35,24 +36,33 @@ func Run(cfg *Config) error { type handler struct{} func (self *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - logrus.Infof("handling request from [%v]", r.RemoteAddr) + logrus.Warnf("handling request from [%v]", r.RemoteAddr) r.Host = "localhost:3000" r.URL.Host = "localhost:3000" r.URL.Scheme = "http" r.RequestURI = "" + logrus.Info(util.DumpHeaders(r.Header, true)) + logrus.Infof("forwarding to: %v [%v]", r.Method, r.URL) rr, err := http.DefaultClient.Do(r) if err != nil { w.WriteHeader(http.StatusInternalServerError) _, _ = fmt.Fprint(w, err) return } + w.WriteHeader(rr.StatusCode) + logrus.Infof("response: %v", rr.Status) + // forward headers for k, v := range rr.Header { - w.Header().Add(k, v[0]) + for _, vi := range v { + w.Header().Add(k, vi) + } } + logrus.Info(util.DumpHeaders(w.Header(), false)) + // copy body n, err := io.Copy(w, rr.Body) if err != nil { w.WriteHeader(http.StatusInternalServerError) diff --git a/proxy/proxy.go b/proxy/proxy.go index 9986015f..c8323fa6 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -31,29 +31,37 @@ type handler struct { } func (self *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - logrus.Infof("handling request from [%v]", r.RemoteAddr) + logrus.Warnf("handling request from [%v]", r.RemoteAddr) - zDialCtx := util.ZitiDialContext{Context: self.zCtx} - zTransport := http.DefaultTransport.(*http.Transport).Clone() - zTransport.DialContext = zDialCtx.Dial - client := &http.Client{Transport: zTransport} r.Host = "zrok" r.URL.Host = "zrok" r.URL.Scheme = "http" r.RequestURI = "" - logrus.Warnf("request: %v", r) + logrus.Info(util.DumpHeaders(r.Header, true)) - rr, err := client.Do(r) + logrus.Infof("forwarding to: %v [%v]", r.Method, r.URL) + zDialCtx := util.ZitiDialContext{Context: self.zCtx} + zTransport := http.DefaultTransport.(*http.Transport).Clone() + zTransport.DialContext = zDialCtx.Dial + zClient := &http.Client{Transport: zTransport} + rr, err := zClient.Do(r) if err != nil { w.WriteHeader(http.StatusInternalServerError) _, _ = fmt.Fprint(w, err) return } + w.WriteHeader(rr.StatusCode) + logrus.Infof("response: %v", rr.Status) + // forward headers for k, v := range rr.Header { - w.Header().Add(k, v[0]) + for _, vi := range v { + w.Header().Add(k, vi) + } } + logrus.Info(util.DumpHeaders(w.Header(), false)) + // copy body n, err := io.Copy(w, rr.Body) if err != nil { panic(err) diff --git a/util/headers.go b/util/headers.go new file mode 100644 index 00000000..4482520e --- /dev/null +++ b/util/headers.go @@ -0,0 +1,29 @@ +package util + +import ( + "fmt" + "net/http" + "sort" +) + +func DumpHeaders(headers http.Header, in bool) string { + out := "headers {\n" + keys := make([]string, len(headers)) + i := 0 + for k, _ := range headers { + keys[i] = k + i++ + } + sort.Strings(keys) + for _, k := range keys { + for _, v := range headers[k] { + indicator := "->" + if !in { + indicator = "<-" + } + out += fmt.Sprintf("\t%v %v: %v\n", indicator, k, v) + } + } + out += "}" + return out +}