75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
|
/********************************
|
||
|
*** Multiplexer for Go ***
|
||
|
*** Bone is under MIT license ***
|
||
|
*** Code by CodingFerret ***
|
||
|
*** github.com/go-zoo ***
|
||
|
*********************************/
|
||
|
|
||
|
package bone
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Mux have routes and a notFound handler
|
||
|
// Route: all the registred route
|
||
|
// notFound: 404 handler, default http.NotFound if not provided
|
||
|
type Mux struct {
|
||
|
Routes map[string][]*Route
|
||
|
prefix string
|
||
|
notFound http.Handler
|
||
|
Serve func(rw http.ResponseWriter, req *http.Request)
|
||
|
CaseSensitive bool
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
static = "static"
|
||
|
method = []string{"GET", "POST", "PUT", "DELETE", "HEAD", "PATCH", "OPTIONS"}
|
||
|
)
|
||
|
|
||
|
type adapter func(*Mux) *Mux
|
||
|
|
||
|
// New create a pointer to a Mux instance
|
||
|
func New(adapters ...adapter) *Mux {
|
||
|
m := &Mux{Routes: make(map[string][]*Route), Serve: nil, CaseSensitive: true}
|
||
|
for _, adap := range adapters {
|
||
|
adap(m)
|
||
|
}
|
||
|
if m.Serve == nil {
|
||
|
m.Serve = m.DefaultServe
|
||
|
}
|
||
|
return m
|
||
|
}
|
||
|
|
||
|
// Prefix set a default prefix for all routes registred on the router
|
||
|
func (m *Mux) Prefix(p string) *Mux {
|
||
|
m.prefix = strings.TrimSuffix(p, "/")
|
||
|
return m
|
||
|
}
|
||
|
|
||
|
// DefaultServe is the default http request handler
|
||
|
func (m *Mux) DefaultServe(rw http.ResponseWriter, req *http.Request) {
|
||
|
// Check if a route match
|
||
|
if !m.parse(rw, req) {
|
||
|
// Check if it's a static ressource
|
||
|
if !m.staticRoute(rw, req) {
|
||
|
// Check if the request path doesn't end with /
|
||
|
if !m.validate(rw, req) {
|
||
|
// Check if same route exists for another HTTP method
|
||
|
if !m.otherMethods(rw, req) {
|
||
|
m.HandleNotFound(rw, req)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ServeHTTP pass the request to the serve method of Mux
|
||
|
func (m *Mux) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||
|
if !m.CaseSensitive {
|
||
|
req.URL.Path = strings.ToLower(req.URL.Path)
|
||
|
}
|
||
|
m.Serve(rw, req)
|
||
|
}
|