diff options
Diffstat (limited to 'internal/proxy/repeat.go')
| -rw-r--r-- | internal/proxy/repeat.go | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/internal/proxy/repeat.go b/internal/proxy/repeat.go index 3ee7cea..f682b99 100644 --- a/internal/proxy/repeat.go +++ b/internal/proxy/repeat.go @@ -38,7 +38,7 @@ func (s *Server) sendRaw(ctx context.Context, scheme, host string, raw []byte, s conn, err := dialForRepeat(ctx, scheme, host) if err != nil { - return s.recordRaw(started, time.Since(started), scheme, host, method, path, raw, nil, 0, err.Error(), source) + return s.recordRaw(started, time.Since(started), scheme, host, method, path, raw, nil, false, false, 0, err.Error(), source) } defer conn.Close() // See the matching comment in forward(): without this, a hung @@ -48,37 +48,39 @@ func (s *Server) sendRaw(ctx context.Context, scheme, host string, raw []byte, s conn.SetDeadline(time.Now().Add(upstreamTimeout)) if _, err := conn.Write(raw); err != nil { - return s.recordRaw(started, time.Since(started), scheme, host, method, path, raw, nil, 0, err.Error(), source) + return s.recordRaw(started, time.Since(started), scheme, host, method, path, raw, nil, false, false, 0, err.Error(), source) } tee := newTeeConn(conn) resp, err := http.ReadResponse(bufio.NewReader(tee), &http.Request{Method: method}) duration := time.Since(started) if err != nil { - return s.recordRaw(started, duration, scheme, host, method, path, raw, nil, 0, err.Error(), source) + return s.recordRaw(started, duration, scheme, host, method, path, raw, nil, false, false, 0, err.Error(), source) } defer resp.Body.Close() io.Copy(io.Discard, resp.Body) - return s.recordRaw(started, duration, scheme, host, method, path, raw, tee.Take(), resp.StatusCode, "", source) + respRaw, truncated := tee.Take() + return s.recordRaw(started, duration, scheme, host, method, path, raw, respRaw, !truncated, truncated, resp.StatusCode, "", source) } func (s *Server) recordRaw(started time.Time, duration time.Duration, scheme, host, method, path string, - reqRaw, respRaw []byte, status int, errMsg, source string) (*store.Entry, error) { + reqRaw, respRaw []byte, respExact, respTruncated bool, status int, errMsg, source string) (*store.Entry, error) { e := &store.Entry{ - StartedAt: started, - Duration: duration, - Method: method, - Scheme: scheme, - Host: host, - Path: path, - StatusCode: status, - RequestRaw: reqRaw, - ResponseRaw: respRaw, - RequestExact: true, - ResponseExact: respRaw != nil, - Error: errMsg, - Source: source, + StartedAt: started, + Duration: duration, + Method: method, + Scheme: scheme, + Host: host, + Path: path, + StatusCode: status, + RequestRaw: reqRaw, + ResponseRaw: respRaw, + RequestExact: true, + ResponseExact: respRaw != nil && respExact, + ResponseTruncated: respRaw != nil && respTruncated, + Error: errMsg, + Source: source, } if s.store != nil { id, err := s.store.Insert(e) |