Skip to content

Instantly share code, notes, and snippets.

@arouene
Created November 14, 2020 15:35
Show Gist options
  • Save arouene/b2b7bff0b1947293fb64a1ba08b51f84 to your computer and use it in GitHub Desktop.
Save arouene/b2b7bff0b1947293fb64a1ba08b51f84 to your computer and use it in GitHub Desktop.
Golang http muxer with middleware support
package mux
import (
"fmt"
"net/http"
)
type Middleware struct {
mux *http.ServeMux
middlewares [](func(http.Handler) http.Handler)
}
func NewServeMux() Middleware {
return Middleware{
mux: http.NewServeMux(),
}
}
func (m *Middleware) AddMiddleware(handler func(http.Handler) http.Handler) {
m.middlewares = append(m.middlewares, handler)
}
func (m Middleware) Route(pattern string, f func(m *Middleware, prefix string) http.Handler) {
newMux := NewServeMux()
for _, h := range m.middlewares {
newMux.AddMiddleware(h)
}
m.mux.Handle(pattern, f(&newMux, pattern))
}
func (m Middleware) Handle(pattern string, handler func(http.ResponseWriter, *http.Request)) {
var newHandler http.Handler = http.HandlerFunc(handler)
for _, h := range m.middlewares {
newHandler = h(newHandler)
}
m.mux.Handle(pattern, newHandler)
}
func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
m.mux.ServeHTTP(w, r)
}
func (m Middleware) Error(w http.ResponseWriter, error string, code int) {
w.Header().Set("X-Content-Type-Options", "nosniff")
w.WriteHeader(code)
fmt.Fprintln(w, error)
}
func (m Middleware) Write(w http.ResponseWriter, msg string, args ...interface{}) {
fmt.Fprintf(w, msg, args...)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment