diff --git a/httprewrite/rawbody.go b/httprewrite/rawbody.go index 354e077..9380afc 100644 --- a/httprewrite/rawbody.go +++ b/httprewrite/rawbody.go @@ -80,10 +80,13 @@ func getRawBodyReader(res *http.Response) (body io.ReadCloser, mimeType string, contentType := res.Header.Get("Content-Type") mimeType, params, err := mime.ParseMediaType(contentType) if err != nil { - return nil, "", fmt.Errorf("parse content type %q: %v", contentType, err) + mimeType = "text/plain" // Fallback } - if encoding == "" && strings.ToLower(params["charset"]) == "utf-8" { - // The body is already UTF-8 encoded and not compressed. + + // [FIX 1] Treat missing charset as UTF-8 (Modern Web Default) + // If encoding is empty and no charset is specified, pass the body through raw. + charsetParam := strings.ToLower(params["charset"]) + if encoding == "" && (charsetParam == "utf-8" || charsetParam == "") { return res.Body, mimeType, nil } @@ -92,6 +95,12 @@ func getRawBodyReader(res *http.Response) (body io.ReadCloser, mimeType string, return nil, "", fmt.Errorf("create decompressed reader for encoding %q: %v", encoding, err) } + // [FIX 2] If we reach here (because of compression), ensure we don't + // let charset.NewReader default to Windows-1252 if charset is missing. + if charsetParam == "" { + contentType = mimeType + "; charset=utf-8" + } + decodedReader, err := charset.NewReader(decompressedReader, contentType) if err != nil { decompressedReader.Close()