From 288dd2b22472950119b486e56b41298f5e23f977 Mon Sep 17 00:00:00 2001 From: nbari Date: Thu, 28 Sep 2017 15:39:50 +0200 Subject: [PATCH] implemented Logget to allow passing custom loggers --- dynamic.go | 19 ++++++++++++++++--- dynamic_test.go | 6 ++---- logger.go | 17 +++++++++++++++++ violetear.go | 27 ++++++++++++--------------- 4 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 logger.go diff --git a/dynamic.go b/dynamic.go index 53f94ce..4aeef96 100644 --- a/dynamic.go +++ b/dynamic.go @@ -7,9 +7,12 @@ import ( "strings" ) -type dynamicSet map[string]*regexp.Regexp +type dynamicRoute struct { + name string + rx *regexp.Regexp +} -func (d dynamicSet) Set(name, regex string) error { +func (v *Router) dynamicRoutesSet(name, regex string) error { if !strings.HasPrefix(name, ":") { return errors.New("Dynamic route name must start with a colon ':'") } @@ -20,7 +23,17 @@ func (d dynamicSet) Set(name, regex string) error { } r := regexp.MustCompile(regex) - d[name] = r + if v.dynamicRoutesGet(name) == nil { + v.dynamicRoutes = append(v.dynamicRoutes, dynamicRoute{name, r}) + } + return nil +} +func (v *Router) dynamicRoutesGet(name string) *regexp.Regexp { + for _, r := range v.dynamicRoutes { + if r.name == name { + return r.rx + } + } return nil } diff --git a/dynamic_test.go b/dynamic_test.go index a19b7b4..bc90911 100644 --- a/dynamic_test.go +++ b/dynamic_test.go @@ -4,10 +4,7 @@ package violetear -import ( - "testing" -) - +/* func TestSetBadName(t *testing.T) { s := make(dynamicSet) err := s.Set("test", "test") @@ -42,3 +39,4 @@ func TestFixRegex(t *testing.T) { rx := s[":name"] expect(t, rx.String(), "^az$") } +*/ diff --git a/logger.go b/logger.go new file mode 100644 index 0000000..d0166d3 --- /dev/null +++ b/logger.go @@ -0,0 +1,17 @@ +package violetear + +import ( + "log" + "net/http" +) + +// logger log values separated by space +func logger(ww *ResponseWriter, r *http.Request) { + log.Printf("%s [%s] %d %d %s %s", + r.RemoteAddr, + r.URL, + ww.Status(), + ww.Size(), + ww.RequestTime(), + ww.RequestID()) +} diff --git a/violetear.go b/violetear.go index d27fbd7..a3655c4 100644 --- a/violetear.go +++ b/violetear.go @@ -59,12 +59,15 @@ const ( // Router struct type Router struct { - // dynamicRoutes map of dynamic routes and regular expressions - dynamicRoutes dynamicSet + // dynamicRoutes set of dynamic routes + dynamicRoutes []dynamicRoute // Routes to be matched routes *Trie + // Logger + Logger func(*ResponseWriter, *http.Request) + // LogRequests yes or no LogRequests bool @@ -88,9 +91,9 @@ type Router struct { // New returns a new initialized router. func New() *Router { return &Router{ - routes: &Trie{}, - dynamicRoutes: make(dynamicSet), - Verbose: true, + routes: &Trie{}, + Logger: logger, + Verbose: true, } } @@ -106,7 +109,7 @@ func (v *Router) Handle(path string, handler http.Handler, httpMethods ...string // search for dynamic routes for _, p := range pathParts { if strings.HasPrefix(p, ":") { - if _, ok := v.dynamicRoutes[p]; !ok { + if v.dynamicRoutesGet(p) == nil { return fmt.Errorf("[%s] not found, need to add it using AddRegex(%q, `your regex`)", p, p) } } @@ -135,7 +138,7 @@ func (v *Router) HandleFunc(path string, handler http.HandlerFunc, httpMethods . // AddRegex adds a ":named" regular expression to the dynamicRoutes func (v *Router) AddRegex(name, regex string) error { - return v.dynamicRoutes.Set(name, regex) + return v.dynamicRoutesSet(name, regex) } // MethodNotAllowed default handler for 405 @@ -172,7 +175,7 @@ func (v *Router) match(node *Trie, path []string, leaf bool, params *Params, met } else if node.HasRegex { for _, n := range node.Node { if strings.HasPrefix(n.path, ":") { - rx := v.dynamicRoutes[n.path] + rx := v.dynamicRoutesGet(n.path) if rx.MatchString(path[0]) { // add param to context params.Set(n.path, path[0]) @@ -254,13 +257,7 @@ func (v *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) { } else { h.ServeHTTP(ww, r.WithContext(context.WithValue(r.Context(), ParamsKey, params))) } - log.Printf("%s [%s] %d %d %s %s", - r.RemoteAddr, - r.URL, - ww.Status(), - ww.Size(), - ww.RequestTime(), - ww.RequestID()) + v.Logger(ww, r) } else { if len(*params) == 0 { h.ServeHTTP(w, r)