HTTP Servers
Route Matching
A server chooses handler logic by matching the request path.
route
A route maps a request path to the code that should build the response.
Route Matching
route_matching.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
type request struct {
Path string
}
func handlerName(path string) string {
if path == "/health" {
return "healthHandler"
}
if path == "/users" {
return "usersHandler"
}
return "notFoundHandler"
}
func main() {
var path = "/health"
req := request{Path: path}
handler := handlerName(req.Path)
fmt.Println("path=", req.Path)
fmt.Println("handler=", handler)
fmt.Println("matched=", handler != "notFoundHandler")
}
package main
import "fmt"
type request struct {
Path string
}
func handlerName(path string) string {
if path == "/health" {
return "healthHandler"
}
if path == "/users" {
return "usersHandler"
}
return "notFoundHandler"
}
func main() {
var path = "/users"
req := request{Path: path}
handler := handlerName(req.Path)
fmt.Println("path=", req.Path)
fmt.Println("handler=", handler)
fmt.Println("matched=", handler != "notFoundHandler")
}
package main
import "fmt"
type request struct {
Path string
}
func handlerName(path string) string {
if path == "/health" {
return "healthHandler"
}
if path == "/users" {
return "usersHandler"
}
return "notFoundHandler"
}
func main() {
var path = "/missing"
req := request{Path: path}
handler := handlerName(req.Path)
fmt.Println("path=", req.Path)
fmt.Println("handler=", handler)
fmt.Println("matched=", handler != "notFoundHandler")
}
req ← main.request{Path:"/health"}
19func main() {20 var path = "/health" //@path="/users", "/missing"21 req→ main.request{Path:"/health"} := request{Path: path}22 handler := handlerName(req.Path"/health")handler ← "healthHandler"
21 req := request{Path: path}22 handler→ "healthHandler" := handlerName(req.Path"/health")2324 fmt.Println("path=", req.Path"/health")25 fmt.Println("handler=", handler"healthHandler")26 fmt.Println("matched=", handler"healthHandler" != "notFoundHandler")27}outputpath= /health handler= healthHandler matched= true
req ← main.request{Path:"/users"}
19func main() {20 var path = "/users"21 req→ main.request{Path:"/users"} := request{Path: path}22 handler := handlerName(req.Path"/users")handler ← "usersHandler"
21 req := request{Path: path}22 handler→ "usersHandler" := handlerName(req.Path"/users")2324 fmt.Println("path=", req.Path"/users")25 fmt.Println("handler=", handler"usersHandler")26 fmt.Println("matched=", handler"usersHandler" != "notFoundHandler")27}outputpath= /users handler= usersHandler matched= true
req ← main.request{Path:"/missing"}
19func main() {20 var path = "/missing"21 req→ main.request{Path:"/missing"} := request{Path: path}22 handler := handlerName(req.Path"/missing")handler ← "notFoundHandler"
21 req := request{Path: path}22 handler→ "notFoundHandler" := handlerName(req.Path"/missing")2324 fmt.Println("path=", req.Path"/missing")25 fmt.Println("handler=", handler"notFoundHandler")26 fmt.Println("matched=", handler"notFoundHandler" != "notFoundHandler")27}outputpath= /missing handler= notFoundHandler matched= false