diff --git a/handler/forward/local/handler.go b/handler/forward/local/handler.go index 3b78a09f..0981224f 100644 --- a/handler/forward/local/handler.go +++ b/handler/forward/local/handler.go @@ -242,17 +242,20 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriteCloser, start := time.Now() ro.Time = start ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header.Clone(), + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header.Clone(), + }, } defer func() { if err != nil { ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.Header = resp.Header ro.Duration = time.Since(start) ro.Err = err.Error() @@ -393,7 +396,8 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriteCloser, ro.Err = err.Error() } if res != nil && ro.HTTP != nil { - ro.HTTP.ResponseHeader = res.Header + ro.HTTP.Response.ContentLength = res.ContentLength + ro.HTTP.Response.Header = res.Header ro.HTTP.StatusCode = res.StatusCode } ro.Record(ctx, h.recorder.Recorder) diff --git a/handler/forward/remote/handler.go b/handler/forward/remote/handler.go index 345adac4..7be1d169 100644 --- a/handler/forward/remote/handler.go +++ b/handler/forward/remote/handler.go @@ -242,17 +242,20 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriteCloser, start := time.Now() ro.Time = start ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header.Clone(), + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header.Clone(), + }, } defer func() { if err != nil { ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.Header = resp.Header ro.Duration = time.Since(start) ro.Err = err.Error() @@ -394,7 +397,8 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriteCloser, ro.Err = err.Error() } if res != nil && ro.HTTP != nil { - ro.HTTP.ResponseHeader = res.Header + ro.HTTP.Response.ContentLength = res.ContentLength + ro.HTTP.Response.Header = res.Header ro.HTTP.StatusCode = res.StatusCode } ro.Record(ctx, h.recorder.Recorder) diff --git a/handler/http/handler.go b/handler/http/handler.go index 08e034f9..832c472c 100644 --- a/handler/http/handler.go +++ b/handler/http/handler.go @@ -203,16 +203,19 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt } ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header.Clone(), + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header.Clone(), + }, } defer func() { ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.Header = resp.Header }() clientID, ok := h.authenticate(ctx, conn, req, resp, log) @@ -334,13 +337,16 @@ func (h *httpHandler) handleProxy(ctx context.Context, rw io.ReadWriteCloser, cc if ro.HTTP != nil { ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header.Clone(), - StatusCode: resp.StatusCode, + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + StatusCode: resp.StatusCode, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header.Clone(), + }, } } @@ -378,7 +384,8 @@ func (h *httpHandler) handleProxy(ctx context.Context, rw io.ReadWriteCloser, cc ro.Err = err.Error() } if res != nil && ro.HTTP != nil { - ro.HTTP.ResponseHeader = res.Header + ro.HTTP.Response.ContentLength = res.ContentLength + ro.HTTP.Response.Header = res.Header ro.HTTP.StatusCode = res.StatusCode } ro.Record(ctx, h.recorder.Recorder) diff --git a/handler/http2/handler.go b/handler/http2/handler.go index 35b67195..b28d05f1 100644 --- a/handler/http2/handler.go +++ b/handler/http2/handler.go @@ -198,16 +198,19 @@ func (h *http2Handler) roundTrip(ctx context.Context, w http.ResponseWriter, req } ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header.Clone(), + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header.Clone(), + }, } defer func() { ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.Header = resp.Header }() clientID, ok := h.authenticate(ctx, w, req, resp, log) diff --git a/handler/redirect/tcp/handler.go b/handler/redirect/tcp/handler.go index 170087ad..d668f809 100644 --- a/handler/redirect/tcp/handler.go +++ b/handler/redirect/tcp/handler.go @@ -180,12 +180,15 @@ func (h *redirectHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, radd } ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header, + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header, + }, } if log.IsLevelEnabled(logger.TraceLevel) { @@ -246,7 +249,8 @@ func (h *redirectHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, radd defer resp.Body.Close() ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.ContentLength = resp.ContentLength + ro.HTTP.Response.Header = resp.Header if log.IsLevelEnabled(logger.TraceLevel) { dump, _ := httputil.DumpResponse(resp, false) diff --git a/handler/sni/handler.go b/handler/sni/handler.go index f1868832..b1ba860c 100644 --- a/handler/sni/handler.go +++ b/handler/sni/handler.go @@ -129,12 +129,15 @@ func (h *sniHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, raddr net } ro.HTTP = &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Proto: req.Proto, - Scheme: req.URL.Scheme, - Method: req.Method, - URI: req.RequestURI, - RequestHeader: req.Header, + Host: req.Host, + Proto: req.Proto, + Scheme: req.URL.Scheme, + Method: req.Method, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header, + }, } if log.IsLevelEnabled(logger.TraceLevel) { @@ -192,7 +195,8 @@ func (h *sniHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, raddr net defer resp.Body.Close() ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.ContentLength = resp.ContentLength + ro.HTTP.Response.Header = resp.Header if log.IsLevelEnabled(logger.TraceLevel) { dump, _ := httputil.DumpResponse(resp, false) diff --git a/handler/tunnel/entrypoint.go b/handler/tunnel/entrypoint.go index 243c00fa..bbea4b47 100644 --- a/handler/tunnel/entrypoint.go +++ b/handler/tunnel/entrypoint.go @@ -91,12 +91,15 @@ func (ep *entrypoint) handle(ctx context.Context, conn net.Conn) error { Host: req.Host, Time: start, HTTP: &xrecorder.HTTPRecorderObject{ - Host: req.Host, - Method: req.Method, - Proto: req.Proto, - Scheme: req.URL.Scheme, - URI: req.RequestURI, - RequestHeader: req.Header, + Host: req.Host, + Method: req.Method, + Proto: req.Proto, + Scheme: req.URL.Scheme, + URI: req.RequestURI, + Request: xrecorder.HTTPRequestRecorderObject{ + ContentLength: req.ContentLength, + Header: req.Header, + }, }, } defer func() { @@ -107,7 +110,7 @@ func (ep *entrypoint) handle(ctx context.Context, conn net.Conn) error { }).Debugf("%s >-< %s", conn.RemoteAddr(), req.Host) ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.ResponseHeader = resp.Header + ro.HTTP.Response.Header = resp.Header ro.Duration = d ro.Err = err.Error() @@ -243,8 +246,9 @@ func (ep *entrypoint) handle(ctx context.Context, conn net.Conn) error { ro.Err = err.Error() } if res != nil && ro.HTTP != nil { - ro.HTTP.ResponseHeader = res.Header ro.HTTP.StatusCode = res.StatusCode + ro.HTTP.Response.ContentLength = res.ContentLength + ro.HTTP.Response.Header = res.Header } ro.Record(ctx, ep.recorder.Recorder) }() diff --git a/recorder/recorder.go b/recorder/recorder.go index 57cab9d1..a784c8d4 100644 --- a/recorder/recorder.go +++ b/recorder/recorder.go @@ -15,17 +15,25 @@ const ( RecorderServiceHandlerTunnel = "recorder.service.handler.tunnel" ) +type HTTPRequestRecorderObject struct { + ContentLength int64 `json:"contentLength"` + Header http.Header `json:"header"` +} + +type HTTPResponseRecorderObject struct { + ContentLength int64 `json:"contentLength"` + Header http.Header `json:"header"` +} + type HTTPRecorderObject struct { - Host string `json:"host"` - Method string `json:"method"` - Proto string `json:"proto"` - Scheme string `json:"scheme"` - URI string `json:"uri"` - StatusCode int `json:"statusCode"` - RequestHeader http.Header `json:"requestHeader"` - ResponseHeader http.Header `json:"responseHeader"` - // RequestBody string - // ResponseBody string + Host string `json:"host"` + Method string `json:"method"` + Proto string `json:"proto"` + Scheme string `json:"scheme"` + URI string `json:"uri"` + StatusCode int `json:"statusCode"` + Request HTTPRequestRecorderObject `json:"request"` + Response HTTPResponseRecorderObject `json:"response"` } type DNSRecorderObject struct {