package prxy import ( "fmt" "net" "net/http" "net/http/httputil" "net/url" "github.com/xlgmokha/x/pkg/log" "github.com/xlgmokha/x/pkg/x" ) func New(routes map[string]string) http.Handler { mapped := map[string]*url.URL{} for source, destination := range routes { mapped[source] = x.Must(url.Parse(destination)) } return &httputil.ReverseProxy{ Rewrite: func(r *httputil.ProxyRequest) { host, _, err := net.SplitHostPort(r.In.Host) if err != nil { log.WithFields(r.In.Context(), log.Fields{"error": err}) return } destination := mapped[host] r.SetXForwarded() r.SetURL(destination) }, Transport: http.DefaultTransport, FlushInterval: -1, ErrorLog: nil, ModifyResponse: func(r *http.Response) error { r.Header.Add("Via", fmt.Sprintf("%v gtwy", r.Proto)) return nil }, ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) { log.WithFields(r.Context(), log.Fields{"error": err}) }, } }