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:
1 parent
b89c53c640
commit
07f68292d1
2 files changed
+48
-3
No files matched your search
@@ -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)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user