@@ -34,9 +34,9 @@ type ResponseHeader struct {
34
34
contentEncoding []byte
35
35
server []byte
36
36
mulHeader [][]byte
37
+ trailer [][]byte
37
38
38
- h []argsKV
39
- trailer []argsKV
39
+ h []argsKV
40
40
41
41
cookies []argsKV
42
42
bufK []byte
@@ -72,9 +72,9 @@ type RequestHeader struct {
72
72
contentType []byte
73
73
userAgent []byte
74
74
mulHeader [][]byte
75
+ trailer [][]byte
75
76
76
- h []argsKV
77
- trailer []argsKV
77
+ h []argsKV
78
78
79
79
cookies []argsKV
80
80
@@ -542,7 +542,14 @@ func (h *ResponseHeader) AddTrailerBytes(trailer []byte) error {
542
542
}
543
543
h .bufK = append (h .bufK [:0 ], key ... )
544
544
normalizeHeaderKey (h .bufK , h .disableNormalizing )
545
- h .trailer = appendArgBytes (h .trailer , h .bufK , nil , argsNoValue )
545
+ if cap (h .trailer ) > len (h .trailer ) {
546
+ h .trailer = h .trailer [:len (h .trailer )+ 1 ]
547
+ h .trailer [len (h .trailer )- 1 ] = append (h .trailer [len (h .trailer )- 1 ][:0 ], h .bufK ... )
548
+ } else {
549
+ key = make ([]byte , len (h .bufK ))
550
+ copy (key , h .bufK )
551
+ h .trailer = append (h .trailer , key )
552
+ }
546
553
}
547
554
548
555
return err
@@ -890,7 +897,14 @@ func (h *RequestHeader) AddTrailerBytes(trailer []byte) error {
890
897
}
891
898
h .bufK = append (h .bufK [:0 ], key ... )
892
899
normalizeHeaderKey (h .bufK , h .disableNormalizing )
893
- h .trailer = appendArgBytes (h .trailer , h .bufK , nil , argsNoValue )
900
+ if cap (h .trailer ) > len (h .trailer ) {
901
+ h .trailer = h .trailer [:len (h .trailer )+ 1 ]
902
+ h .trailer [len (h .trailer )- 1 ] = append (h .trailer [len (h .trailer )- 1 ][:0 ], h .bufK ... )
903
+ } else {
904
+ key = make ([]byte , len (h .bufK ))
905
+ copy (key , h .bufK )
906
+ h .trailer = append (h .trailer , key )
907
+ }
894
908
}
895
909
896
910
return err
@@ -1162,7 +1176,7 @@ func (h *ResponseHeader) CopyTo(dst *ResponseHeader) {
1162
1176
dst .server = append (dst .server , h .server ... )
1163
1177
dst .h = copyArgs (dst .h , h .h )
1164
1178
dst .cookies = copyArgs (dst .cookies , h .cookies )
1165
- dst .trailer = copyArgs (dst .trailer , h .trailer )
1179
+ dst .trailer = copyTrailer (dst .trailer , h .trailer )
1166
1180
}
1167
1181
1168
1182
// CopyTo copies all the headers to dst.
@@ -1182,7 +1196,7 @@ func (h *RequestHeader) CopyTo(dst *RequestHeader) {
1182
1196
dst .host = append (dst .host , h .host ... )
1183
1197
dst .contentType = append (dst .contentType , h .contentType ... )
1184
1198
dst .userAgent = append (dst .userAgent , h .userAgent ... )
1185
- dst .trailer = append (dst .trailer , h .trailer ... )
1199
+ dst .trailer = copyTrailer (dst .trailer , h .trailer )
1186
1200
dst .h = copyArgs (dst .h , h .h )
1187
1201
dst .cookies = copyArgs (dst .cookies , h .cookies )
1188
1202
dst .cookiesCollected = h .cookiesCollected
@@ -1215,7 +1229,7 @@ func (h *ResponseHeader) VisitAll(f func(key, value []byte)) {
1215
1229
})
1216
1230
}
1217
1231
if len (h .trailer ) > 0 {
1218
- f (strTrailer , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
1232
+ f (strTrailer , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
1219
1233
}
1220
1234
visitArgs (h .h , f )
1221
1235
if h .ConnectionClose () {
@@ -1227,14 +1241,18 @@ func (h *ResponseHeader) VisitAll(f func(key, value []byte)) {
1227
1241
//
1228
1242
// f must not retain references to value after returning.
1229
1243
func (h * ResponseHeader ) VisitAllTrailer (f func (value []byte )) {
1230
- visitArgsKey (h .trailer , f )
1244
+ for i := range h .trailer {
1245
+ f (h .trailer [i ])
1246
+ }
1231
1247
}
1232
1248
1233
1249
// VisitAllTrailer calls f for each request Trailer.
1234
1250
//
1235
1251
// f must not retain references to value after returning.
1236
1252
func (h * RequestHeader ) VisitAllTrailer (f func (value []byte )) {
1237
- visitArgsKey (h .trailer , f )
1253
+ for i := range h .trailer {
1254
+ f (h .trailer [i ])
1255
+ }
1238
1256
}
1239
1257
1240
1258
// VisitAllCookie calls f for each response cookie.
@@ -1279,7 +1297,7 @@ func (h *RequestHeader) VisitAll(f func(key, value []byte)) {
1279
1297
f (strUserAgent , userAgent )
1280
1298
}
1281
1299
if len (h .trailer ) > 0 {
1282
- f (strTrailer , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
1300
+ f (strTrailer , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
1283
1301
}
1284
1302
1285
1303
h .collectCookies ()
@@ -1925,7 +1943,7 @@ func (h *ResponseHeader) peek(key []byte) []byte {
1925
1943
case HeaderSetCookie :
1926
1944
return appendResponseCookieBytes (nil , h .cookies )
1927
1945
case HeaderTrailer :
1928
- return appendArgsKeyBytes (nil , h .trailer , strCommaSpace )
1946
+ return appendTrailerBytes (nil , h .trailer , strCommaSpace )
1929
1947
default :
1930
1948
return peekArgBytes (h .h , key )
1931
1949
}
@@ -1952,7 +1970,7 @@ func (h *RequestHeader) peek(key []byte) []byte {
1952
1970
}
1953
1971
return peekArgBytes (h .h , key )
1954
1972
case HeaderTrailer :
1955
- return appendArgsKeyBytes (nil , h .trailer , strCommaSpace )
1973
+ return appendTrailerBytes (nil , h .trailer , strCommaSpace )
1956
1974
default :
1957
1975
return peekArgBytes (h .h , key )
1958
1976
}
@@ -1999,7 +2017,7 @@ func (h *RequestHeader) peekAll(key []byte) [][]byte {
1999
2017
h .mulHeader = peekAllArgBytesToDst (h .mulHeader , h .h , key )
2000
2018
}
2001
2019
case HeaderTrailer :
2002
- h .mulHeader = append (h .mulHeader , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
2020
+ h .mulHeader = append (h .mulHeader , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
2003
2021
default :
2004
2022
h .mulHeader = peekAllArgBytesToDst (h .mulHeader , h .h , key )
2005
2023
}
@@ -2043,7 +2061,7 @@ func (h *ResponseHeader) peekAll(key []byte) [][]byte {
2043
2061
case HeaderSetCookie :
2044
2062
h .mulHeader = append (h .mulHeader , appendResponseCookieBytes (nil , h .cookies ))
2045
2063
case HeaderTrailer :
2046
- h .mulHeader = append (h .mulHeader , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
2064
+ h .mulHeader = append (h .mulHeader , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
2047
2065
default :
2048
2066
h .mulHeader = peekAllArgBytesToDst (h .mulHeader , h .h , key )
2049
2067
}
@@ -2069,8 +2087,7 @@ func (h *RequestHeader) PeekKeys() [][]byte {
2069
2087
// Any future calls to the Peek* will modify the returned value.
2070
2088
// Do not store references to returned value. Make copies instead.
2071
2089
func (h * RequestHeader ) PeekTrailerKeys () [][]byte {
2072
- h .mulHeader = h .mulHeader [:0 ]
2073
- h .mulHeader = peekArgsKeys (h .mulHeader , h .trailer )
2090
+ h .mulHeader = copyTrailer (h .mulHeader , h .trailer )
2074
2091
return h .mulHeader
2075
2092
}
2076
2093
@@ -2094,7 +2111,9 @@ func (h *ResponseHeader) PeekKeys() [][]byte {
2094
2111
// Do not store references to returned value. Make copies instead.
2095
2112
func (h * ResponseHeader ) PeekTrailerKeys () [][]byte {
2096
2113
h .mulHeader = h .mulHeader [:0 ]
2097
- h .mulHeader = peekArgsKeys (h .mulHeader , h .trailer )
2114
+ for i , n := 0 , len (h .trailer ); i < n ; i ++ {
2115
+ h .mulHeader = append (h .mulHeader , h .trailer [i ])
2116
+ }
2098
2117
return h .mulHeader
2099
2118
}
2100
2119
@@ -2462,8 +2481,8 @@ func (h *ResponseHeader) writeTrailer(w *bufio.Writer) error {
2462
2481
func (h * ResponseHeader ) TrailerHeader () []byte {
2463
2482
h .bufV = h .bufV [:0 ]
2464
2483
for _ , t := range h .trailer {
2465
- value := h .peek (t . key )
2466
- h .bufV = appendHeaderLine (h .bufV , t . key , value )
2484
+ value := h .peek (t )
2485
+ h .bufV = appendHeaderLine (h .bufV , t , value )
2467
2486
}
2468
2487
h .bufV = append (h .bufV , strCRLF ... )
2469
2488
return h .bufV
@@ -2523,7 +2542,7 @@ func (h *ResponseHeader) AppendBytes(dst []byte) []byte {
2523
2542
// Exclude trailer from header
2524
2543
exclude := false
2525
2544
for _ , t := range h .trailer {
2526
- if bytes .Equal (kv .key , t . key ) {
2545
+ if bytes .Equal (kv .key , t ) {
2527
2546
exclude = true
2528
2547
break
2529
2548
}
@@ -2534,7 +2553,7 @@ func (h *ResponseHeader) AppendBytes(dst []byte) []byte {
2534
2553
}
2535
2554
2536
2555
if len (h .trailer ) > 0 {
2537
- dst = appendHeaderLine (dst , strTrailer , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
2556
+ dst = appendHeaderLine (dst , strTrailer , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
2538
2557
}
2539
2558
2540
2559
n := len (h .cookies )
@@ -2594,8 +2613,8 @@ func (h *RequestHeader) writeTrailer(w *bufio.Writer) error {
2594
2613
func (h * RequestHeader ) TrailerHeader () []byte {
2595
2614
h .bufV = h .bufV [:0 ]
2596
2615
for _ , t := range h .trailer {
2597
- value := h .peek (t . key )
2598
- h .bufV = appendHeaderLine (h .bufV , t . key , value )
2616
+ value := h .peek (t )
2617
+ h .bufV = appendHeaderLine (h .bufV , t , value )
2599
2618
}
2600
2619
h .bufV = append (h .bufV , strCRLF ... )
2601
2620
return h .bufV
@@ -2656,7 +2675,7 @@ func (h *RequestHeader) AppendBytes(dst []byte) []byte {
2656
2675
// Exclude trailer from header
2657
2676
exclude := false
2658
2677
for _ , t := range h .trailer {
2659
- if bytes .Equal (kv .key , t . key ) {
2678
+ if bytes .Equal (kv .key , t ) {
2660
2679
exclude = true
2661
2680
break
2662
2681
}
@@ -2667,7 +2686,7 @@ func (h *RequestHeader) AppendBytes(dst []byte) []byte {
2667
2686
}
2668
2687
2669
2688
if len (h .trailer ) > 0 {
2670
- dst = appendHeaderLine (dst , strTrailer , appendArgsKeyBytes (nil , h .trailer , strCommaSpace ))
2689
+ dst = appendHeaderLine (dst , strTrailer , appendTrailerBytes (nil , h .trailer , strCommaSpace ))
2671
2690
}
2672
2691
2673
2692
// there is no need in h.collectCookies() here, since if cookies aren't collected yet,
@@ -3608,17 +3627,30 @@ func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte {
3608
3627
return AppendNormalizedHeaderKey (dst , b2s (key ))
3609
3628
}
3610
3629
3611
- func appendArgsKeyBytes (dst []byte , args []argsKV , sep []byte ) []byte {
3612
- for i , n := 0 , len (args ); i < n ; i ++ {
3613
- kv := & args [i ]
3614
- dst = append (dst , kv .key ... )
3630
+ func appendTrailerBytes (dst []byte , trailer [][]byte , sep []byte ) []byte {
3631
+ for i , n := 0 , len (trailer ); i < n ; i ++ {
3632
+ dst = append (dst , trailer [i ]... )
3615
3633
if i + 1 < n {
3616
3634
dst = append (dst , sep ... )
3617
3635
}
3618
3636
}
3619
3637
return dst
3620
3638
}
3621
3639
3640
+ func copyTrailer (dst , src [][]byte ) [][]byte {
3641
+ if cap (dst ) > len (src ) {
3642
+ dst = dst [:len (src )]
3643
+ } else {
3644
+ dst = append (dst [:0 ], src ... )
3645
+ }
3646
+
3647
+ for i := range dst {
3648
+ dst [i ] = make ([]byte , len (src [i ]))
3649
+ copy (dst [i ], src [i ])
3650
+ }
3651
+ return dst
3652
+ }
3653
+
3622
3654
var (
3623
3655
errNeedMore = errors .New ("need more data: cannot find trailing lf" )
3624
3656
errInvalidName = errors .New ("invalid header name" )
0 commit comments