Browse Source

Use scheme from parent router when building URLs.

pull/281/head
Chris Hines 9 years ago committed by Kamil Kisiel
parent
commit
37b3a6cace
  1. 7
      mux.go
  2. 11
      mux_test.go
  3. 21
      route.go

7
mux.go

@ -176,6 +176,13 @@ func (r *Router) UseEncodedPath() *Router { @@ -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 {

11
mux_test.go

@ -1215,6 +1215,17 @@ func TestSubRouter(t *testing.T) { @@ -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 {

21
route.go

@ -396,7 +396,7 @@ func (r *Route) Schemes(schemes ...string) *Route { @@ -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) { @@ -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) { @@ -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 { @@ -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 {

Loading…
Cancel
Save