Commit 04571ff3 authored by Matthew Holt's avatar Matthew Holt

NewReplacer takes third argument for empty value string

parent 7adff28a
...@@ -33,7 +33,7 @@ func (l Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { ...@@ -33,7 +33,7 @@ func (l Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
} }
status = 0 status = 0
} }
rep := middleware.NewReplacer(r, responseRecorder) rep := middleware.NewReplacer(r, responseRecorder, CommonLogEmptyValue)
rule.Log.Println(rep.Replace(rule.Format)) rule.Log.Println(rep.Replace(rule.Format))
return status, err return status, err
} }
...@@ -51,7 +51,8 @@ type Rule struct { ...@@ -51,7 +51,8 @@ type Rule struct {
const ( const (
DefaultLogFilename = "access.log" DefaultLogFilename = "access.log"
CommonLogFormat = `{remote} ` + middleware.EmptyStringReplacer + ` [{when}] "{method} {uri} {proto}" {status} {size}` CommonLogFormat = `{remote} ` + CommonLogEmptyValue + ` [{when}] "{method} {uri} {proto}" {status} {size}`
CommonLogEmptyValue = "-"
CombinedLogFormat = CommonLogFormat + ` "{>Referer}" "{>User-Agent}"` CombinedLogFormat = CommonLogFormat + ` "{>Referer}" "{>User-Agent}"`
DefaultLogFormat = CommonLogFormat DefaultLogFormat = CommonLogFormat
) )
...@@ -89,7 +89,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { ...@@ -89,7 +89,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
if replacer == nil { if replacer == nil {
rHost := r.Host rHost := r.Host
r.Host = requestHost r.Host = requestHost
replacer = middleware.NewReplacer(r, nil) replacer = middleware.NewReplacer(r, nil, "")
r.Host = rHost r.Host = rHost
} }
for header, values := range host.ExtraHeaders { for header, values := range host.ExtraHeaders {
......
...@@ -16,14 +16,18 @@ type Replacer interface { ...@@ -16,14 +16,18 @@ type Replacer interface {
Replace(string) string Replace(string) string
} }
type replacer map[string]string type replacer struct {
replacements map[string]string
emptyValue string
}
// NewReplacer makes a new replacer based on r and rr. // NewReplacer makes a new replacer based on r and rr.
// Do not create a new replacer until r and rr have all // Do not create a new replacer until r and rr have all
// the needed values, because this function copies those // the needed values, because this function copies those
// values into the replacer. // values into the replacer.
func NewReplacer(r *http.Request, rr *responseRecorder) Replacer { func NewReplacer(r *http.Request, rr *responseRecorder, emptyValue string) Replacer {
rep := replacer{ rep := replacer{
replacements: map[string]string{
"{method}": r.Method, "{method}": r.Method,
"{scheme}": func() string { "{scheme}": func() string {
if r.TLS != nil { if r.TLS != nil {
...@@ -53,20 +57,22 @@ func NewReplacer(r *http.Request, rr *responseRecorder) Replacer { ...@@ -53,20 +57,22 @@ func NewReplacer(r *http.Request, rr *responseRecorder) Replacer {
} }
return port return port
}(), }(),
"{uri}": r.RequestURI, "{uri}": r.URL.RequestURI(),
"{when}": func() string { "{when}": func() string {
return time.Now().Format(timeFormat) return time.Now().Format(timeFormat)
}(), }(),
},
emptyValue: emptyValue,
} }
if rr != nil { if rr != nil {
rep["{status}"] = strconv.Itoa(rr.status) rep.replacements["{status}"] = strconv.Itoa(rr.status)
rep["{size}"] = strconv.Itoa(rr.size) rep.replacements["{size}"] = strconv.Itoa(rr.size)
rep["{latency}"] = time.Since(rr.start).String() rep.replacements["{latency}"] = time.Since(rr.start).String()
} }
// Header placeholders // Header placeholders
for header, val := range r.Header { for header, val := range r.Header {
rep[headerReplacer+header+"}"] = strings.Join(val, ",") rep.replacements[headerReplacer+header+"}"] = strings.Join(val, ",")
} }
return rep return rep
...@@ -75,9 +81,9 @@ func NewReplacer(r *http.Request, rr *responseRecorder) Replacer { ...@@ -75,9 +81,9 @@ func NewReplacer(r *http.Request, rr *responseRecorder) Replacer {
// Replace performs a replacement of values on s and returns // Replace performs a replacement of values on s and returns
// the string with the replaced values. // the string with the replaced values.
func (r replacer) Replace(s string) string { func (r replacer) Replace(s string) string {
for placeholder, replacement := range r { for placeholder, replacement := range r.replacements {
if replacement == "" { if replacement == "" {
replacement = EmptyStringReplacer replacement = r.emptyValue
} }
s = strings.Replace(s, placeholder, replacement, -1) s = strings.Replace(s, placeholder, replacement, -1)
} }
...@@ -88,7 +94,7 @@ func (r replacer) Replace(s string) string { ...@@ -88,7 +94,7 @@ func (r replacer) Replace(s string) string {
endOffset := idxStart + len(headerReplacer) endOffset := idxStart + len(headerReplacer)
idxEnd := strings.Index(s[endOffset:], "}") idxEnd := strings.Index(s[endOffset:], "}")
if idxEnd > -1 { if idxEnd > -1 {
s = s[:idxStart] + EmptyStringReplacer + s[endOffset+idxEnd+1:] s = s[:idxStart] + r.emptyValue + s[endOffset+idxEnd+1:]
} else { } else {
break break
} }
...@@ -99,5 +105,4 @@ func (r replacer) Replace(s string) string { ...@@ -99,5 +105,4 @@ func (r replacer) Replace(s string) string {
const ( const (
timeFormat = "02/Jan/2006:15:04:05 -0700" timeFormat = "02/Jan/2006:15:04:05 -0700"
headerReplacer = "{>" headerReplacer = "{>"
EmptyStringReplacer = "-"
) )
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment