@ -13,7 +13,7 @@ type stringPattern struct {
pats [ ] string
pats [ ] string
breaks [ ] byte
breaks [ ] byte
literals [ ] string
literals [ ] string
isPrefix bool
wildcard bool
}
}
func ( s stringPattern ) Prefix ( ) string {
func ( s stringPattern ) Prefix ( ) string {
@ -28,8 +28,12 @@ func (s stringPattern) Run(r *http.Request, c *C) {
func ( s stringPattern ) match ( r * http . Request , c * C , dryrun bool ) bool {
func ( s stringPattern ) match ( r * http . Request , c * C , dryrun bool ) bool {
path := r . URL . Path
path := r . URL . Path
var matches map [ string ] string
var matches map [ string ] string
if ! dryrun && len ( s . pats ) > 0 {
matches = make ( map [ string ] string , len ( s . pats ) )
if ! dryrun {
if s . wildcard {
matches = make ( map [ string ] string , len ( s . pats ) + 1 )
} else if len ( s . pats ) != 0 {
matches = make ( map [ string ] string , len ( s . pats ) )
}
}
}
for i := 0 ; i < len ( s . pats ) ; i ++ {
for i := 0 ; i < len ( s . pats ) ; i ++ {
sli := s . literals [ i ]
sli := s . literals [ i ]
@ -56,14 +60,16 @@ func (s stringPattern) match(r *http.Request, c *C, dryrun bool) bool {
path = path [ m : ]
path = path [ m : ]
}
}
// There's exactly one more literal than pat.
// There's exactly one more literal than pat.
if s . isPrefix {
if ! strings . HasPrefix ( path , s . literals [ len ( s . pats ) ] ) {
tail := s . literals [ len ( s . pats ) ]
if s . wildcard {
if ! strings . HasPrefix ( path , tail ) {
return false
return false
}
}
} else {
if path != s . literals [ len ( s . pats ) ] {
return false
if ! dryrun {
matches [ "*" ] = path [ len ( tail ) - 1 : ]
}
}
} else if path != tail {
return false
}
}
if c == nil || dryrun {
if c == nil || dryrun {
@ -81,7 +87,7 @@ func (s stringPattern) match(r *http.Request, c *C, dryrun bool) bool {
}
}
func ( s stringPattern ) String ( ) string {
func ( s stringPattern ) String ( ) string {
return fmt . Sprintf ( "stringPattern(%q, %v )" , s . raw , s . isPrefix )
return fmt . Sprintf ( "stringPattern(%q)" , s . raw )
}
}
// "Break characters" are characters that can end patterns. They are not allowed
// "Break characters" are characters that can end patterns. They are not allowed
@ -93,11 +99,11 @@ const bc = "/.;,"
var patternRe = regexp . MustCompile ( ` [ ` + bc + ` ]:([^ ` + bc + ` ]+) ` )
var patternRe = regexp . MustCompile ( ` [ ` + bc + ` ]:([^ ` + bc + ` ]+) ` )
func parseStringPattern ( s string ) stringPattern {
func parseStringPattern ( s string ) stringPattern {
var isPrefix bool
// Routes that end in an asterisk ("*") are prefix routes
if len ( s ) > 0 && s [ len ( s ) - 1 ] == '*' {
raw := s
var wildcard bool
if strings . HasSuffix ( s , "/*" ) {
s = s [ : len ( s ) - 1 ]
s = s [ : len ( s ) - 1 ]
isPrefix = true
wildcard = true
}
}
matches := patternRe . FindAllStringSubmatchIndex ( s , - 1 )
matches := patternRe . FindAllStringSubmatchIndex ( s , - 1 )
@ -118,10 +124,10 @@ func parseStringPattern(s string) stringPattern {
}
}
literals [ len ( matches ) ] = s [ n : ]
literals [ len ( matches ) ] = s [ n : ]
return stringPattern {
return stringPattern {
raw : s ,
raw : raw ,
pats : pats ,
pats : pats ,
breaks : breaks ,
breaks : breaks ,
literals : literals ,
literals : literals ,
isPrefix : isPrefix ,
wildcard : wildcard ,
}
}
}
}