From 273db68971215ed764f24e23f49469c54e9bcd4b Mon Sep 17 00:00:00 2001 From: Shinya Kawaguchi Date: Tue, 11 Aug 2015 04:09:52 +0900 Subject: [PATCH] Fix regexp syntax error caused by variable names containing any characters except letters, digits, and underscores --- regexp.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/regexp.go b/regexp.go index 6b34fec..d3f25de 100644 --- a/regexp.go +++ b/regexp.go @@ -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++ } }