mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
fix: avoid unsafe header buffer reuse
Use safe string copies for pooled header buffers and simplify case-insensitive lookup buffering now that the pseudo stack path was ineffective. This addresses review concerns without changing the routing semantics.
This commit is contained in:
parent
2d4aefc86e
commit
57847fa446
3 changed files with 4 additions and 13 deletions
|
|
@ -145,7 +145,7 @@ var methodNotAllowedHandler HandlerFunc = func(c *Context) {
|
||||||
allowHeader = append(allowHeader, method...)
|
allowHeader = append(allowHeader, method...)
|
||||||
}
|
}
|
||||||
c.allowHeaderBuf = allowHeader[:0]
|
c.allowHeaderBuf = allowHeader[:0]
|
||||||
c.Writer.Header().Set("Allow", BytesToString(allowHeader))
|
c.Writer.Header().Set("Allow", string(allowHeader))
|
||||||
c.Status(http.StatusOK)
|
c.Status(http.StatusOK)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -810,7 +810,7 @@ func (engine *Engine) handleRequest(c *Context) {
|
||||||
ciPath, found := rootNode.findCaseInsensitivePathWithBuffer(requestPath, c.fixedPathBuf, engine.RedirectTrailingSlash)
|
ciPath, found := rootNode.findCaseInsensitivePathWithBuffer(requestPath, c.fixedPathBuf, engine.RedirectTrailingSlash)
|
||||||
if found {
|
if found {
|
||||||
c.fixedPathBuf = ciPath[:0]
|
c.fixedPathBuf = ciPath[:0]
|
||||||
c.Redirect(http.StatusMovedPermanently, BytesToString(ciPath)) // 301 永久重定向到修正后的路径
|
c.Redirect(http.StatusMovedPermanently, string(ciPath)) // 301 永久重定向到修正后的路径
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.fixedPathBuf = ciPath[:0]
|
c.fixedPathBuf = ciPath[:0]
|
||||||
|
|
|
||||||
|
|
@ -709,7 +709,7 @@ func (p *reverseProxyHandler) writeLocalOptionsResponse(c *Context) {
|
||||||
allowHeader = append(allowHeader, method...)
|
allowHeader = append(allowHeader, method...)
|
||||||
}
|
}
|
||||||
c.allowHeaderBuf = allowHeader[:0]
|
c.allowHeaderBuf = allowHeader[:0]
|
||||||
c.Writer.Header().Set("Allow", BytesToString(allowHeader))
|
c.Writer.Header().Set("Allow", string(allowHeader))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
tree.go
11
tree.go
|
|
@ -723,20 +723,11 @@ func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) ([]by
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *node) findCaseInsensitivePathWithBuffer(path string, buf []byte, fixTrailingSlash bool) ([]byte, bool) {
|
func (n *node) findCaseInsensitivePathWithBuffer(path string, buf []byte, fixTrailingSlash bool) ([]byte, bool) {
|
||||||
const stackBufSize = 128 // 栈上缓冲区的默认大小
|
|
||||||
|
|
||||||
// 在常见情况下使用栈上静态大小的缓冲区.
|
|
||||||
// 如果路径太长, 则在堆上分配缓冲区.
|
|
||||||
if buf != nil {
|
if buf != nil {
|
||||||
buf = buf[:0]
|
buf = buf[:0]
|
||||||
}
|
}
|
||||||
if cap(buf) < len(path)+1 {
|
if cap(buf) < len(path)+1 {
|
||||||
var stackBuf [stackBufSize]byte
|
buf = make([]byte, 0, len(path)+1)
|
||||||
if len(path)+1 <= stackBufSize {
|
|
||||||
buf = stackBuf[:0]
|
|
||||||
} else {
|
|
||||||
buf = make([]byte, 0, len(path)+1) // 如果路径太长, 则分配更大的缓冲区
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ciPath := n.findCaseInsensitivePathRec(
|
ciPath := n.findCaseInsensitivePathRec(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue