@@ -77,7 +77,6 @@ func (srv *Server) handleConn(hs *http.Server, c net.Conn, h http.Handler) {
77
77
handler : h ,
78
78
framer : NewFramer (c , c ), // TODO: write to a (custom?) buffered writer that can alternate when it's in buffered mode.
79
79
streams : make (map [uint32 ]* stream ),
80
- canonHeader : make (map [string ]string ),
81
80
readFrameCh : make (chan frameAndProcessed ),
82
81
readFrameErrCh : make (chan error , 1 ), // must be buffered for 1
83
82
wantWriteFrameCh : make (chan frameWriteMsg , 8 ),
@@ -258,12 +257,19 @@ func (sc *serverConn) onNewHeaderField(f hpack.HeaderField) {
258
257
259
258
func (sc * serverConn ) canonicalHeader (v string ) string {
260
259
sc .serveG .check ()
261
- // TODO: use a sync.Pool instead of putting the cache on *serverConn?
262
- cv , ok := sc .canonHeader [v ]
263
- if ! ok {
264
- cv = http .CanonicalHeaderKey (v )
265
- sc .canonHeader [v ] = cv
260
+ cv , ok := commonCanonHeader [v ]
261
+ if ok {
262
+ return cv
263
+ }
264
+ cv , ok = sc .canonHeader [v ]
265
+ if ok {
266
+ return cv
267
+ }
268
+ if sc .canonHeader == nil {
269
+ sc .canonHeader = make (map [string ]string )
266
270
}
271
+ cv = http .CanonicalHeaderKey (v )
272
+ sc .canonHeader [v ] = cv
267
273
return cv
268
274
}
269
275
@@ -845,15 +851,13 @@ func (sc *serverConn) writeHeadersFrame(v interface{}) error {
845
851
sc .headerWriteBuf .Reset ()
846
852
sc .hpackEncoder .WriteField (hpack.HeaderField {Name : ":status" , Value : httpCodeString (req .httpResCode )})
847
853
for k , vv := range req .h {
854
+ k = lowerHeader (k )
848
855
for _ , v := range vv {
849
856
// TODO: more of "8.1.2.2 Connection-Specific Header Fields"
850
- if k == "Transfer-Encoding " && v != "trailers" {
857
+ if k == "transfer-encoding " && v != "trailers" {
851
858
continue
852
859
}
853
- // TODO: for gargage, cache lowercase copies of headers at
854
- // least for common ones and/or popular recent ones for
855
- // this serverConn. LRU?
856
- sc .hpackEncoder .WriteField (hpack.HeaderField {Name : strings .ToLower (k ), Value : v })
860
+ sc .hpackEncoder .WriteField (hpack.HeaderField {Name : k , Value : v })
857
861
}
858
862
}
859
863
if req .contentType != "" {
0 commit comments