Added middleware support

This commit is contained in:
2024-03-13 20:18:01 +01:00
parent 1bcf4794f5
commit e69a66aa31
9 changed files with 135 additions and 157 deletions

View File

@ -15,8 +15,9 @@ import (
// Server represents a single web service.
type Server struct {
Router *router.Router[Handler]
Config Configuration
Router *router.Router[Handler]
Config Configuration
handlers []Handler
}
// New creates a new server.
@ -24,6 +25,17 @@ func New() *Server {
return &Server{
Router: router.New[Handler](),
Config: defaultConfig(),
handlers: []Handler{
func(c Context) error {
handler := c.(*ctx).server.Router.LookupNoAlloc(c.Method(), c.Path(), c.(*ctx).addParameter)
if handler == nil {
return c.Status(http.StatusNotFound).String(http.StatusText(http.StatusNotFound))
}
return handler(c)
},
},
}
}
@ -49,18 +61,10 @@ func (server *Server) Put(path string, handler Handler) {
// ServeHTTP responds to the given request.
func (server *Server) ServeHTTP(response http.ResponseWriter, request *http.Request) {
ctx := newContext(request, response)
ctx := newContext(request, response, server)
defer contextPool.Put(ctx)
handler := server.Router.LookupNoAlloc(request.Method, request.URL.Path, ctx.addParameter)
if handler == nil {
response.WriteHeader(http.StatusNotFound)
response.(io.StringWriter).WriteString(http.StatusText(http.StatusNotFound))
return
}
err := handler(ctx)
err := server.handlers[0](ctx)
if err != nil {
response.(io.StringWriter).WriteString(err.Error())
@ -96,3 +100,10 @@ func (server *Server) Run(address string) error {
return srv.Shutdown(ctx)
}
// Use adds handlers to your handlers chain.
func (server *Server) Use(handlers ...Handler) {
last := server.handlers[len(server.handlers)-1]
server.handlers = append(server.handlers[:len(server.handlers)-1], handlers...)
server.handlers = append(server.handlers, last)
}