-
Notifications
You must be signed in to change notification settings - Fork 0
/
ittp.go
101 lines (82 loc) · 3.13 KB
/
ittp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package ittp
import (
"fmt"
"net/http"
)
type (
// ServeMux is a wrapper around the standard library ServeMux and is intended to work
// in the exact same way except with middlewareFuncs and helper functions.
ServeMux struct {
stdMux *http.ServeMux
middlewares []middlewareFunc
}
middlewareFunc func(next http.Handler) http.Handler
)
// NewServeMux allocates and returns a new ittp.ServeMux
func NewServeMux() *ServeMux {
return &ServeMux{
http.NewServeMux(),
[]middlewareFunc{},
}
}
// ServeHTTP adds the middlewareFuncs to http.ServeMux in chronological order, then calls ServeHTTP.
func (m *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var h http.Handler = m.stdMux
for i := len(m.middlewares) - 1; i >= 0; i-- {
h = m.middlewares[i](h)
}
h.ServeHTTP(w, r)
}
// MethodHandleFunc uses go 1.22 routing with the method specified.
func (m *ServeMux) MethodHandleFunc(method string, path string, handler http.HandlerFunc) {
m.stdMux.HandleFunc(fmt.Sprintf("%s %s", method, path), handler)
}
// MethodHandle uses go 1.22 routing with the method specified.
func (m *ServeMux) MethodHandle(method string, path string, handler http.Handler) {
m.stdMux.Handle(fmt.Sprintf("%s %s", method, path), handler)
}
// HandleFunc just passes pattern and handler to the standard mux.
// Allows ittp to be used as a direct replacement to net/http package.
func (m *ServeMux) HandleFunc(pattern string, handler http.HandlerFunc) {
m.stdMux.HandleFunc(pattern, handler)
}
// Handle just passes pattern and handler to the standard mux.
// Allows ittp to be used as a direct replacement to net/http package.
func (m *ServeMux) Handle(pattern string, handler http.Handler) {
m.stdMux.Handle(pattern, handler)
}
func (m *ServeMux) Get(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodGet, path, handler)
}
func (m *ServeMux) Head(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodHead, path, handler)
}
func (m *ServeMux) Post(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodPost, path, handler)
}
func (m *ServeMux) Put(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodPut, path, handler)
}
func (m *ServeMux) Patch(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodPatch, path, handler)
}
func (m *ServeMux) Delete(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodDelete, path, handler)
}
func (m *ServeMux) Connect(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodConnect, path, handler)
}
func (m *ServeMux) Options(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodOptions, path, handler)
}
func (m *ServeMux) Trace(path string, handler http.HandlerFunc) {
m.MethodHandleFunc(http.MethodTrace, path, handler)
}
// AddMiddleware adds a ittp.middlewareFunc to ServeMux's middlewareFunc slice.
// middlewareFuncs are executed in chronological order.
func (m *ServeMux) AddMiddleware(middlware middlewareFunc) {
m.middlewares = append(m.middlewares, middlware)
}
func (m *ServeMux) Handler(r *http.Request) (h http.Handler, pattern string) {
return m.stdMux.Handler(r)
}