Commit c238031b authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

net/http: speed up ServeMux when no patterns contain hostnames

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6248053
parent 469e3a91
...@@ -840,8 +840,9 @@ func RedirectHandler(url string, code int) Handler { ...@@ -840,8 +840,9 @@ func RedirectHandler(url string, code int) Handler {
// redirecting any request containing . or .. elements to an // redirecting any request containing . or .. elements to an
// equivalent .- and ..-free URL. // equivalent .- and ..-free URL.
type ServeMux struct { type ServeMux struct {
mu sync.RWMutex mu sync.RWMutex
m map[string]muxEntry m map[string]muxEntry
hosts bool // whether any patterns contain hostnames
} }
type muxEntry struct { type muxEntry struct {
...@@ -903,12 +904,14 @@ func (mux *ServeMux) match(path string) Handler { ...@@ -903,12 +904,14 @@ func (mux *ServeMux) match(path string) Handler {
} }
// handler returns the handler to use for the request r. // handler returns the handler to use for the request r.
func (mux *ServeMux) handler(r *Request) Handler { func (mux *ServeMux) handler(r *Request) (h Handler) {
mux.mu.RLock() mux.mu.RLock()
defer mux.mu.RUnlock() defer mux.mu.RUnlock()
// Host-specific pattern takes precedence over generic ones // Host-specific pattern takes precedence over generic ones
h := mux.match(r.Host + r.URL.Path) if mux.hosts {
h = mux.match(r.Host + r.URL.Path)
}
if h == nil { if h == nil {
h = mux.match(r.URL.Path) h = mux.match(r.URL.Path)
} }
...@@ -950,6 +953,10 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) { ...@@ -950,6 +953,10 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) {
mux.m[pattern] = muxEntry{explicit: true, h: handler} mux.m[pattern] = muxEntry{explicit: true, h: handler}
if pattern[0] != '/' {
mux.hosts = true
}
// Helpful behavior: // Helpful behavior:
// If pattern is /tree/, insert an implicit permanent redirect for /tree. // If pattern is /tree/, insert an implicit permanent redirect for /tree.
// It can be overridden by an explicit registration. // It can be overridden by an explicit registration.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment