Skip to content

Commit 4a5e58f

Browse files
committed
add chi
Fixes #68
1 parent 5c7ec59 commit 4a5e58f

9 files changed

+144
-0
lines changed

bench_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ func BenchmarkBone_Param(b *testing.B) {
128128
r, _ := http.NewRequest("GET", "/user/gordon", nil)
129129
benchRequest(b, router, r)
130130
}
131+
func BenchmarkChi_Param(b *testing.B) {
132+
router := loadChiSingle("GET", "/user/{name}", httpHandlerFunc)
133+
134+
r, _ := http.NewRequest("GET", "/user/gordon", nil)
135+
benchRequest(b, router, r)
136+
}
131137
func BenchmarkCloudyKitRouter_Param(b *testing.B) {
132138
router := loadCloudyKitRouterSingle("GET", "/user/:name", cloudyKitRouterHandler)
133139

@@ -326,6 +332,12 @@ func BenchmarkBone_Param5(b *testing.B) {
326332
r, _ := http.NewRequest("GET", fiveRoute, nil)
327333
benchRequest(b, router, r)
328334
}
335+
func BenchmarkChi_Param5(b *testing.B) {
336+
router := loadChiSingle("GET", fiveBrace, httpHandlerFunc)
337+
338+
r, _ := http.NewRequest("GET", fiveRoute, nil)
339+
benchRequest(b, router, r)
340+
}
329341
func BenchmarkCloudyKitRouter_Param5(b *testing.B) {
330342
router := loadCloudyKitRouterSingle("GET", fiveColon, cloudyKitRouterHandler)
331343

@@ -524,6 +536,12 @@ func BenchmarkBone_Param20(b *testing.B) {
524536
r, _ := http.NewRequest("GET", twentyRoute, nil)
525537
benchRequest(b, router, r)
526538
}
539+
func BenchmarkChi_Param20(b *testing.B) {
540+
router := loadChiSingle("GET", twentyBrace, httpHandlerFunc)
541+
542+
r, _ := http.NewRequest("GET", twentyRoute, nil)
543+
benchRequest(b, router, r)
544+
}
527545
func BenchmarkCloudyKitRouter_Param20(b *testing.B) {
528546
router := loadCloudyKitRouterSingle("GET", twentyColon, cloudyKitRouterHandler)
529547

@@ -718,6 +736,12 @@ func BenchmarkBone_ParamWrite(b *testing.B) {
718736
r, _ := http.NewRequest("GET", "/user/gordon", nil)
719737
benchRequest(b, router, r)
720738
}
739+
func BenchmarkChi_ParamWrite(b *testing.B) {
740+
router := loadChiSingle("GET", "/user/{name}", chiHandleWrite)
741+
742+
r, _ := http.NewRequest("GET", "/user/gordon", nil)
743+
benchRequest(b, router, r)
744+
}
721745
func BenchmarkCloudyKitRouter_ParamWrite(b *testing.B) {
722746
router := loadCloudyKitRouterSingle("GET", "/user/:name", cloudyKitRouterHandler)
723747

github_test.go

+15
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ var (
278278
githubBear http.Handler
279279
githubBeego http.Handler
280280
githubBone http.Handler
281+
githubChi http.Handler
281282
githubCloudyKitRouter http.Handler
282283
githubDenco http.Handler
283284
githubEcho http.Handler
@@ -322,6 +323,9 @@ func init() {
322323
calcMem("Bone", func() {
323324
githubBone = loadBone(githubAPI)
324325
})
326+
calcMem("Chi", func() {
327+
githubChi = loadChi(githubAPI)
328+
})
325329
calcMem("CloudyKitRouter", func() {
326330
githubCloudyKitRouter = loadCloudyKitRouter(githubAPI)
327331
})
@@ -428,6 +432,10 @@ func BenchmarkCloudyKitRouter_GithubStatic(b *testing.B) {
428432
req, _ := http.NewRequest("GET", "/user/repos", nil)
429433
benchRequest(b, githubCloudyKitRouter, req)
430434
}
435+
func BenchmarkChi_GithubStatic(b *testing.B) {
436+
req, _ := http.NewRequest("GET", "/user/repos", nil)
437+
benchRequest(b, githubChi, req)
438+
}
431439
func BenchmarkDenco_GithubStatic(b *testing.B) {
432440
req, _ := http.NewRequest("GET", "/user/repos", nil)
433441
benchRequest(b, githubDenco, req)
@@ -552,6 +560,10 @@ func BenchmarkBone_GithubParam(b *testing.B) {
552560
req, _ := http.NewRequest("GET", "/repos/julienschmidt/httprouter/stargazers", nil)
553561
benchRequest(b, githubBone, req)
554562
}
563+
func BenchmarkChi_GithubParam(b *testing.B) {
564+
req, _ := http.NewRequest("GET", "/repos/julienschmidt/httprouter/stargazers", nil)
565+
benchRequest(b, githubChi, req)
566+
}
555567
func BenchmarkCloudyKitRouter_GithubParam(b *testing.B) {
556568
req, _ := http.NewRequest("GET", "/repos/julienschmidt/httprouter/stargazers", nil)
557569
benchRequest(b, githubCloudyKitRouter, req)
@@ -676,6 +688,9 @@ func BenchmarkBeego_GithubAll(b *testing.B) {
676688
func BenchmarkBone_GithubAll(b *testing.B) {
677689
benchRoutes(b, githubBone, githubAPI)
678690
}
691+
func BenchmarkChi_GithubAll(b *testing.B) {
692+
benchRoutes(b, githubChi, githubAPI)
693+
}
679694
func BenchmarkCloudyKitRouter_GithubAll(b *testing.B) {
680695
benchRoutes(b, githubCloudyKitRouter, githubAPI)
681696
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ require (
1313
github.com/fsnotify/fsnotify v1.4.7 // indirect
1414
github.com/gin-contrib/sse v0.1.0 // indirect
1515
github.com/gin-gonic/gin v1.4.0
16+
github.com/go-chi/chi v4.0.2+incompatible
1617
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab
1718
github.com/go-playground/form v3.1.4+incompatible // indirect
1819
github.com/go-playground/lars v4.0.1+incompatible

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
3939
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
4040
github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
4141
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
42+
github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs=
43+
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
4244
github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191 h1:NjHlg70DuOkcAMqgt0+XA+NHwtu66MkTVVgR4fFWbcI=
4345
github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191/go.mod h1:VFI2o2q9kYsC4o7VP1HrEVosiZZTd+MVT3YZx4gqvJw=
4446
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk=

gplus_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ var (
4040
gplusBear http.Handler
4141
gplusBeego http.Handler
4242
gplusBone http.Handler
43+
gplusChi http.Handler
4344
gplusCloudyKitRouter http.Handler
4445
gplusDenco http.Handler
4546
gplusEcho http.Handler
@@ -84,6 +85,9 @@ func init() {
8485
calcMem("Bone", func() {
8586
gplusBone = loadBone(gplusAPI)
8687
})
88+
calcMem("Chi", func() {
89+
gplusChi = loadChi(gplusAPI)
90+
})
8791
calcMem("CloudyKitRouter", func() {
8892
gplusCloudyKitRouter = loadCloudyKitRouter(gplusAPI)
8993
})
@@ -186,6 +190,10 @@ func BenchmarkBone_GPlusStatic(b *testing.B) {
186190
req, _ := http.NewRequest("GET", "/people", nil)
187191
benchRequest(b, gplusBone, req)
188192
}
193+
func BenchmarkChi_GPlusStatic(b *testing.B) {
194+
req, _ := http.NewRequest("GET", "/people", nil)
195+
benchRequest(b, gplusChi, req)
196+
}
189197
func BenchmarkCloudyKitRouter_GPlusStatic(b *testing.B) {
190198
req, _ := http.NewRequest("GET", "/people", nil)
191199
benchRequest(b, gplusCloudyKitRouter, req)
@@ -314,6 +322,10 @@ func BenchmarkBone_GPlusParam(b *testing.B) {
314322
req, _ := http.NewRequest("GET", "/people/118051310819094153327", nil)
315323
benchRequest(b, gplusBone, req)
316324
}
325+
func BenchmarkChi_GPlusParam(b *testing.B) {
326+
req, _ := http.NewRequest("GET", "/people/118051310819094153327", nil)
327+
benchRequest(b, gplusChi, req)
328+
}
317329
func BenchmarkCloudyKitRouter_GPlusParam(b *testing.B) {
318330
req, _ := http.NewRequest("GET", "/people/118051310819094153327", nil)
319331
benchRequest(b, gplusCloudyKitRouter, req)
@@ -442,6 +454,10 @@ func BenchmarkBone_GPlus2Params(b *testing.B) {
442454
req, _ := http.NewRequest("GET", "/people/118051310819094153327/activities/123456789", nil)
443455
benchRequest(b, gplusBone, req)
444456
}
457+
func BenchmarkChi_GPlus2Params(b *testing.B) {
458+
req, _ := http.NewRequest("GET", "/people/118051310819094153327/activities/123456789", nil)
459+
benchRequest(b, gplusChi, req)
460+
}
445461
func BenchmarkCloudyKitRouter_GPlus2Params(b *testing.B) {
446462
req, _ := http.NewRequest("GET", "/people/118051310819094153327/activities/123456789", nil)
447463
benchRequest(b, gplusCloudyKitRouter, req)
@@ -566,6 +582,9 @@ func BenchmarkBeego_GPlusAll(b *testing.B) {
566582
func BenchmarkBone_GPlusAll(b *testing.B) {
567583
benchRoutes(b, gplusBone, gplusAPI)
568584
}
585+
func BenchmarkChi_GPlusAll(b *testing.B) {
586+
benchRoutes(b, gplusChi, gplusAPI)
587+
}
569588
func BenchmarkCloudyKitRouter_GPlusAll(b *testing.B) {
570589
benchRoutes(b, gplusCloudyKitRouter, gplusAPI)
571590
}

parse_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ var (
6060
parseBear http.Handler
6161
parseBeego http.Handler
6262
parseBone http.Handler
63+
parseChi http.Handler
6364
parseCloudyKitRouter http.Handler
6465
parseDenco http.Handler
6566
parseEcho http.Handler
@@ -104,6 +105,9 @@ func init() {
104105
calcMem("Bone", func() {
105106
parseBone = loadBone(parseAPI)
106107
})
108+
calcMem("Chi", func() {
109+
parseChi = loadChi(parseAPI)
110+
})
107111
calcMem("Denco", func() {
108112
parseDenco = loadDenco(parseAPI)
109113
})
@@ -203,6 +207,10 @@ func BenchmarkBone_ParseStatic(b *testing.B) {
203207
req, _ := http.NewRequest("GET", "/1/users", nil)
204208
benchRequest(b, parseBone, req)
205209
}
210+
func BenchmarkChi_ParseStatic(b *testing.B) {
211+
req, _ := http.NewRequest("GET", "/1/users", nil)
212+
benchRequest(b, parseChi, req)
213+
}
206214
func BenchmarkCloudyKitRouter_ParseStatic(b *testing.B) {
207215
req, _ := http.NewRequest("GET", "/1/users", nil)
208216
benchRequest(b, parseCloudyKitRouter, req)
@@ -331,6 +339,10 @@ func BenchmarkBone_ParseParam(b *testing.B) {
331339
req, _ := http.NewRequest("GET", "/1/classes/go", nil)
332340
benchRequest(b, parseBone, req)
333341
}
342+
func BenchmarkChi_ParseParam(b *testing.B) {
343+
req, _ := http.NewRequest("GET", "/1/classes/go", nil)
344+
benchRequest(b, parseChi, req)
345+
}
334346
func BenchmarkCloudyKitRouter_ParseParam(b *testing.B) {
335347
req, _ := http.NewRequest("GET", "/1/classes/go", nil)
336348
benchRequest(b, parseCloudyKitRouter, req)
@@ -459,6 +471,10 @@ func BenchmarkBone_Parse2Params(b *testing.B) {
459471
req, _ := http.NewRequest("GET", "/1/classes/go/123456789", nil)
460472
benchRequest(b, parseBone, req)
461473
}
474+
func BenchmarkChi_Parse2Params(b *testing.B) {
475+
req, _ := http.NewRequest("GET", "/1/classes/go/123456789", nil)
476+
benchRequest(b, parseChi, req)
477+
}
462478
func BenchmarkCloudyKitRouter_Parse2Params(b *testing.B) {
463479
req, _ := http.NewRequest("GET", "/1/classes/go/123456789", nil)
464480
benchRequest(b, parseCloudyKitRouter, req)
@@ -583,6 +599,9 @@ func BenchmarkBeego_ParseAll(b *testing.B) {
583599
func BenchmarkBone_ParseAll(b *testing.B) {
584600
benchRoutes(b, parseBone, parseAPI)
585601
}
602+
func BenchmarkChi_ParseAll(b *testing.B) {
603+
benchRoutes(b, parseChi, parseAPI)
604+
}
586605
func BenchmarkCloudyKitRouter_ParseAll(b *testing.B) {
587606
benchRoutes(b, parseCloudyKitRouter, parseAPI)
588607
}

routers.go

+56
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/dimfeld/httptreemux"
2828
"github.com/emicklei/go-restful"
2929
"github.com/gin-gonic/gin"
30+
"github.com/go-chi/chi"
3031
"github.com/go-martini/martini"
3132
"github.com/go-zoo/bone"
3233
"github.com/gocraft/web"
@@ -291,6 +292,61 @@ func loadBoneSingle(method, path string, handler http.Handler) http.Handler {
291292
return router
292293
}
293294

295+
// chi
296+
// chi
297+
func chiHandleWrite(w http.ResponseWriter, r *http.Request) {
298+
io.WriteString(w, chi.URLParam(r, "name"))
299+
}
300+
301+
func loadChi(routes []route) http.Handler {
302+
h := httpHandlerFunc
303+
if loadTestHandler {
304+
h = httpHandlerFuncTest
305+
}
306+
307+
re := regexp.MustCompile(":([^/]*)")
308+
309+
mux := chi.NewRouter()
310+
for _, route := range routes {
311+
path := re.ReplaceAllString(route.path, "{$1}")
312+
313+
switch route.method {
314+
case "GET":
315+
mux.Get(path, h)
316+
case "POST":
317+
mux.Post(path, h)
318+
case "PUT":
319+
mux.Put(path, h)
320+
case "PATCH":
321+
mux.Patch(path, h)
322+
case "DELETE":
323+
mux.Delete(path, h)
324+
default:
325+
panic("Unknown HTTP method: " + route.method)
326+
}
327+
}
328+
return mux
329+
}
330+
331+
func loadChiSingle(method, path string, handler http.HandlerFunc) http.Handler {
332+
mux := chi.NewRouter()
333+
switch method {
334+
case "GET":
335+
mux.Get(path, handler)
336+
case "POST":
337+
mux.Post(path, handler)
338+
case "PUT":
339+
mux.Put(path, handler)
340+
case "PATCH":
341+
mux.Patch(path, handler)
342+
case "DELETE":
343+
mux.Delete(path, handler)
344+
default:
345+
panic("Unknown HTTP method: " + method)
346+
}
347+
return mux
348+
}
349+
294350
// CloudyKit Router
295351
func cloudyKitRouterHandler(_ http.ResponseWriter, _ *http.Request, _ cloudykitrouter.Parameter) {}
296352

routers_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var (
1616
{"Bear", loadBear},
1717
{"Beego", loadBeego},
1818
{"Bone", loadBone},
19+
{"Chi", loadChi},
1920
{"CloudyKitRouter", loadCloudyKitRouter},
2021
{"Denco", loadDenco},
2122
{"Echo", loadEcho},

static_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ var (
176176
staticBear http.Handler
177177
staticBeego http.Handler
178178
staticBone http.Handler
179+
staticChi http.Handler
179180
staticCloudyKitRouter http.Handler
180181
staticDenco http.Handler
181182
staticEcho http.Handler
@@ -228,6 +229,9 @@ func init() {
228229
calcMem("Bone", func() {
229230
staticBone = loadBone(staticRoutes)
230231
})
232+
calcMem("Chi", func() {
233+
staticChi = loadChi(staticRoutes)
234+
})
231235
calcMem("CloudyKitRouter", func() {
232236
staticCloudyKitRouter = loadCloudyKitRouter(staticRoutes)
233237
})
@@ -330,6 +334,9 @@ func BenchmarkBear_StaticAll(b *testing.B) {
330334
func BenchmarkBone_StaticAll(b *testing.B) {
331335
benchRoutes(b, staticBone, staticRoutes)
332336
}
337+
func BenchmarkChi_StaticAll(b *testing.B) {
338+
benchRoutes(b, staticChi, staticRoutes)
339+
}
333340
func BenchmarkCloudyKitRouter_StaticAll(b *testing.B) {
334341
benchRoutes(b, staticCloudyKitRouter, staticRoutes)
335342
}

0 commit comments

Comments
 (0)