package main import ( "log" "net/http" "net/http/httputil" "net/url" "os" "strconv" ) func main() { proxy := os.Getenv("PE_PROXY") if proxy == "" { log.Fatal("PE_PROXY not specified") return } proxyUrl, err := url.Parse(proxy) if err != nil { log.Fatal(err.Error()) return } upstream := os.Getenv("PE_UPSTREAM") if upstream == "" { log.Fatal("PE_UPSTREAM not specified") return } upstreamUrl, err := url.Parse(upstream) if err != nil { log.Fatal(err.Error()) return } portString := os.Getenv("PE_PORT") if portString == "" { log.Fatal("PE_PORT not specified") return } port, err := strconv.Atoi(portString) if err != nil { log.Fatal(err.Error()) return } rp := httputil.NewSingleHostReverseProxy(upstreamUrl) rp.Transport = &http.Transport{ Proxy: http.ProxyURL(proxyUrl), DisableKeepAlives: true, } err = http.ListenAndServe("0.0.0.0:"+strconv.Itoa(port), http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL.String()) rp.ServeHTTP(rw, r) })) if err != nil { log.Fatal(err.Error()) return } }