check / check (push) Waiting to run
A Sentry event kept the Referer header verbatim, and a Referer can be an entrypoint URL: a sender that follows the README's http:// to https:// redirect sends the URL it was redirected from, and a browser sends the 404 page's URL under /h/ when it fetches that page's stylesheet. The Sentry hook now keeps only the Referer's scheme and host. The access log's reduction moves, unchanged, into a new package, internal/referer, as SchemeAndHost; the access log and the Sentry hook both call it there. The comment above sentryKeepsHeader and the README's Sentry passage say so. Model: opus-5-5
33 lines
1.1 KiB
Go
33 lines
1.1 KiB
Go
// Package referer reduces a Referer header to its scheme and host, so
|
|
// that a URL path, which on the receiver route carries the entrypoint
|
|
// UUID, never reaches a log line or an error report.
|
|
package referer
|
|
|
|
import "net/url"
|
|
|
|
// redacted stands in for a Referer that cannot be reduced to its
|
|
// scheme and host.
|
|
const redacted = "(redacted)"
|
|
|
|
// SchemeAndHost returns a Referer's scheme and host, never its path or
|
|
// query. The path can be an entrypoint URL, which carries the UUID: a
|
|
// sender that follows a redirect from http:// to https:// sends the
|
|
// URL it was redirected from, and a browser sends the 404 page's URL
|
|
// under /h/ when it fetches that page's stylesheet. A Referer without
|
|
// both a scheme and a host comes back as "(redacted)".
|
|
//
|
|
// It is the access log's referer field, and the Referer header the
|
|
// Sentry hook sends.
|
|
func SchemeAndHost(referer string) string {
|
|
if referer == "" {
|
|
return ""
|
|
}
|
|
|
|
parsed, err := url.Parse(referer)
|
|
if err != nil || parsed.Scheme == "" || parsed.Host == "" {
|
|
return redacted
|
|
}
|
|
|
|
return parsed.Scheme + "://" + parsed.Host
|
|
}
|