Permalink
| package lion | |
| import ( | |
| "net/http" | |
| "golang.org/x/net/context" | |
| ) | |
| // Handler responds to an HTTP request | |
| type Handler interface { | |
| ServeHTTPC(context.Context, http.ResponseWriter, *http.Request) | |
| } | |
| // HandlerFunc is a wrapper for a function to implement the Handler interface | |
| type HandlerFunc func(context.Context, http.ResponseWriter, *http.Request) | |
| // ServeHTTP makes HandlerFunc implement net/http.Handler interface | |
| func (h HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |
| h(context.TODO(), w, r) | |
| } | |
| // ServeHTTPC makes HandlerFunc implement Handler interface | |
| func (h HandlerFunc) ServeHTTPC(c context.Context, w http.ResponseWriter, r *http.Request) { | |
| h(c, w, r) | |
| } | |
| // Middleware interface that takes as input a Handler and returns a Handler | |
| type Middleware interface { | |
| ServeNext(Handler) Handler | |
| } | |
| // MiddlewareFunc wraps a function that takes as input a Handler and returns a Handler. So that it implements the Middlewares interface | |
| type MiddlewareFunc func(Handler) Handler | |
| // ServeNext makes MiddlewareFunc implement Middleware | |
| func (m MiddlewareFunc) ServeNext(next Handler) Handler { | |
| return m(next) | |
| } | |
| // Middlewares is an array of Middleware | |
| type Middlewares []Middleware | |
| func (middlewares Middlewares) BuildHandler(handler Handler) Handler { | |
| for i := len(middlewares) - 1; i >= 0; i-- { | |
| handler = middlewares[i].ServeNext(handler) | |
| } | |
| return handler | |
| } |