diff --git a/web/router_test.go b/web/router_test.go index ed37c6a..1d2c27e 100644 --- a/web/router_test.go +++ b/web/router_test.go @@ -88,7 +88,8 @@ var testHandlerTable = map[string]string{ "/a": "http fn", "/b": "http handler", "/c": "web fn", - "/d": "httpc", + "/d": "web handler", + "/e": "httpc", } func TestHandlerTypes(t *testing.T) { @@ -105,7 +106,10 @@ func TestHandlerTypes(t *testing.T) { m.Get("/c", func(c C, w http.ResponseWriter, r *http.Request) { ch <- "web fn" }) - m.Get("/d", testHandler(ch)) + m.Get("/d", HandlerFunc(func(c C, w http.ResponseWriter, r *http.Request) { + ch <- "web handler" + })) + m.Get("/e", testHandler(ch)) for route, response := range testHandlerTable { r, _ := http.NewRequest("GET", route, nil) diff --git a/web/web.go b/web/web.go index a65e1a2..91bbedc 100644 --- a/web/web.go +++ b/web/web.go @@ -38,6 +38,22 @@ type Handler interface { ServeHTTPC(C, http.ResponseWriter, *http.Request) } +// HandlerFunc is similar to net/http's http.HandlerFunc, but supports a context +// object. Implements both http.Handler and Handler. +type HandlerFunc func(C, http.ResponseWriter, *http.Request) + +// ServeHTTP implements http.Handler, allowing HandlerFunc's to be used with +// net/http and other compliant routers. When used in this way, the underlying +// function will be passed an empty context. +func (h HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h(C{}, w, r) +} + +// ServeHTTPC implements Handler. +func (h HandlerFunc) ServeHTTPC(c C, w http.ResponseWriter, r *http.Request) { + h(c, w, r) +} + /* PatternType is the type denoting Patterns and types that Goji internally converts to Pattern (via the ParsePattern function). In order to provide an