|
@@ -23,6 +23,7 @@ type route struct {
|
|
|
Method string
|
|
|
Prefix string
|
|
|
Handler routeHandler
|
|
|
+ Exact bool
|
|
|
}
|
|
|
|
|
|
type router struct {
|
|
@@ -30,25 +31,37 @@ type router struct {
|
|
|
PanicHandler panicHandler
|
|
|
}
|
|
|
|
|
|
+func (r *route) IsMatch(req *http.Request) bool {
|
|
|
+ if r.Method != req.Method {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ if r.Exact {
|
|
|
+ return req.URL.Path == r.Prefix
|
|
|
+ }
|
|
|
+
|
|
|
+ return strings.HasPrefix(req.URL.Path, r.Prefix)
|
|
|
+}
|
|
|
+
|
|
|
func newRouter() *router {
|
|
|
return &router{
|
|
|
Routes: make([]*route, 0),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (r *router) Add(method, prefix string, handler routeHandler) {
|
|
|
+func (r *router) Add(method, prefix string, handler routeHandler, exact bool) {
|
|
|
r.Routes = append(
|
|
|
r.Routes,
|
|
|
- &route{Method: method, Prefix: prefix, Handler: handler},
|
|
|
+ &route{Method: method, Prefix: prefix, Handler: handler, Exact: exact},
|
|
|
)
|
|
|
}
|
|
|
|
|
|
-func (r *router) GET(prefix string, handler routeHandler) {
|
|
|
- r.Add(http.MethodGet, prefix, handler)
|
|
|
+func (r *router) GET(prefix string, handler routeHandler, exact bool) {
|
|
|
+ r.Add(http.MethodGet, prefix, handler, exact)
|
|
|
}
|
|
|
|
|
|
-func (r *router) OPTIONS(prefix string, handler routeHandler) {
|
|
|
- r.Add(http.MethodOptions, prefix, handler)
|
|
|
+func (r *router) OPTIONS(prefix string, handler routeHandler, exact bool) {
|
|
|
+ r.Add(http.MethodOptions, prefix, handler, exact)
|
|
|
}
|
|
|
|
|
|
func (r *router) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|
@@ -74,7 +87,7 @@ func (r *router) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|
|
logRequest(reqID, req)
|
|
|
|
|
|
for _, rr := range r.Routes {
|
|
|
- if rr.Method == req.Method && strings.HasPrefix(req.URL.Path, rr.Prefix) {
|
|
|
+ if rr.IsMatch(req) {
|
|
|
rr.Handler(reqID, rw, req)
|
|
|
return
|
|
|
}
|