diff --git a/internal/replay/replay_http_server.go b/internal/replay/replay_http_server.go index ebb42dc..746d627 100644 --- a/internal/replay/replay_http_server.go +++ b/internal/replay/replay_http_server.go @@ -109,7 +109,7 @@ func (r *ReplayHTTPServer) handleRequest(w http.ResponseWriter, req *http.Reques return } - err = r.writeResponse(w, resp) + err = r.writeResponse(w, resp, redactedReq) if err != nil { fmt.Printf("Error writing response: %v\n", err) panic(err) @@ -170,7 +170,7 @@ func (r *ReplayHTTPServer) loadResponse(fileName string, shaSum string) (*store. return nil, fmt.Errorf("response with shaSum %s not found in file", shaSum) } -func (r *ReplayHTTPServer) writeResponse(w http.ResponseWriter, resp *store.RecordedResponse) error { +func (r *ReplayHTTPServer) writeResponse(w http.ResponseWriter, resp *store.RecordedResponse, req *store.RecordedRequest) error { for key, value := range resp.Headers { if key == "Content-Length" || key == "Content-Encoding" { continue @@ -180,7 +180,7 @@ func (r *ReplayHTTPServer) writeResponse(w http.ResponseWriter, resp *store.Reco w.WriteHeader(int(resp.StatusCode)) - if len(resp.BodySegments) == 1 { + if !strings.Contains(req.URL, "alt=sse") { jsonBytes, err := json.Marshal(resp.BodySegments[0]) if err != nil { return err @@ -189,7 +189,6 @@ func (r *ReplayHTTPServer) writeResponse(w http.ResponseWriter, resp *store.Reco _, err = w.Write(jsonBytes) return err } else { - respToWrite := []byte{} for _, bodySegment := range resp.BodySegments { jsonBytes, err := json.Marshal(bodySegment) if err != nil { @@ -199,11 +198,9 @@ func (r *ReplayHTTPServer) writeResponse(w http.ResponseWriter, resp *store.Reco line := append([]byte("data: "), jsonBytes...) line = append(line, []byte("\n\n")...) - respToWrite = append(respToWrite, line...) - } - - if _, err := w.Write(respToWrite); err != nil { - return err + if _, err := w.Write(line); err != nil { + return err + } } } diff --git a/internal/store/store.go b/internal/store/store.go index 85a2237..107b8ea 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -33,6 +33,7 @@ import ( ) const HeadSHA = "b4d6e60a9b97e7b98c63df9308728c5c88c0b40c398046772c63447b94608b4d" +const ReadBufferSize = 10 * 1024 * 1024 // 10MB // Represents a single interaction, request and response in a replay. type RecordInteraction struct { @@ -106,6 +107,9 @@ func readBody(req *http.Request) (map[string]any, error) { return nil, err } var resultMap map[string]any + if string(body) == "" { + return resultMap, nil + } err = json.Unmarshal(body, &resultMap) if err != nil { log.Fatalf("Error unmarshaling JSON: %v", err) @@ -186,6 +190,9 @@ func NewRecordedResponse(resp *http.Response, body []byte) (*RecordedResponse, e reader := bytes.NewReader(body) scanner := bufio.NewScanner(reader) + buf := make([]byte, ReadBufferSize) + scanner.Buffer(buf, ReadBufferSize) + for scanner.Scan() { lineBytes := scanner.Bytes() if len(lineBytes) == 0 {