| 23 | } |
| 24 | |
| 25 | func (s *streamingBodyDumper) init() { |
| 26 | s.once.Do(func() { |
| 27 | if err := os.MkdirAll(filepath.Dir(s.dumpPath), 0o755); err != nil { |
| 28 | s.initErr = xerrors.Errorf("create dump dir: %w", err) |
| 29 | return |
| 30 | } |
| 31 | f, err := os.Create(s.dumpPath) |
| 32 | if err != nil { |
| 33 | s.initErr = xerrors.Errorf("create dump file: %w", err) |
| 34 | return |
| 35 | } |
| 36 | s.file = f |
| 37 | // Write headers first. |
| 38 | if _, err := s.file.Write(s.headerData); err != nil { |
| 39 | s.initErr = xerrors.Errorf("write headers: %w", err) |
| 40 | _ = s.file.Close() // best-effort cleanup on header write failure |
| 41 | s.file = nil |
| 42 | } |
| 43 | }) |
| 44 | } |
| 45 | |
| 46 | func (s *streamingBodyDumper) Read(p []byte) (int, error) { |
| 47 | n, err := s.body.Read(p) |