Browse Source

Fix regexp syntax error caused by variable names containing any characters except letters, digits, and underscores

pull/120/head
Shinya Kawaguchi 11 years ago
parent
commit
273db68971
  1. 24
      regexp.go

24
regexp.go

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

Loading…
Cancel
Save