70
70
middleware []MiddlewareFunc
71
71
maxParam * int
72
72
router * Router
73
+ routers map [string ]* Router
73
74
notFoundHandler HandlerFunc
74
75
pool sync.Pool
75
76
Server * http.Server
@@ -308,6 +309,7 @@ func New() (e *Echo) {
308
309
return e .NewContext (nil , nil )
309
310
}
310
311
e .router = NewRouter (e )
312
+ e .routers = map [string ]* Router {}
311
313
return
312
314
}
313
315
@@ -481,11 +483,10 @@ func (e *Echo) File(path, file string, m ...MiddlewareFunc) *Route {
481
483
}, m ... )
482
484
}
483
485
484
- // Add registers a new route for an HTTP method and path with matching handler
485
- // in the router with optional route-level middleware.
486
- func (e * Echo ) Add (method , path string , handler HandlerFunc , middleware ... MiddlewareFunc ) * Route {
486
+ func (e * Echo ) add (host , method , path string , handler HandlerFunc , middleware ... MiddlewareFunc ) * Route {
487
487
name := handlerName (handler )
488
- e .router .Add (method , path , func (c Context ) error {
488
+ router := e .findRouter (host )
489
+ router .Add (method , path , func (c Context ) error {
489
490
h := handler
490
491
// Chain middleware
491
492
for i := len (middleware ) - 1 ; i >= 0 ; i -- {
@@ -502,6 +503,20 @@ func (e *Echo) Add(method, path string, handler HandlerFunc, middleware ...Middl
502
503
return r
503
504
}
504
505
506
+ // Add registers a new route for an HTTP method and path with matching handler
507
+ // in the router with optional route-level middleware.
508
+ func (e * Echo ) Add (method , path string , handler HandlerFunc , middleware ... MiddlewareFunc ) * Route {
509
+ return e .add ("" , method , path , handler , middleware ... )
510
+ }
511
+
512
+ // Host creates a new router group for the provided host and optional host-level middleware.
513
+ func (e * Echo ) Host (name string , m ... MiddlewareFunc ) (g * Group ) {
514
+ e .routers [name ] = NewRouter (e )
515
+ g = & Group {host : name , echo : e }
516
+ g .Use (m ... )
517
+ return
518
+ }
519
+
505
520
// Group creates a new router group with prefix and optional group-level middleware.
506
521
func (e * Echo ) Group (prefix string , m ... MiddlewareFunc ) (g * Group ) {
507
522
g = & Group {prefix : prefix , echo : e }
@@ -574,12 +589,12 @@ func (e *Echo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
574
589
h := NotFoundHandler
575
590
576
591
if e .premiddleware == nil {
577
- e .router .Find (r .Method , getPath (r ), c )
592
+ e .findRouter ( r . Host ) .Find (r .Method , getPath (r ), c )
578
593
h = c .Handler ()
579
594
h = applyMiddleware (h , e .middleware ... )
580
595
} else {
581
596
h = func (c Context ) error {
582
- e .router .Find (r .Method , getPath (r ), c )
597
+ e .findRouter ( r . Host ) .Find (r .Method , getPath (r ), c )
583
598
h := c .Handler ()
584
599
h = applyMiddleware (h , e .middleware ... )
585
600
return h (c )
@@ -761,6 +776,15 @@ func getPath(r *http.Request) string {
761
776
return path
762
777
}
763
778
779
+ func (e * Echo ) findRouter (host string ) * Router {
780
+ if len (e .routers ) > 0 {
781
+ if r , ok := e .routers [host ]; ok {
782
+ return r
783
+ }
784
+ }
785
+ return e .router
786
+ }
787
+
764
788
func handlerName (h HandlerFunc ) string {
765
789
t := reflect .ValueOf (h ).Type ()
766
790
if t .Kind () == reflect .Func {
0 commit comments