2 Commits

Author SHA1 Message Date
bel
38f19408c2 cors ensures only ONE access control allow origin header set 2022-05-26 19:04:28 -06:00
Bel LaPointe
f28211e722 impl trim 2022-01-11 15:58:27 -05:00
6 changed files with 24 additions and 7 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -41,6 +41,10 @@ func GetAuth() (string, string, bool) {
return user, pass, user != "" && pass != "" return user, pass, user != "" && pass != ""
} }
func GetTrim() string {
return conf.Get("trim").GetString()
}
func GetPort() string { func GetPort() string {
port := conf.Get("p").GetInt() port := conf.Get("p").GetInt()
return ":" + fmt.Sprint(port) return ":" + fmt.Sprint(port)

View File

@@ -47,6 +47,7 @@ func parseArgs() (*args.ArgSet, error) {
as.Append(args.BOOL, "compress", "enable compression", true) as.Append(args.BOOL, "compress", "enable compression", true)
as.Append(args.STRING, "crt", "path to crt for ssl", "") as.Append(args.STRING, "crt", "path to crt for ssl", "")
as.Append(args.STRING, "key", "path to key for ssl", "") as.Append(args.STRING, "key", "path to key for ssl", "")
as.Append(args.STRING, "trim", "path prefix to trim, like '/abc' to change '/abc/def' to '/def'", "")
as.Append(args.STRING, "tcp", "address for tcp only tunnel", "") as.Append(args.STRING, "tcp", "address for tcp only tunnel", "")
as.Append(args.DURATION, "timeout", "timeout for tunnel", time.Minute) as.Append(args.DURATION, "timeout", "timeout for tunnel", time.Minute)
as.Append(args.STRING, "proxy", "double-comma separated (+ if auth)from,scheme://to.tld:port,,", "") as.Append(args.STRING, "proxy", "double-comma separated (+ if auth)from,scheme://to.tld:port,,", "")

View File

@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"crypto/tls" "crypto/tls"
"io" "io"
"local/rproxy3/config"
"local/rproxy3/storage/packable" "local/rproxy3/storage/packable"
"log" "log"
"net/http" "net/http"
@@ -25,6 +26,7 @@ type rewrite struct {
func (s *Server) Proxy(w http.ResponseWriter, r *http.Request) { func (s *Server) Proxy(w http.ResponseWriter, r *http.Request) {
newURL, err := s.lookup(mapKey(r.Host)) newURL, err := s.lookup(mapKey(r.Host))
r.URL.Path = strings.TrimPrefix(r.URL.Path, config.GetTrim())
var transport http.RoundTripper var transport http.RoundTripper
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
transport = &redirPurge{ transport = &redirPurge{

View File

@@ -269,7 +269,8 @@ func (s *Server) Pre(foo http.HandlerFunc) http.HandlerFunc {
w.WriteHeader(http.StatusTooManyRequests) w.WriteHeader(http.StatusTooManyRequests)
return return
} }
if did := s.doCORS(w, r); did { w, did := s.doCORS(w, r)
if did {
return return
} }
if s.auth.BOAuthZ { if s.auth.BOAuthZ {
@@ -288,20 +289,29 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.Pre(s.Proxy)(w, r) s.Pre(s.Proxy)(w, r)
} }
func (s *Server) doCORS(w http.ResponseWriter, r *http.Request) bool { type corsResponseWriter struct {
http.ResponseWriter
}
func (cb corsResponseWriter) WriteHeader(code int) {
cb.Header().Set("Access-Control-Allow-Origin", "*")
cb.Header().Set("Access-Control-Allow-Headers", "X-Auth-Token, content-type, Content-Type")
cb.ResponseWriter.WriteHeader(code)
}
func (s *Server) doCORS(w http.ResponseWriter, r *http.Request) (http.ResponseWriter, bool) {
key := mapKey(r.Host) key := mapKey(r.Host)
if !config.GetCORS(key) { if !config.GetCORS(key) {
return false return w, false
} }
w.Header().Set("Access-Control-Allow-Origin", "*") w = corsResponseWriter{ResponseWriter: w}
w.Header().Set("Access-Control-Allow-Headers", "X-Auth-Token, content-type, Content-Type")
if r.Method != "OPTIONS" { if r.Method != "OPTIONS" {
return false return w, false
} }
w.Header().Set("Content-Length", "0") w.Header().Set("Content-Length", "0")
w.Header().Set("Content-Type", "text/plain") w.Header().Set("Content-Type", "text/plain")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, TRACE, PATCH, HEAD, DELETE") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, TRACE, PATCH, HEAD, DELETE")
return true return w, true
} }
func getProxyAuth(r *http.Request) (string, string) { func getProxyAuth(r *http.Request) (string, string) {