From e81b1b98e9eb227c7358f0ee0258ec59ad3d84aa Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 26 Apr 2016 14:26:13 +0100 Subject: [PATCH] Add generic path rewrite middleware And fix a bug in the logging middleware. --- common/middleware/logging.go | 3 ++- common/middleware/path_rewrite.go | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 common/middleware/path_rewrite.go diff --git a/common/middleware/logging.go b/common/middleware/logging.go index 27207b862..d7de77e11 100644 --- a/common/middleware/logging.go +++ b/common/middleware/logging.go @@ -14,9 +14,10 @@ import ( var Logging = Func(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { begin := time.Now() + uri := r.RequestURI // capture the URI before running next, as it may get rewritten i := &interceptor{ResponseWriter: w, statusCode: http.StatusOK} next.ServeHTTP(i, r) - log.Infof("%s %s (%d) %s", r.Method, r.RequestURI, i.statusCode, time.Since(begin)) + log.Infof("%s %s (%d) %s", r.Method, uri, i.statusCode, time.Since(begin)) }) }) diff --git a/common/middleware/path_rewrite.go b/common/middleware/path_rewrite.go new file mode 100644 index 000000000..c19b4faec --- /dev/null +++ b/common/middleware/path_rewrite.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + "regexp" +) + +// PathRewrite supports regex matching and replace on Request URIs +func PathRewrite(regexp *regexp.Regexp, replacement string) Interface { + return pathRewrite{ + regexp: regexp, + replacement: replacement, + } +} + +type pathRewrite struct { + regexp *regexp.Regexp + replacement string +} + +func (p pathRewrite) Wrap(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.RequestURI = p.regexp.ReplaceAllString(r.RequestURI, p.replacement) + next.ServeHTTP(w, r) + }) +}