gobyexample/076-http-server-canonical-host/http-server-canonical-host.go
Mark McGranaghan e4b083d49b index work
2012-09-23 17:45:04 -07:00

36 lines
907 B
Go

// ## HTTP Server Canonical Host
package main
import "net/http"
import "strings"
import "fmt"
func hello(res http.ResponseWriter, req *http.Request) {
res.Header().Set("Content-Type", "text/plain")
fmt.Fprintln(res, "Hello canonical world")
}
func wrapCanonicalHost(f http.HandlerFunc, canonicalHost string) http.HandlerFunc {
return func(res http.ResponseWriter, req *http.Request) {
hostPort := strings.Split(req.Host, ":")
host := hostPort[0]
if host != canonicalHost {
fmt.Println("redirecting from", host, "to", canonicalHost)
hostPort[0] = canonicalHost
url := "http://" + strings.Join(hostPort, ":") + req.URL.String()
http.Redirect(res, req, url, 301)
return
}
f(res, req)
}
}
func main() {
handler := wrapCanonicalHost(hello, "localhost")
http.HandleFunc("/", handler)
http.ListenAndServe(":5000", nil)
}
// todo: comment about https canonicalization