Request log: write & < > as sent (closes #327)
check / check (push) Waiting to run

Request lines were encoded with json.Marshal, which writes &, < and >
as &, < and >. A query string or referer then did not
read as the visitor sent it, and grep for it found nothing. Lines are
now written by a json.Encoder with HTML escaping off; they stay valid
JSON.

Model: opus-5-5
This commit is contained in:
sneak committed 2026-11-11 04:42:42 +00:00
1 parent f7e3190654
commit a659df14d1
2 files changed
+48 -3

No files matched your search

+10 -3
View File
@@ -5,6 +5,7 @@
package requestlog
import (
"bytes"
"encoding/json"
"fmt"
"io"
@@ -252,14 +253,20 @@ func WriteRProxyLine(w io.Writer, line *RProxyLine) error {
return writeJSONLine(w, line)
}
// writeJSONLine writes line to w as one JSON line.
// writeJSONLine writes line to w as one JSON line. It writes "&", "<" and
// ">" as they are, so a query string reads as it was sent.
func writeJSONLine(w io.Writer, line any) error {
encoded, err := json.Marshal(line)
var encoded bytes.Buffer
encoder := json.NewEncoder(&encoded)
encoder.SetEscapeHTML(false)
err := encoder.Encode(line)
if err != nil {
return fmt.Errorf("encode the request log line: %w", err)
}
_, err = w.Write(append(encoded, '\n'))
_, err = w.Write(encoded.Bytes())
if err != nil {
return fmt.Errorf("write the request log line: %w", err)
}