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.
97 lines
2.0 KiB
97 lines
2.0 KiB
package proxy |
|
|
|
import ( |
|
"bytes" |
|
"context" |
|
"fmt" |
|
"io/ioutil" |
|
"net/http" |
|
"net/http/httputil" |
|
"net/url" |
|
|
|
"github.com/cr3a70r/shield/internal/utils" |
|
) |
|
|
|
// --- |
|
type ProxyHttpServer struct { |
|
ctx context.Context |
|
http.Server |
|
AddressAndPort string |
|
Name string |
|
logger *utils.Logger |
|
} |
|
|
|
type ReverseProxy struct { |
|
url *url.URL |
|
proxy *httputil.ReverseProxy |
|
logger *utils.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 *utils.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, |
|
}) |
|
} |
|
|
|
//We may load balance here: |
|
//r.Host = balanced IP. |
|
|
|
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 |
|
}
|
|
|