|
|
|
@ -72,13 +72,14 @@ func newRouteRegexp(tpl string, matchHost, matchPrefix, matchQuery, strictSlash |
|
|
|
tpl[idxs[i]:end]) |
|
|
|
} |
|
|
|
// Build the regexp pattern.
|
|
|
|
fmt.Fprintf(pattern, "%s(?P<%s>%s)", regexp.QuoteMeta(raw), name, patt) |
|
|
|
varIdx := i / 2 |
|
|
|
fmt.Fprintf(pattern, "%s(?P<%s>%s)", regexp.QuoteMeta(raw), varGroupName(varIdx), patt) |
|
|
|
// Build the reverse template.
|
|
|
|
fmt.Fprintf(reverse, "%s%%s", raw) |
|
|
|
|
|
|
|
// Append variable name and compiled pattern.
|
|
|
|
varsN[i/2] = name |
|
|
|
varsR[i/2], err = regexp.Compile(fmt.Sprintf("^%s$", patt)) |
|
|
|
varsN[varIdx] = name |
|
|
|
varsR[varIdx], err = regexp.Compile(fmt.Sprintf("^%s$", patt)) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
@ -224,6 +225,11 @@ func braceIndices(s string) ([]int, error) { |
|
|
|
return idxs, nil |
|
|
|
} |
|
|
|
|
|
|
|
// varGroupName builds a capturing group name for the indexed variable.
|
|
|
|
func varGroupName(idx int) string { |
|
|
|
return fmt.Sprintf("v%d", idx) |
|
|
|
} |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// routeRegexpGroup
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
@ -244,8 +250,8 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) |
|
|
|
subexpNames := v.host.regexp.SubexpNames() |
|
|
|
varName := 0 |
|
|
|
for i, name := range subexpNames[1:] { |
|
|
|
if name != "" && v.host.varsN[varName] == name { |
|
|
|
m.Vars[name] = hostVars[i+1] |
|
|
|
if name == varGroupName(varName) { |
|
|
|
m.Vars[v.host.varsN[varName]] = hostVars[i+1] |
|
|
|
varName++ |
|
|
|
} |
|
|
|
} |
|
|
|
@ -258,8 +264,8 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) |
|
|
|
subexpNames := v.path.regexp.SubexpNames() |
|
|
|
varName := 0 |
|
|
|
for i, name := range subexpNames[1:] { |
|
|
|
if name != "" && v.path.varsN[varName] == name { |
|
|
|
m.Vars[name] = pathVars[i+1] |
|
|
|
if name == varGroupName(varName) { |
|
|
|
m.Vars[v.path.varsN[varName]] = pathVars[i+1] |
|
|
|
varName++ |
|
|
|
} |
|
|
|
} |
|
|
|
@ -286,8 +292,8 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) |
|
|
|
subexpNames := q.regexp.SubexpNames() |
|
|
|
varName := 0 |
|
|
|
for i, name := range subexpNames[1:] { |
|
|
|
if name != "" && q.varsN[varName] == name { |
|
|
|
m.Vars[name] = queryVars[i+1] |
|
|
|
if name == varGroupName(varName) { |
|
|
|
m.Vars[q.varsN[varName]] = queryVars[i+1] |
|
|
|
varName++ |
|
|
|
} |
|
|
|
} |
|
|
|
|