MCPcopy
hub / github.com/grpc/grpc-go / encodeHeader

Method encodeHeader

test/servertester.go:226–281  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

224// multiple pairs for keys (e.g. "cookie"). The :method, :path, and
225// :scheme headers default to GET, / and https.
226func (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
283func (st *serverTester) writeHeadersGRPC(streamID uint32, path string, endStream bool) {

Calls 3

encodeHeaderFieldMethod · 0.95
BytesMethod · 0.65
ResetMethod · 0.45