net/http/internal/http2: responseWriterState.snapHeader not use deepcopy
snapHeader may call delete,
rendering the key no longer usable for query the corresponding value,
yet the value itself remains unmodified.
goos: windows
goarch: amd64
pkg: net/http
cpu: AMD Ryzen 7 7840HS w/ Radeon 780M Graphics
│ new │ new2 │
│ sec/op │ sec/op vs base │
SnapHeaderH2-16 134.1µ ± 3% 133.6µ ± 2% ~ (p=0.739 n=10)
│ new │ new2 │
│ B/op │ B/op vs base │
SnapHeaderH2-16 8.952Ki ± 0% 8.780Ki ± 0% -1.92% (p=0.000 n=10)
│ new │ new2 │
│ allocs/op │ allocs/op vs base │
SnapHeaderH2-16 101.00 ± 0% 91.00 ± 0% -9.90% (p=0.000 n=10)
diff --git a/src/net/http/internal/http2/server.go b/src/net/http/internal/http2/server.go
index 827d217..d49ccd9 100644
--- a/src/net/http/internal/http2/server.go
+++ b/src/net/http/internal/http2/server.go
@@ -2901,7 +2901,7 @@
rws.wroteHeader = true
rws.status = code
if len(rws.handlerHeader) > 0 {
- rws.snapHeader = cloneHeader(rws.handlerHeader)
+ rws.snapHeader = cloneHeader2(rws.handlerHeader)
}
}
@@ -2919,6 +2919,14 @@
return h2
}
+func cloneHeader2(h Header) Header {
+ h2 := headerPool.Get().(Header)
+ for k, vv := range h {
+ h2[k] = vv
+ }
+ return h2
+}
+
// The Life Of A Write is like this:
//
// * Handler calls w.Write or w.WriteString ->
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |