encodeHeader encodes headers and returns their HPACK bytes. headers must contain an even number of key/value pairs. There may be multiple pairs for keys (e.g. "cookie"). The :method, :path, and :scheme headers default to GET, / and https.
(headers ...string)
| 224 | // multiple pairs for keys (e.g. "cookie"). The :method, :path, and |
| 225 | // :scheme headers default to GET, / and https. |
| 226 | func (st *serverTester) encodeHeader(headers ...string) []byte { |
| 227 | if len(headers)%2 == 1 { |
| 228 | panic("odd number of kv args") |
| 229 | } |
| 230 | |
| 231 | st.headerBuf.Reset() |
| 232 | |
| 233 | if len(headers) == 0 { |
| 234 | // Fast path, mostly for benchmarks, so test code doesn't pollute |
| 235 | // profiles when we're looking to improve server allocations. |
| 236 | st.encodeHeaderField(":method", "GET") |
| 237 | st.encodeHeaderField(":path", "/") |
| 238 | st.encodeHeaderField(":scheme", "https") |
| 239 | return st.headerBuf.Bytes() |
| 240 | } |
| 241 | |
| 242 | if len(headers) == 2 && headers[0] == ":method" { |
| 243 | // Another fast path for benchmarks. |
| 244 | st.encodeHeaderField(":method", headers[1]) |
| 245 | st.encodeHeaderField(":path", "/") |
| 246 | st.encodeHeaderField(":scheme", "https") |
| 247 | return st.headerBuf.Bytes() |
| 248 | } |
| 249 | |
| 250 | pseudoCount := map[string]int{} |
| 251 | keys := []string{":method", ":path", ":scheme"} |
| 252 | vals := map[string][]string{ |
| 253 | ":method": {"GET"}, |
| 254 | ":path": {"/"}, |
| 255 | ":scheme": {"https"}, |
| 256 | } |
| 257 | for len(headers) > 0 { |
| 258 | k, v := headers[0], headers[1] |
| 259 | headers = headers[2:] |
| 260 | if _, ok := vals[k]; !ok { |
| 261 | keys = append(keys, k) |
| 262 | } |
| 263 | if strings.HasPrefix(k, ":") { |
| 264 | pseudoCount[k]++ |
| 265 | if pseudoCount[k] == 1 { |
| 266 | vals[k] = []string{v} |
| 267 | } else { |
| 268 | // Allows testing of invalid headers w/ dup pseudo fields. |
| 269 | vals[k] = append(vals[k], v) |
| 270 | } |
| 271 | } else { |
| 272 | vals[k] = append(vals[k], v) |
| 273 | } |
| 274 | } |
| 275 | for _, k := range keys { |
| 276 | for _, v := range vals[k] { |
| 277 | st.encodeHeaderField(k, v) |
| 278 | } |
| 279 | } |
| 280 | return st.headerBuf.Bytes() |
| 281 | } |
| 282 | |
| 283 | func (st *serverTester) writeHeadersGRPC(streamID uint32, path string, endStream bool) { |