blob: cb5c1762b6cf2ef9d7ee224eed0236df1dbff269 [file] [log] [blame]
package main
import (
"log"
"net"
"net/http"
"net/url"
"os"
)
var discoveryHosts = map[string]string{
"": "pkg.go.dev",
"dev.go.dev": "dev-pkg.go.dev",
"staging.go.dev": "staging-pkg.go.dev",
}
func main() {
fs := http.FileServer(http.Dir("public/"))
http.Handle("/", fs)
http.Handle("/explore/", http.StripPrefix("/explore/", redirectHosts(discoveryHosts)))
http.Handle("/learn/", http.StripPrefix("/learn/", redirectHosts(map[string]string{"": "learn.go.dev"})))
p := listenPort()
l, err := net.Listen("tcp", ":"+p)
if err != nil {
log.Fatalf("net.Listen(%q, %q) = _, %v", "tcp", p, err)
}
defer l.Close()
log.Printf("Listening on http://%v/\n", l.Addr().String())
log.Print(http.Serve(l, nil))
}
func listenPort() string {
if p := os.Getenv("PORT"); p != "" {
return p
}
return "0"
}
type redirectHosts map[string]string
func (rh redirectHosts) ServeHTTP(w http.ResponseWriter, r *http.Request) {
u := &url.URL{Scheme: "https", Path: r.URL.Path, RawQuery: r.URL.RawQuery}
if h, ok := rh[r.Host]; ok {
u.Host = h
} else if h, ok := rh[""]; ok {
u.Host = h
} else {
http.NotFound(w, r)
return
}
http.Redirect(w, r, u.String(), http.StatusFound)
}