"other": "there/is//more",
},
},
+ {
+ "/names/{name}/{other...}",
+ "/names/n/*",
+ map[string]string{
+ "name": "n",
+ "other": "*",
+ },
+ },
} {
mux := NewServeMux()
mux.HandleFunc(test.pattern, func(w ResponseWriter, r *Request) {
// special children keys:
// "/" trailing slash (resulting from {$})
// "" single wildcard
- // "*" multi wildcard
children mapping[string, *routingNode]
+ multiChild *routingNode // child with multi wildcard
emptyChild *routingNode // optimization: child with key ""
}
if len(segs) != 1 {
panic("multi wildcard not last")
}
- n.addChild("*").set(p, h)
+ c := &routingNode{}
+ n.multiChild = c
+ c.set(p, h)
} else if seg.wild {
n.addChild("").addSegments(segs[1:], p, h)
} else {
}
// Lastly, match the pattern (there can be at most one) that has a multi
// wildcard in this position to the rest of the path.
- if c := n.findChild("*"); c != nil {
+ if c := n.multiChild; c != nil {
// Don't record a match for a nameless wildcard (which arises from a
// trailing slash in the pattern).
if c.pattern.lastSegment().s != "" {
"/a/b"
"":
"/a/b/{y}"
- "*":
- "/a/b/{x...}"
"/":
"/a/b/{$}"
+ MULTI:
+ "/a/b/{x...}"
"g":
"":
"j":
"HEAD /headwins", nil},
{"GET", "", "/path/to/file",
"/path/{p...}", []string{"to/file"}},
+ {"GET", "", "/path/*",
+ "/path/{p...}", []string{"*"}},
})
// A pattern ending in {$} should only match URLS with a trailing slash.
n, _ := n.children.find(k)
n.print(w, level+1)
}
+
+ if n.multiChild != nil {
+ fmt.Fprintf(w, "%sMULTI:\n", indent)
+ n.multiChild.print(w, level+1)
+ }
}