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
94 lines
1.9 KiB
2 years ago
|
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
|
||
|
}
|