64 KB
()
| 411 | const maxDrainBytes = 64 * 1024 // 64 KB |
| 412 | |
| 413 | func (r *recordingBody) drainToEOF() error { |
| 414 | buf := make([]byte, 4*1024) |
| 415 | var drained int64 |
| 416 | for { |
| 417 | n, err := r.inner.Read(buf) |
| 418 | |
| 419 | r.mu.Lock() |
| 420 | r.accumulateReadLocked(buf, n, err) |
| 421 | drained += int64(n) |
| 422 | r.mu.Unlock() |
| 423 | |
| 424 | if err != nil { |
| 425 | if errors.Is(err, io.EOF) { |
| 426 | return nil |
| 427 | } |
| 428 | return err |
| 429 | } |
| 430 | |
| 431 | // Safety valve: stop draining after maxDrainBytes to prevent |
| 432 | // Close() from blocking indefinitely on a chunked body. |
| 433 | if drained >= maxDrainBytes { |
| 434 | return io.ErrUnexpectedEOF |
| 435 | } |
| 436 | } |
| 437 | } |
| 438 | |
| 439 | func isCompleteUnknownLengthJSONBody(contentType string, body []byte) bool { |
| 440 | if !isJSONLikeContentType(contentType) { |