Skip to content

Commit 37b3a6c

Browse files
ChrisHineskisielk
authored andcommitted
Use scheme from parent router when building URLs.
1 parent 8c683ee commit 37b3a6c

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

mux.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,13 @@ func (r *Router) UseEncodedPath() *Router {
176176
// parentRoute
177177
// ----------------------------------------------------------------------------
178178

179+
func (r *Router) getBuildScheme() string {
180+
if r.parent != nil {
181+
return r.parent.getBuildScheme()
182+
}
183+
return ""
184+
}
185+
179186
// getNamedRoutes returns the map where named routes are registered.
180187
func (r *Router) getNamedRoutes() map[string]*Route {
181188
if r.namedRoutes == nil {

mux_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,17 @@ func TestSubRouter(t *testing.T) {
12151215
pathTemplate: `/{category}`,
12161216
shouldMatch: true,
12171217
},
1218+
{
1219+
title: "Build with scheme on parent router",
1220+
route: new(Route).Schemes("ftp").Host("google.com").Subrouter().Path("/"),
1221+
request: newRequest("GET", "ftp://google.com/"),
1222+
scheme: "ftp",
1223+
host: "google.com",
1224+
path: "/",
1225+
pathTemplate: `/`,
1226+
hostTemplate: `google.com`,
1227+
shouldMatch: true,
1228+
},
12181229
}
12191230

12201231
for _, test := range tests {

route.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ func (r *Route) Schemes(schemes ...string) *Route {
396396
for k, v := range schemes {
397397
schemes[k] = strings.ToLower(v)
398398
}
399-
if r.buildScheme == "" && len(schemes) > 0 {
399+
if r.getBuildScheme() == "" && len(schemes) > 0 {
400400
r.buildScheme = schemes[0]
401401
}
402402
return r.addMatcher(schemeMatcher(schemes))
@@ -488,8 +488,8 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) {
488488
return nil, err
489489
}
490490
scheme = "http"
491-
if r.buildScheme != "" {
492-
scheme = r.buildScheme
491+
if s := r.getBuildScheme(); s != "" {
492+
scheme = s
493493
}
494494
}
495495
if r.regexp.path != nil {
@@ -534,8 +534,8 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) {
534534
Scheme: "http",
535535
Host: host,
536536
}
537-
if r.buildScheme != "" {
538-
u.Scheme = r.buildScheme
537+
if s := r.getBuildScheme(); s != "" {
538+
u.Scheme = s
539539
}
540540
return u, nil
541541
}
@@ -649,11 +649,22 @@ func (r *Route) buildVars(m map[string]string) map[string]string {
649649

650650
// parentRoute allows routes to know about parent host and path definitions.
651651
type parentRoute interface {
652+
getBuildScheme() string
652653
getNamedRoutes() map[string]*Route
653654
getRegexpGroup() *routeRegexpGroup
654655
buildVars(map[string]string) map[string]string
655656
}
656657

658+
func (r *Route) getBuildScheme() string {
659+
if r.buildScheme != "" {
660+
return r.buildScheme
661+
}
662+
if r.parent != nil {
663+
return r.parent.getBuildScheme()
664+
}
665+
return ""
666+
}
667+
657668
// getNamedRoutes returns the map where named routes are registered.
658669
func (r *Route) getNamedRoutes() map[string]*Route {
659670
if r.parent == nil {

0 commit comments

Comments
 (0)