MCPcopy
hub / github.com/keploy/keploy / processHeaderBlock

Method processHeaderBlock

pkg/http2.go:352–416  ·  view source on GitHub ↗

processHeaderBlock decodes accumulated header fragments for the given side

(s *HTTP2StreamState, isOutgoing bool)

Source from the content-addressed store, hash-verified

350
351// processHeaderBlock decodes accumulated header fragments for the given side
352func (sm *DefaultStreamManager) processHeaderBlock(s *HTTP2StreamState, isOutgoing bool) error {
353 var headerBlock []byte
354 var fields []hpack.HeaderField
355 var err error
356
357 if isOutgoing {
358 if len(s.respHeaderFrags) == 0 {
359 return nil
360 }
361 headerBlock = bytes.Join(s.respHeaderFrags, nil)
362 s.respHeaderFrags = nil
363
364 fields, err = sm.decoderOut.DecodeFull(headerBlock)
365 if err != nil {
366 return fmt.Errorf("failed to decode response headers: %v", err)
367 }
368
369 h := ProcessHeaders(fields)
370
371 if !s.respHeadersReceived {
372 // Initial response headers
373 if s.grpcResp == nil {
374 s.grpcResp = &models.GrpcResp{}
375 }
376 s.grpcResp.Headers = *h
377 s.respHeadersReceived = true
378 return nil
379 }
380
381 // Subsequent headers on response side are trailers
382 if s.grpcResp == nil {
383 s.grpcResp = &models.GrpcResp{}
384 }
385 s.grpcResp.Trailers = *h
386 s.respTrailersReceived = true
387 return nil
388
389 } else {
390 if len(s.reqHeaderFrags) == 0 {
391 return nil
392 }
393 headerBlock = bytes.Join(s.reqHeaderFrags, nil)
394 s.reqHeaderFrags = nil
395
396 fields, err = sm.decoderIn.DecodeFull(headerBlock)
397 if err != nil {
398 return fmt.Errorf("failed to decode request headers: %v", err)
399 }
400
401 h := ProcessHeaders(fields)
402
403 // gRPC client rarely sends request trailers; treat first block as headers
404 if !s.reqHeadersReceived {
405 if s.grpcReq == nil {
406 s.grpcReq = &models.GrpcReq{}
407 }
408 s.grpcReq.Headers = *h
409 s.reqHeadersReceived = true

Callers 1

HandleFrameMethod · 0.95

Calls 1

ProcessHeadersFunction · 0.85

Tested by

no test coverage detected