helpers.go (46 lines of code) (raw):

package terminal import ( "net" "net/http" "regexp" "strings" log "github.com/sirupsen/logrus" ) var scrubRegexp = regexp.MustCompile(`(?i)([\?&]((?:private|authenticity|rss)[\-_]token)|(?:X-AMZ-)?Signature)=[^&]*`) func fail500(w http.ResponseWriter, r *http.Request, err error) { http.Error(w, "Internal server error", 500) printError(r, err) } func printError(r *http.Request, err error) { if r != nil { log.WithFields(log.Fields{ "method": r.Method, "uri": scrubURLParams(r.RequestURI), }).WithError(err).Error("error") } else { log.WithError(err).Error("unknown error") } } func headerClone(h http.Header) http.Header { h2 := make(http.Header, len(h)) for k, vv := range h { vv2 := make([]string, len(vv)) copy(vv2, vv) h2[k] = vv2 } return h2 } func setForwardedFor(newHeaders *http.Header, originalRequest *http.Request) { if clientIP, _, err := net.SplitHostPort(originalRequest.RemoteAddr); err == nil { var header string // If we aren't the first proxy retain prior // X-Forwarded-For information as a comma+space // separated list and fold multiple headers into one. if prior, ok := originalRequest.Header["X-Forwarded-For"]; ok { header = strings.Join(prior, ", ") + ", " + clientIP } else { header = clientIP } newHeaders.Set("X-Forwarded-For", header) } } // ScrubURLParams replaces the content of any sensitive query string parameters // in an URL with `[FILTERED]` func scrubURLParams(url string) string { return scrubRegexp.ReplaceAllString(url, "$1=[FILTERED]") }