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}