From 04571ff39359124e100ca8dfc2794fb48548daca Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Fri, 24 Jul 2015 10:11:34 -0600 Subject: [PATCH] NewReplacer takes third argument for empty value string --- middleware/log/log.go | 11 ++--- middleware/proxy/proxy.go | 2 +- middleware/replacer.go | 95 ++++++++++++++++++++------------------- 3 files changed, 57 insertions(+), 51 deletions(-) diff --git a/middleware/log/log.go b/middleware/log/log.go index d6b147b8..45a3e9a2 100644 --- a/middleware/log/log.go +++ b/middleware/log/log.go @@ -33,7 +33,7 @@ func (l Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { } status = 0 } - rep := middleware.NewReplacer(r, responseRecorder) + rep := middleware.NewReplacer(r, responseRecorder, CommonLogEmptyValue) rule.Log.Println(rep.Replace(rule.Format)) return status, err } @@ -50,8 +50,9 @@ type Rule struct { } const ( - DefaultLogFilename = "access.log" - CommonLogFormat = `{remote} ` + middleware.EmptyStringReplacer + ` [{when}] "{method} {uri} {proto}" {status} {size}` - CombinedLogFormat = CommonLogFormat + ` "{>Referer}" "{>User-Agent}"` - DefaultLogFormat = CommonLogFormat + DefaultLogFilename = "access.log" + CommonLogFormat = `{remote} ` + CommonLogEmptyValue + ` [{when}] "{method} {uri} {proto}" {status} {size}` + CommonLogEmptyValue = "-" + CombinedLogFormat = CommonLogFormat + ` "{>Referer}" "{>User-Agent}"` + DefaultLogFormat = CommonLogFormat ) diff --git a/middleware/proxy/proxy.go b/middleware/proxy/proxy.go index 06aaf95a..25f2a45d 100644 --- a/middleware/proxy/proxy.go +++ b/middleware/proxy/proxy.go @@ -89,7 +89,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { if replacer == nil { rHost := r.Host r.Host = requestHost - replacer = middleware.NewReplacer(r, nil) + replacer = middleware.NewReplacer(r, nil, "") r.Host = rHost } for header, values := range host.ExtraHeaders { diff --git a/middleware/replacer.go b/middleware/replacer.go index d4818d92..33ae2882 100644 --- a/middleware/replacer.go +++ b/middleware/replacer.go @@ -16,57 +16,63 @@ type Replacer interface { 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. // Do not create a new replacer until r and rr have all // the needed values, because this function copies those // values into the replacer. -func NewReplacer(r *http.Request, rr *responseRecorder) Replacer { +func NewReplacer(r *http.Request, rr *responseRecorder, emptyValue string) Replacer { rep := replacer{ - "{method}": r.Method, - "{scheme}": func() string { - if r.TLS != nil { - return "https" - } - return "http" - }(), - "{host}": r.Host, - "{path}": r.URL.Path, - "{query}": r.URL.RawQuery, - "{fragment}": r.URL.Fragment, - "{proto}": r.Proto, - "{remote}": func() string { - if fwdFor := r.Header.Get("X-Forwarded-For"); fwdFor != "" { - return fwdFor - } - host, _, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - return r.RemoteAddr - } - return host - }(), - "{port}": func() string { - _, port, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - return "" - } - return port - }(), - "{uri}": r.RequestURI, - "{when}": func() string { - return time.Now().Format(timeFormat) - }(), + replacements: map[string]string{ + "{method}": r.Method, + "{scheme}": func() string { + if r.TLS != nil { + return "https" + } + return "http" + }(), + "{host}": r.Host, + "{path}": r.URL.Path, + "{query}": r.URL.RawQuery, + "{fragment}": r.URL.Fragment, + "{proto}": r.Proto, + "{remote}": func() string { + if fwdFor := r.Header.Get("X-Forwarded-For"); fwdFor != "" { + return fwdFor + } + host, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return host + }(), + "{port}": func() string { + _, port, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return "" + } + return port + }(), + "{uri}": r.URL.RequestURI(), + "{when}": func() string { + return time.Now().Format(timeFormat) + }(), + }, + emptyValue: emptyValue, } if rr != nil { - rep["{status}"] = strconv.Itoa(rr.status) - rep["{size}"] = strconv.Itoa(rr.size) - rep["{latency}"] = time.Since(rr.start).String() + rep.replacements["{status}"] = strconv.Itoa(rr.status) + rep.replacements["{size}"] = strconv.Itoa(rr.size) + rep.replacements["{latency}"] = time.Since(rr.start).String() } // Header placeholders for header, val := range r.Header { - rep[headerReplacer+header+"}"] = strings.Join(val, ",") + rep.replacements[headerReplacer+header+"}"] = strings.Join(val, ",") } return rep @@ -75,9 +81,9 @@ func NewReplacer(r *http.Request, rr *responseRecorder) Replacer { // Replace performs a replacement of values on s and returns // the string with the replaced values. func (r replacer) Replace(s string) string { - for placeholder, replacement := range r { + for placeholder, replacement := range r.replacements { if replacement == "" { - replacement = EmptyStringReplacer + replacement = r.emptyValue } s = strings.Replace(s, placeholder, replacement, -1) } @@ -88,7 +94,7 @@ func (r replacer) Replace(s string) string { endOffset := idxStart + len(headerReplacer) idxEnd := strings.Index(s[endOffset:], "}") if idxEnd > -1 { - s = s[:idxStart] + EmptyStringReplacer + s[endOffset+idxEnd+1:] + s = s[:idxStart] + r.emptyValue + s[endOffset+idxEnd+1:] } else { break } @@ -97,7 +103,6 @@ func (r replacer) Replace(s string) string { } const ( - timeFormat = "02/Jan/2006:15:04:05 -0700" - headerReplacer = "{>" - EmptyStringReplacer = "-" + timeFormat = "02/Jan/2006:15:04:05 -0700" + headerReplacer = "{>" )