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

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

Model: opus-5-5
This commit is contained in:
sneak committed 2026-11-11 05:51:01 +00:00
1 parent b89c53c640
commit 07f68292d1
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)
}