| 191 | } |
| 192 | |
| 193 | func (r *forwardReader) Close() error { |
| 194 | // Drain any remaining replies so the server-side goroutine isn't |
| 195 | // left blocked. The stream is request-scoped; when the parent |
| 196 | // context is cancelled (handler returns), Recv returns and we |
| 197 | // exit. A misbehaving backend that keeps emitting replies after |
| 198 | // cancellation is bounded by the iteration cap. |
| 199 | for i := 0; i < 1024; i++ { |
| 200 | if _, err := r.stream.Recv(); err != nil { |
| 201 | return nil |
| 202 | } |
| 203 | if r.stream.Context().Err() != nil { |
| 204 | return nil |
| 205 | } |
| 206 | } |
| 207 | return nil |
| 208 | } |