@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"net/url"
"regexp"
"strings"
)
@ -188,7 +189,7 @@ func (r *Route) addRegexpMatcher(tpl string, matchHost, matchPrefix, matchQuery
type headerMatcher map [ string ] string
func ( m headerMatcher ) Match ( r * http . Request , match * RouteMatch ) bool {
return matchMap ( m , r . Header , true )
return matchMapWithString ( m , r . Header , true )
}
// Headers adds a matcher for request header values.
@ -199,22 +200,53 @@ func (m headerMatcher) Match(r *http.Request, match *RouteMatch) bool {
// "X-Requested-With", "XMLHttpRequest")
//
// The above route will only match if both request header values match.
// Alternatively, you can provide a regular expression and match the header as follows:
//
// r.Headers("Content-Type", "application/(text|json)",
// "X-Requested-With", "XMLHttpRequest")
//
// The above route will the same as the previous example, with the addition of matching
// application/text as well.
//
// It the value is an empty string, it will match any value if the key is set.
func ( r * Route ) Headers ( pairs ... string ) * Route {
if r . err == nil {
var headers map [ string ] string
headers , r . err = mapFromPairs ( pairs ... )
headers , r . err = mapFromPairsToString ( pairs ... )
return r . addMatcher ( headerMatcher ( headers ) )
}
return r
}
// headerRegexMatcher matches the request against the route given a regex for the header
type headerRegexMatcher map [ string ] * regexp . Regexp
func ( m headerRegexMatcher ) Match ( r * http . Request , match * RouteMatch ) bool {
return matchMapWithRegex ( m , r . Header , true )
}
// Regular expressions can be used with headers as well.
// It accepts a sequence of key/value pairs, where the value has regex support. For example
// r := mux.NewRouter()
// r.HeadersRegexp("Content-Type", "application/(text|json)",
// "X-Requested-With", "XMLHttpRequest")
//
// The above route will only match if both the request header matches both regular expressions.
// It the value is an empty string, it will match any value if the key is set.
func ( r * Route ) HeadersRegexp ( pairs ... string ) * Route {
if r . err == nil {
var headers map [ string ] * regexp . Regexp
headers , r . err = mapFromPairsToRegex ( pairs ... )
return r . addMatcher ( headerRegexMatcher ( headers ) )
}
return r
}
// Host -----------------------------------------------------------------------
// Host adds a matcher for the URL host.
// It accepts a template with zero or more URL variables enclosed by {}.
// Variables can define an optional regexp pattern to me matched:
// Variables can define an optional regexp pattern to b e matched:
//
// - {name} matches anything until the next dot.
//
@ -272,7 +304,7 @@ func (r *Route) Methods(methods ...string) *Route {
// Path adds a matcher for the URL path.
// It accepts a template with zero or more URL variables enclosed by {}. The
// template must start with a "/".
// Variables can define an optional regexp pattern to m e matched:
// Variables can define an optional regexp pattern to b e matched:
//
// - {name} matches anything until the next slash.
//
@ -323,7 +355,7 @@ func (r *Route) PathPrefix(tpl string) *Route {
//
// It the value is an empty string, it will match any value if the key is set.
//
// Variables can define an optional regexp pattern to m e matched:
// Variables can define an optional regexp pattern to b e matched:
//
// - {name} matches anything until the next slash.
//
@ -511,7 +543,7 @@ func (r *Route) URLPath(pairs ...string) (*url.URL, error) {
// prepareVars converts the route variable pairs into a map. If the route has a
// BuildVarsFunc, it is invoked.
func ( r * Route ) prepareVars ( pairs ... string ) ( map [ string ] string , error ) {
m , err := mapFromPairs ( pairs ... )
m , err := mapFromPairsToString ( pairs ... )
if err != nil {
return nil , err
}