@@ -3,6 +3,7 @@ package httprouter
33import (
44 "log"
55 "net/http"
6+ "strings"
67
78 "github.com/infraboard/mcube/http/context"
89 "github.com/infraboard/mcube/http/response"
@@ -24,15 +25,18 @@ type httpRouter struct {
2425 l logger.Logger
2526
2627 middlewareChain []router.Middleware
27- entries [] * entry
28+ entrySet * router. EntrySet
2829 auther router.Auther
2930 mergedHandler http.Handler
3031 labels []* router.Label
32+ notFound http.Handler
3133}
3234
3335// New 基于社区的httprouter进行封装
3436func New () router.Router {
3537 r := & httpRouter {
38+ notFound : http .HandlerFunc (http .NotFound ),
39+ entrySet : router .NewEntrySet (),
3640 r : & httprouter.Router {
3741 RedirectTrailingSlash : true ,
3842 RedirectFixedPath : true ,
@@ -55,7 +59,6 @@ func (r *httpRouter) Use(m router.Middleware) {
5559func (r * httpRouter ) AddProtected (method , path string , h http.HandlerFunc ) {
5660 e := & entry {
5761 Entry : router.Entry {
58- Name : router .GetHandlerFuncName (h ),
5962 Method : method ,
6063 Path : path ,
6164 Protected : true ,
@@ -69,7 +72,6 @@ func (r *httpRouter) AddProtected(method, path string, h http.HandlerFunc) {
6972func (r * httpRouter ) AddPublict (method , path string , h http.HandlerFunc ) {
7073 e := & entry {
7174 Entry : router.Entry {
72- Name : router .GetHandlerFuncName (h ),
7375 Method : method ,
7476 Path : path ,
7577 Protected : false ,
@@ -104,21 +106,15 @@ func (r *httpRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
104106}
105107
106108func (r * httpRouter ) GetEndpoints () * router.EntrySet {
107- es := router .NewEntrySet ()
108-
109- for i := range r .entries {
110- es .AddEntry (r .entries [i ].Entry )
111- }
112-
113- return es
109+ return r .entrySet
114110}
115111
116112func (r * httpRouter ) EnableAPIRoot () {
117113 r .AddPublict ("GET" , "/" , r .apiRoot )
118114}
119115
120116func (r * httpRouter ) apiRoot (w http.ResponseWriter , req * http.Request ) {
121- response .Success (w , r .entries )
117+ response .Success (w , r .entrySet . ShowEntries )
122118 return
123119}
124120
@@ -151,9 +147,14 @@ func (r *httpRouter) add(e *entry) {
151147func (r * httpRouter ) addHandler (protected bool , method , path string , h http.Handler ) {
152148 r .r .Handle (method , path ,
153149 func (w http.ResponseWriter , req * http.Request , ps httprouter.Params ) {
150+ entry := r .findEntry (method , path )
151+ if entry == nil {
152+ r .notFound .ServeHTTP (w , req )
153+ return
154+ }
154155 // 使用auther进行认证
155156 if protected && r .auther != nil {
156- authInfo , err := r .auther .Auth (req .Header )
157+ authInfo , err := r .auther .Auth (req .Header , * entry )
157158 if err != nil {
158159 response .Failed (w , err )
159160 return
@@ -184,5 +185,23 @@ func (r *httpRouter) addEntry(e *entry) {
184185 kv := r .labels [i ]
185186 e .Labels [kv .Key ()] = kv .Value ()
186187 }
187- r .entries = append (r .entries , e )
188+
189+ if err := r .entrySet .AddEntry (& e .Entry ); err != nil {
190+ panic (err )
191+ }
192+ }
193+
194+ func (r * httpRouter ) findEntry (method , path string ) * router.Entry {
195+ hander , paras , _ := r .r .Lookup (method , path )
196+ if hander == nil {
197+ return nil
198+ }
199+
200+ targetPath := path
201+ for _ , kv := range paras {
202+ targetPath = strings .Replace (targetPath , ":" + kv .Key , kv .Value , 1 )
203+ }
204+
205+ return r .entrySet .FindEntry (targetPath , method )
206+
188207}
0 commit comments