package proxy import ( "bytes" "context" "fmt" "io/ioutil" "net/http" "net/http/httputil" "net/url" logger "github.com/cr3a70r/shield/Utils" ) type ProxyHttpServer struct { ctx context.Context http.Server AddressAndPort string Name string logger *logger.Logger } type ReverseProxy struct { url *url.URL proxy *httputil.ReverseProxy logger *logger.Logger port string } type Override struct { Header string Match string Host string Path string } type Config struct { Path string Host string Override Override } func NewProxy(urlString string, transport http.RoundTripper, director *httputil.ReverseProxy, logger *logger.Logger, port string) *ReverseProxy { providedUrl, err := url.Parse(urlString) if err != nil { return nil } p := httputil.NewSingleHostReverseProxy(providedUrl) p.Transport = transport p.Director = director.Director p.ModifyResponse = UpdateResponse return &ReverseProxy{ url: providedUrl, proxy: p, logger: logger, port: port, } } func (p *ReverseProxy) Handler(w http.ResponseWriter, r *http.Request) { p.logger.PrintInfo("", map[string]string{ "accept": r.Header.Get("Accept"), "accept-encoding": r.Header.Get("Accept-Encoding"), "accept-language": r.Header.Get("Accept-Language"), "cache-control": r.Header.Get("Cache-Control"), "connection": r.Header.Get("Connection"), "pragma": r.Header.Get("Pragma"), "sec-ch-ua": r.Header.Get("Sec-Ch-Ua"), "user-agent": r.Header.Get("User-Agent"), }) xsCode := r.Header.Get("X-Code") if r.Header.Get(xsCode) != "" { p.logger.PrintInfo("", map[string]string{ "xsCode": xsCode, }) } p.proxy.ServeHTTP(w, r) } func UpdateResponse(r *http.Response) error { buf := bytes.NewBufferString("") r.Body = ioutil.NopCloser(buf) r.Header["Content-Length"] = []string{fmt.Sprint(buf.Len())} return nil }