Browse Source

[bugfix] fail fast if regex is incorrectly specified using capturing groups. (#218)

pull/221/head v1.3.0
Adam Eijdenberg 9 years ago committed by Matt Silverlock
parent
commit
392c28fe23
  1. 5
      doc.go
  2. 10
      mux_test.go
  3. 7
      regexp.go

5
doc.go

@ -57,6 +57,11 @@ calling mux.Vars(): @@ -57,6 +57,11 @@ calling mux.Vars():
vars := mux.Vars(request)
category := vars["category"]
Note that if any capturing groups are present, mux will panic() during parsing. To prevent
this, convert any capturing groups to non-capturing, e.g. change "/{sort:(asc|desc)}" to
"/{sort:(?:asc|desc)}". This is a change from prior versions which behaved unpredictably
when capturing groups were present.
And this is all you need to know about the basic usage. More advanced options
are explained below.

10
mux_test.go

@ -1389,6 +1389,16 @@ func TestSubrouterErrorHandling(t *testing.T) { @@ -1389,6 +1389,16 @@ func TestSubrouterErrorHandling(t *testing.T) {
}
}
// See: https://github.com/gorilla/mux/issues/200
func TestPanicOnCapturingGroups(t *testing.T) {
defer func() {
if recover() == nil {
t.Errorf("(Test that capturing groups now fail fast) Expected panic, however test completed sucessfully.\n")
}
}()
NewRouter().NewRoute().Path("/{type:(promo|special)}/{promoId}.json")
}
// ----------------------------------------------------------------------------
// Helpers
// ----------------------------------------------------------------------------

7
regexp.go

@ -109,6 +109,13 @@ func newRouteRegexp(tpl string, matchHost, matchPrefix, matchQuery, strictSlash, @@ -109,6 +109,13 @@ func newRouteRegexp(tpl string, matchHost, matchPrefix, matchQuery, strictSlash,
if errCompile != nil {
return nil, errCompile
}
// Check for capturing groups which used to work in older versions
if reg.NumSubexp() != len(idxs)/2 {
panic(fmt.Sprintf("route %s contains capture groups in its regexp. ", template) +
"Only non-capturing groups are accepted: e.g. (?:pattern) instead of (pattern)")
}
// Done!
return &routeRegexp{
template: template,

Loading…
Cancel
Save