main
 1package prxy
 2
 3import (
 4	"fmt"
 5	"net"
 6	"net/http"
 7	"net/http/httputil"
 8	"net/url"
 9
10	"github.com/xlgmokha/x/pkg/log"
11	"github.com/xlgmokha/x/pkg/x"
12)
13
14func New(routes map[string]string) http.Handler {
15	mapped := map[string]*url.URL{}
16	for source, destination := range routes {
17		mapped[source] = x.Must(url.Parse(destination))
18	}
19
20	return &httputil.ReverseProxy{
21		Rewrite: func(r *httputil.ProxyRequest) {
22			host, _, err := net.SplitHostPort(r.In.Host)
23			if err != nil {
24				log.WithFields(r.In.Context(), log.Fields{"error": err})
25				return
26			}
27
28			destination := mapped[host]
29			r.SetXForwarded()
30			r.SetURL(destination)
31		},
32		Transport:     http.DefaultTransport,
33		FlushInterval: -1,
34		ErrorLog:      nil,
35		ModifyResponse: func(r *http.Response) error {
36			r.Header.Add("Via", fmt.Sprintf("%v gtwy", r.Proto))
37			return nil
38		},
39		ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) {
40			log.WithFields(r.Context(), log.Fields{"error": err})
41		},
42	}
43}