mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
fix: address PR review comments for header ops
- fix Deferred response header logic: apply headers after ModifyResponse callback - refactor applyToRequest to eliminate code duplication via applyTo - remove redundant Sec-WebSocket-Accept condition check
This commit is contained in:
parent
93f5edc6eb
commit
c0e31c449e
1 changed files with 9 additions and 61 deletions
|
|
@ -103,69 +103,13 @@ func (ops *HeaderOps) applyToRequest(req *http.Request) {
|
||||||
if ops == nil {
|
if ops == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
replacer := newReverseProxyReplacer(req)
|
ops.applyTo(req.Header, newReverseProxyReplacer(req))
|
||||||
|
|
||||||
for fieldName, vals := range ops.Add {
|
|
||||||
fieldName = replacer.Replace(fieldName)
|
|
||||||
for _, v := range vals {
|
|
||||||
req.Header.Add(fieldName, replacer.Replace(v))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for fieldName, vals := range ops.Set {
|
|
||||||
fieldName = replacer.Replace(fieldName)
|
|
||||||
req.Header.Del(fieldName)
|
|
||||||
for _, v := range vals {
|
|
||||||
req.Header.Add(fieldName, replacer.Replace(v))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, fieldName := range ops.Delete {
|
|
||||||
fieldName = strings.ToLower(replacer.Replace(fieldName))
|
|
||||||
if fieldName == "*" {
|
|
||||||
for k := range req.Header {
|
|
||||||
req.Header.Del(k)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case strings.HasPrefix(fieldName, "*") && strings.HasSuffix(fieldName, "*"):
|
|
||||||
pattern := fieldName[1:len(fieldName)-1]
|
|
||||||
for k := range req.Header {
|
|
||||||
if strings.Contains(strings.ToLower(k), pattern) {
|
|
||||||
req.Header.Del(k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case strings.HasPrefix(fieldName, "*"):
|
|
||||||
suffix := fieldName[1:]
|
|
||||||
for k := range req.Header {
|
|
||||||
if strings.HasSuffix(strings.ToLower(k), suffix) {
|
|
||||||
req.Header.Del(k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case strings.HasSuffix(fieldName, "*"):
|
|
||||||
prefix := fieldName[:len(fieldName)-1]
|
|
||||||
for k := range req.Header {
|
|
||||||
if strings.HasPrefix(strings.ToLower(k), prefix) {
|
|
||||||
req.Header.Del(k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
req.Header.Del(fieldName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ops.applyReplace(req.Header, replacer)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ops *RespHeaderOps) applyToResponse(hdr http.Header) {
|
func (ops *RespHeaderOps) applyToResponse(hdr http.Header) {
|
||||||
if ops == nil {
|
if ops == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ops.Deferred {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ops.applyTo(hdr, newReverseProxyReplacerFromHeader(hdr))
|
ops.applyTo(hdr, newReverseProxyReplacerFromHeader(hdr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1065,8 +1009,11 @@ func (p *reverseProxyHandler) modifyResponse(c *Context, res *http.Response, req
|
||||||
if p.config.ResponseHeaders != nil && !p.config.ResponseHeaders.Deferred {
|
if p.config.ResponseHeaders != nil && !p.config.ResponseHeaders.Deferred {
|
||||||
p.config.ResponseHeaders.applyToResponse(res.Header)
|
p.config.ResponseHeaders.applyToResponse(res.Header)
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.config.ModifyResponse == nil {
|
if p.config.ModifyResponse == nil {
|
||||||
|
if p.config.ResponseHeaders != nil && p.config.ResponseHeaders.Deferred {
|
||||||
|
p.config.ResponseHeaders.applyToResponse(res.Header)
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if err := p.config.ModifyResponse(res); err != nil {
|
if err := p.config.ModifyResponse(res); err != nil {
|
||||||
|
|
@ -1074,6 +1021,9 @@ func (p *reverseProxyHandler) modifyResponse(c *Context, res *http.Response, req
|
||||||
p.handleError(c, err)
|
p.handleError(c, err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if p.config.ResponseHeaders != nil && p.config.ResponseHeaders.Deferred {
|
||||||
|
p.config.ResponseHeaders.applyToResponse(res.Header)
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1272,9 +1222,7 @@ func (p *reverseProxyHandler) handleBridgedExtendedConnectResponse(c *Context, r
|
||||||
responseHeader := c.Writer.Header()
|
responseHeader := c.Writer.Header()
|
||||||
reverseProxyCopyHeader(responseHeader, res.Header)
|
reverseProxyCopyHeader(responseHeader, res.Header)
|
||||||
removeHopByHopHeaders(responseHeader)
|
removeHopByHopHeaders(responseHeader)
|
||||||
if res.Header.Get("Sec-WebSocket-Accept") != "" {
|
responseHeader.Del("Sec-WebSocket-Accept")
|
||||||
responseHeader.Del("Sec-WebSocket-Accept")
|
|
||||||
}
|
|
||||||
c.Writer.WriteHeader(http.StatusOK)
|
c.Writer.WriteHeader(http.StatusOK)
|
||||||
if err := controller.Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) {
|
if err := controller.Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) {
|
||||||
backConn.Close()
|
backConn.Close()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue