Skip to content

Commit f8d269e

Browse files
committed
Update Denco Implementation
1 parent d26a701 commit f8d269e

File tree

2 files changed

+18
-78
lines changed

2 files changed

+18
-78
lines changed

bench_test.go

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,7 @@ func BenchmarkBone_Param(b *testing.B) {
8484
benchRequest(b, router, r)
8585
}
8686
func BenchmarkDenco_Param(b *testing.B) {
87-
handler := new(dencoHandler)
88-
router := loadDencoSingle(
89-
"GET", "/user/:name",
90-
handler, http.HandlerFunc(handler.Get),
91-
)
87+
router := loadDencoSingle("GET", "/user/:name", dencoHandler)
9288

9389
r, _ := http.NewRequest("GET", "/user/gordon", nil)
9490
benchRequest(b, router, r)
@@ -236,11 +232,7 @@ func BenchmarkBone_Param5(b *testing.B) {
236232
benchRequest(b, router, r)
237233
}
238234
func BenchmarkDenco_Param5(b *testing.B) {
239-
handler := new(dencoHandler)
240-
router := loadDencoSingle(
241-
"GET", fiveColon,
242-
handler, http.HandlerFunc(handler.Get),
243-
)
235+
router := loadDencoSingle("GET", fiveColon, dencoHandler)
244236

245237
r, _ := http.NewRequest("GET", fiveRoute, nil)
246238
benchRequest(b, router, r)
@@ -388,11 +380,7 @@ func BenchmarkBone_Param20(b *testing.B) {
388380
benchRequest(b, router, r)
389381
}
390382
func BenchmarkDenco_Param20(b *testing.B) {
391-
handler := new(dencoHandler)
392-
router := loadDencoSingle(
393-
"GET", twentyColon,
394-
handler, http.HandlerFunc(handler.Get),
395-
)
383+
router := loadDencoSingle("GET", twentyColon, dencoHandler)
396384

397385
r, _ := http.NewRequest("GET", twentyRoute, nil)
398386
benchRequest(b, router, r)
@@ -536,11 +524,7 @@ func BenchmarkBone_ParamWrite(b *testing.B) {
536524
benchRequest(b, router, r)
537525
}
538526
func BenchmarkDenco_ParamWrite(b *testing.B) {
539-
handler := new(dencoHandler)
540-
router := loadDencoSingle(
541-
"GET", "/user/:name",
542-
handler, http.HandlerFunc(handler.dencoHandlerWrite),
543-
)
527+
router := loadDencoSingle("GET", "/user/:name", dencoHandlerWrite)
544528

545529
r, _ := http.NewRequest("GET", "/user/gordon", nil)
546530
benchRequest(b, router, r)

routers.go

Lines changed: 14 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -205,32 +205,11 @@ func loadBoneSingle(method, path string, handler http.Handler) http.Handler {
205205
}
206206

207207
// Denco
208-
type dencoHandler struct {
209-
routerMap map[string]*denco.Router
210-
params []denco.Param
211-
}
212-
213-
func (h *dencoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
214-
router, found := h.routerMap[r.Method]
215-
if !found {
216-
panic("Unknown HTTP method: " + r.Method)
217-
}
218-
meth, params, found := router.Lookup(r.URL.Path)
219-
if !found {
220-
panic("Router not found: " + r.URL.Path)
221-
}
222-
h.params = params
223-
meth.(http.HandlerFunc).ServeHTTP(w, r)
224-
}
208+
func dencoHandler(w http.ResponseWriter, r *http.Request, params denco.Params) {}
225209

226-
func (h *dencoHandler) Get(w http.ResponseWriter, r *http.Request) {}
227-
func (h *dencoHandler) Post(w http.ResponseWriter, r *http.Request) {}
228-
func (h *dencoHandler) Put(w http.ResponseWriter, r *http.Request) {}
229-
func (h *dencoHandler) Patch(w http.ResponseWriter, r *http.Request) {}
230-
func (h *dencoHandler) Delete(w http.ResponseWriter, r *http.Request) {}
231-
func (h *dencoHandler) dencoHandlerWrite(w http.ResponseWriter, r *http.Request) {
210+
func dencoHandlerWrite(w http.ResponseWriter, r *http.Request, params denco.Params) {
232211
var name string
233-
for _, param := range h.params {
212+
for _, param := range params {
234213
if param.Name == "name" {
235214
name = param.Value
236215
break
@@ -240,46 +219,23 @@ func (h *dencoHandler) dencoHandlerWrite(w http.ResponseWriter, r *http.Request)
240219
}
241220

242221
func loadDenco(routes []route) http.Handler {
243-
handler := &dencoHandler{routerMap: map[string]*denco.Router{
244-
"GET": denco.New(),
245-
"POST": denco.New(),
246-
"PUT": denco.New(),
247-
"PATCH": denco.New(),
248-
"DELETE": denco.New(),
249-
}}
250-
recordMap := make(map[string][]denco.Record)
222+
mux := denco.NewMux()
223+
handlers := make([]denco.Handler, 0, len(routes))
251224
for _, route := range routes {
252-
var f http.HandlerFunc
253-
switch route.method {
254-
case "GET":
255-
f = handler.Get
256-
case "POST":
257-
f = handler.Post
258-
case "PUT":
259-
f = handler.Put
260-
case "PATCH":
261-
f = handler.Patch
262-
case "DELETE":
263-
f = handler.Delete
264-
}
265-
recordMap[route.method] = append(recordMap[route.method], denco.NewRecord(route.path, f))
225+
h := mux.Handler(route.method, route.path, dencoHandler)
226+
handlers = append(handlers, h)
266227
}
267-
for method, records := range recordMap {
268-
if err := handler.routerMap[method].Build(records); err != nil {
269-
panic(err)
270-
}
228+
handler, err := mux.Build(handlers)
229+
if err != nil {
230+
panic(err)
271231
}
272232
return handler
273233
}
274234

275-
func loadDencoSingle(method, path string, handler *dencoHandler, hfunc http.HandlerFunc) http.Handler {
276-
handler.routerMap = map[string]*denco.Router{
277-
method: denco.New(),
278-
}
279-
280-
if err := handler.routerMap[method].Build([]denco.Record{
281-
denco.NewRecord(path, hfunc),
282-
}); err != nil {
235+
func loadDencoSingle(method, path string, h denco.HandlerFunc) http.Handler {
236+
mux := denco.NewMux()
237+
handler, err := mux.Build([]denco.Handler{mux.Handler(method, path, h)})
238+
if err != nil {
283239
panic(err)
284240
}
285241
return handler

0 commit comments

Comments
 (0)