You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
1.9 KiB

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("<input type=\"text\" name=\"browser\" value=\"ie\">")
r.Body = ioutil.NopCloser(buf)
r.Header["Content-Length"] = []string{fmt.Sprint(buf.Len())}
return nil
}