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) })) }