diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 72 |
1 files changed, 72 insertions, 0 deletions
@@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "io" + "strings" + "net" + "net/http" + "net/url" + log "github.com/sirupsen/logrus" +) + + +//type Endpoint struct { +// path string +// address string +//} +// +// +//func proxy(w http.ResponseWriter, req *http.Request, end Endpoint) { +//} +// +//func makeProxiedRequest(w http.ResponseWriter, req *http.Request, end Endpoint) { +// +//} +// + +func main() { + const addr = "localhost:3333" + log.Info("configuring reverse proxy...") + origin, err := url.Parse("http://localhost:8000") + if err != nil { + log.Fatal(err) + } + log.Infof("listening on %v", addr) + http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + req.Host = origin.Host + req.URL.Host = origin.Host + req.URL.Scheme = origin.Scheme + req.RequestURI = "" + // set X-Forwarded-For + forwardedFor, _, _ := net.SplitHostPort(req.RemoteAddr) + req.Header.Set("X-Forwarded-For", forwardedFor) + response, err := http.DefaultClient.Do(req) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "%v", err) + log.Fatal(err) + } + + // copy header + for key, values := range response.Header { + for _, value := range values { + w.Header().Add(key, value) + } + } + + // get trailer keys + trailerKeys := []string{} + for key := range response.Trailer { + trailerKeys = append(trailerKeys, key) + } + if (len(trailerKeys) > 0) { + w.Header().Set("Trailer", strings.Join(trailerKeys, ",")) + } + + w.WriteHeader(response.StatusCode) + + // copy body + io.Copy(w, response.Body) + })) +} |