From 37b3a6cace5ebe92c9b1494fab04d5e7767b271b Mon Sep 17 00:00:00 2001 From: Chris Hines Date: Fri, 30 Jun 2017 10:51:05 -0400 Subject: [PATCH] Use scheme from parent router when building URLs. --- mux.go | 7 +++++++ mux_test.go | 11 +++++++++++ route.go | 21 ++++++++++++++++----- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/mux.go b/mux.go index 709ea05..aa19597 100644 --- a/mux.go +++ b/mux.go @@ -176,6 +176,13 @@ func (r *Router) UseEncodedPath() *Router { // parentRoute // ---------------------------------------------------------------------------- +func (r *Router) getBuildScheme() string { + if r.parent != nil { + return r.parent.getBuildScheme() + } + return "" +} + // getNamedRoutes returns the map where named routes are registered. func (r *Router) getNamedRoutes() map[string]*Route { if r.namedRoutes == nil { diff --git a/mux_test.go b/mux_test.go index 4340c50..9dd06f0 100644 --- a/mux_test.go +++ b/mux_test.go @@ -1215,6 +1215,17 @@ func TestSubRouter(t *testing.T) { pathTemplate: `/{category}`, shouldMatch: true, }, + { + title: "Build with scheme on parent router", + route: new(Route).Schemes("ftp").Host("google.com").Subrouter().Path("/"), + request: newRequest("GET", "ftp://google.com/"), + scheme: "ftp", + host: "google.com", + path: "/", + pathTemplate: `/`, + hostTemplate: `google.com`, + shouldMatch: true, + }, } for _, test := range tests { diff --git a/route.go b/route.go index 916de74..5c8e7c0 100644 --- a/route.go +++ b/route.go @@ -396,7 +396,7 @@ func (r *Route) Schemes(schemes ...string) *Route { for k, v := range schemes { schemes[k] = strings.ToLower(v) } - if r.buildScheme == "" && len(schemes) > 0 { + if r.getBuildScheme() == "" && len(schemes) > 0 { r.buildScheme = schemes[0] } return r.addMatcher(schemeMatcher(schemes)) @@ -488,8 +488,8 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) { return nil, err } scheme = "http" - if r.buildScheme != "" { - scheme = r.buildScheme + if s := r.getBuildScheme(); s != "" { + scheme = s } } if r.regexp.path != nil { @@ -534,8 +534,8 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) { Scheme: "http", Host: host, } - if r.buildScheme != "" { - u.Scheme = r.buildScheme + if s := r.getBuildScheme(); s != "" { + u.Scheme = s } return u, nil } @@ -649,11 +649,22 @@ func (r *Route) buildVars(m map[string]string) map[string]string { // parentRoute allows routes to know about parent host and path definitions. type parentRoute interface { + getBuildScheme() string getNamedRoutes() map[string]*Route getRegexpGroup() *routeRegexpGroup buildVars(map[string]string) map[string]string } +func (r *Route) getBuildScheme() string { + if r.buildScheme != "" { + return r.buildScheme + } + if r.parent != nil { + return r.parent.getBuildScheme() + } + return "" +} + // getNamedRoutes returns the map where named routes are registered. func (r *Route) getNamedRoutes() map[string]*Route { if r.parent == nil {