refactor: headers handling

This commit is contained in:
yusing 2025-05-26 19:57:39 +08:00
parent 216c03c5ff
commit 4a6bed7728
3 changed files with 41 additions and 33 deletions

View file

@ -33,8 +33,14 @@ func (mr *ModifyRequestOpts) finalize() {
func (mr *modifyRequest) before(w http.ResponseWriter, r *http.Request) (proceed bool) {
mr.AddTraceRequest("before modify request", r)
mr.addPrefix(r, nil, r.URL.Path)
mr.modifyHeaders(r, nil, r.Header)
if len(mr.AddPrefix) != 0 {
mr.addPrefix(r, r.URL.Path)
}
if !mr.needVarSubstitution {
mr.modifyHeaders(r, r.Header)
} else {
mr.modifyHeadersWithVarSubstitution(r, nil, r.Header)
}
mr.AddTraceRequest("after modify request", r)
return true
}
@ -50,42 +56,40 @@ func (mr *ModifyRequestOpts) checkVarSubstitution() {
}
}
func (mr *ModifyRequestOpts) modifyHeaders(req *http.Request, resp *http.Response, headers http.Header) {
if !mr.needVarSubstitution {
for k, v := range mr.SetHeaders {
if req != nil && strings.EqualFold(k, "host") {
defer func() {
req.Host = v
}()
}
headers[k] = []string{v}
}
for k, v := range mr.AddHeaders {
headers[k] = append(headers[k], v)
}
} else {
for k, v := range mr.SetHeaders {
if req != nil && strings.EqualFold(k, "host") {
defer func() {
req.Host = varReplace(req, resp, v)
}()
}
headers[k] = []string{varReplace(req, resp, v)}
}
for k, v := range mr.AddHeaders {
headers[k] = append(headers[k], varReplace(req, resp, v))
func (mr *ModifyRequestOpts) modifyHeaders(req *http.Request, headers http.Header) {
for k, v := range mr.SetHeaders {
if req != nil && strings.EqualFold(k, "host") {
defer func() {
req.Host = v
}()
}
headers[k] = []string{v}
}
for k, v := range mr.AddHeaders {
headers[k] = append(headers[k], v)
}
for _, k := range mr.HideHeaders {
delete(headers, k)
}
}
func (mr *modifyRequest) addPrefix(r *http.Request, _ *http.Response, path string) {
if len(mr.AddPrefix) == 0 {
return
func (mr *ModifyRequestOpts) modifyHeadersWithVarSubstitution(req *http.Request, resp *http.Response, headers http.Header) {
for k, v := range mr.SetHeaders {
if req != nil && strings.EqualFold(k, "host") {
defer func() {
req.Host = varReplace(req, resp, v)
}()
}
headers[k] = []string{varReplace(req, resp, v)}
}
for k, v := range mr.AddHeaders {
headers[k] = append(headers[k], varReplace(req, resp, v))
}
for _, k := range mr.HideHeaders {
delete(headers, k)
}
}
func (mr *modifyRequest) addPrefix(r *http.Request, path string) {
r.URL.Path = filepath.Join(mr.AddPrefix, path)
}

View file

@ -14,7 +14,11 @@ var ModifyResponse = NewMiddleware[modifyResponse]()
// modifyResponse implements ResponseModifier.
func (mr *modifyResponse) modifyResponse(resp *http.Response) error {
mr.AddTraceResponse("before modify response", resp)
mr.modifyHeaders(resp.Request, resp, resp.Header)
if !mr.needVarSubstitution {
mr.modifyHeaders(resp.Request, resp.Header)
} else {
mr.modifyHeadersWithVarSubstitution(resp.Request, resp, resp.Header)
}
mr.AddTraceResponse("after modify response", resp)
return nil
}

View file

@ -271,7 +271,7 @@ func (p *ReverseProxy) handler(rw http.ResponseWriter, req *http.Request) {
return
}
req.Header.Del("Forwarded")
outreq.Header.Del("Forwarded")
httpheaders.RemoveHopByHopHeaders(outreq.Header)
// Issue 21096: tell backend applications that care about trailer support
@ -312,7 +312,7 @@ func (p *ReverseProxy) handler(rw http.ResponseWriter, req *http.Request) {
}
var reqScheme string
if req.TLS != nil {
if req.TLS != nil || req.Header.Get("X-Forwarded-Proto") == "https" {
reqScheme = "https"
} else {
reqScheme = "http"