38 lines
932 B
Go
38 lines
932 B
Go
package main
|
|
|
|
import "net/http"
|
|
import "strings"
|
|
import "fmt"
|
|
|
|
type handler http.HandlerFunc
|
|
|
|
func hello(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
fmt.Fprintln(w, "Hello canonical world")
|
|
}
|
|
|
|
func wrapCanonicalHost(f handler, chost string) handler {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
hostPort := strings.Split(r.Host, ":")
|
|
host := hostPort[0]
|
|
if host != chost {
|
|
fmt.Println("redirect to", chost)
|
|
hostPort[0] = chost
|
|
url := "http://" +
|
|
strings.Join(hostPort, ":") +
|
|
r.URL.String()
|
|
http.Redirect(w, r, url, 301)
|
|
return
|
|
}
|
|
f(w, r)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
handler := wrapCanonicalHost(hello, "localhost")
|
|
http.HandleFunc("/", handler)
|
|
http.ListenAndServe(":5000", nil)
|
|
}
|
|
|
|
// todo: comment about https canonicalization
|