checkStreamCompletion decides when a stream is complete (request done + response done with trailers)
(streamID uint32)
| 478 | |
| 479 | // checkStreamCompletion decides when a stream is complete (request done + response done with trailers) |
| 480 | func (sm *DefaultStreamManager) checkStreamCompletion(streamID uint32) { |
| 481 | s := sm.streams[streamID] |
| 482 | if s == nil || s.isComplete == false { |
| 483 | // Request considered "done" once END_STREAM seen on request side and headers received. |
| 484 | reqDone := s.reqHeadersReceived && s.reqEndStreamReceived |
| 485 | |
| 486 | // Response considered "done" once headers + trailers received and END_STREAM on response. |
| 487 | respDone := s.respHeadersReceived && s.respTrailersReceived && s.respEndStreamReceived |
| 488 | |
| 489 | if reqDone && respDone { |
| 490 | sm.logger.Debug("Stream completed", zap.Any("stream", s)) |
| 491 | s.isComplete = true |
| 492 | } |
| 493 | } |
| 494 | } |
| 495 | |
| 496 | // ProcessHeaders converts HPACK header fields to a map |
| 497 | func ProcessHeaders(fields []hpack.HeaderField) *models.GrpcHeaders { |