From 5ef25782fe22d336bc8e622408008c2604a4fe3a Mon Sep 17 00:00:00 2001 From: Zeev Diukman Date: Sat, 22 Mar 2025 09:00:41 +0000 Subject: [PATCH] 22032025-1 --- reverseproxy.go | 64 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/reverseproxy.go b/reverseproxy.go index d742173..70b53ee 100644 --- a/reverseproxy.go +++ b/reverseproxy.go @@ -9,22 +9,35 @@ import ( ) type ReverseProxy struct { - context.Context + CtxKey CtxKey + Context context.Context *httputil.ReverseProxy } type CtxKey string -func New(ctx context.Context, host string) *ReverseProxy { +func NewSTD(ctx context.Context, host string) *ReverseProxy { ctxKey := CtxKey("host") ctx = context.WithValue(ctx, ctxKey, host) - reverseProxySTDLIB := &httputil.ReverseProxy{ + reverseProxySTDLIB := &httputil.ReverseProxy{} + reverseProxy := &ReverseProxy{} + reverseProxy.Context = ctx + reverseProxy.ReverseProxy = reverseProxySTDLIB + return reverseProxy +} + +func New(ctx context.Context, host string) *ReverseProxy { + rp := &ReverseProxy{} + rp.CtxKey = CtxKey("host") + rp.Context = context.WithValue(ctx, rp.CtxKey, host) + target, _ := url.Parse(host) + rp.ReverseProxy = &httputil.ReverseProxy{ Director: func(r *http.Request) { - r = r.WithContext(ctx) - hostFromCtx := ctx.Value(ctxKey).(string) - target, _ := url.Parse(hostFromCtx) + r = r.WithContext(rp.Context) + // hostFromCtx := ctx.Value(rp.CtxKey).(string) + targetQuery := target.RawQuery r.URL.Scheme = target.Scheme r.URL.Host = target.Host @@ -36,10 +49,8 @@ func New(ctx context.Context, host string) *ReverseProxy { } }, } - reverseProxy := &ReverseProxy{} - reverseProxy.Context = ctx - reverseProxy.ReverseProxy = reverseProxySTDLIB - return reverseProxy + + return rp } func (revereProxy *ReverseProxy) SetContext(ctx context.Context) { revereProxy.Context = ctx @@ -87,11 +98,32 @@ type JoinURLPathFunc func(*url.URL, *url.URL) (string, string) // type SingleJoiningSlashFunc func(string, string) string type DirectorFunc func(*http.Request) -func StripPrefix(r *http.Request, prefix string) *http.Request { - newPath := strings.TrimPrefix(r.URL.Path, prefix) - if newPath == "" { - newPath = "/" +// func StripPrefix(r *http.Request, prefixPath string) *http.Request { +// if prefixPath == "/" { +// newPath := strings.TrimPrefix(r.URL.Path, prefixPath) +// if newPath == "" { +// newPath = "/" +// } +// r.URL.Path = newPath +// } + +// return r +// } + +func (rp *ReverseProxy) DefaultDirectorFunc(ctx context.Context, ctxKey CtxKey, fn func(*http.Request) *http.Request) { + rp.Director = func(r *http.Request) { + r = fn(r) + r = r.WithContext(rp.Context) + hostFromCtx := ctx.Value(CtxKey("host")).(string) + target, _ := url.Parse(hostFromCtx) + targetQuery := target.RawQuery + r.URL.Scheme = target.Scheme + r.URL.Host = target.Host + r.URL.Path, r.URL.RawPath = JoinURLPath(target, r.URL) + if targetQuery == "" || r.URL.RawQuery == "" { + r.URL.RawQuery = targetQuery + r.URL.RawQuery + } else { + r.URL.RawQuery = targetQuery + "&" + r.URL.RawQuery + } } - r.URL.Path = newPath - return r }