|
|
|
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
|
|
|
|
}
|