package main import ( "html/template" "log" "net/http" "os" ) // Package represents a Go package mapping type Package struct { Path string // URL path like "/go-utils" Repo string VCS string // "git", "hg", etc. } // Package mappings var packages = []Package{ { Path: "/utils", Repo: "https://github.com/aykhans/go-utils", VCS: "git", }, { Path: "/sarin", Repo: "https://github.com/aykhans/sarin", VCS: "git", }, } type HomeData struct { Domain string Packages []Package Count int } type VanityData struct { Domain string Path string Repo string VCS string } type RedirectData struct { Domain string Path string } var hostHeader = getEnvOrDefault("HOST_HEADER", "X-Forwarded-Host") var hostOverride = os.Getenv("HOST") func getEnvOrDefault(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func getHost(r *http.Request) string { if hostOverride != "" { return hostOverride } if host := r.Header.Get(hostHeader); host != "" { return host } return r.Host } func homeHandler(w http.ResponseWriter, r *http.Request) { data := HomeData{ Domain: getHost(r), Packages: packages, Count: len(packages), } tmpl, err := template.New("home").Parse(homeTemplate) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tmpl.Execute(w, data); err != nil { log.Printf("Template execution error: %v", err) } } func packageHandler(w http.ResponseWriter, r *http.Request) { path := r.URL.Path // Find package by path var pkg *Package for i := range packages { if packages[i].Path == path { pkg = &packages[i] break } } if pkg == nil { http.NotFound(w, r) return } // Check if this is a go-get request if r.URL.Query().Get("go-get") == "1" { // Respond with meta tags for go get data := VanityData{ Domain: getHost(r), Path: pkg.Path, Repo: pkg.Repo, VCS: pkg.VCS, } tmpl, err := template.New("vanity").Parse(vanityTemplate) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tmpl.Execute(w, data); err != nil { log.Printf("Template execution error: %v", err) } } else { // Regular browser request - redirect to pkg.go.dev data := RedirectData{ Domain: getHost(r), Path: pkg.Path, } tmpl, err := template.New("redirect").Parse(redirectTemplate) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tmpl.Execute(w, data); err != nil { log.Printf("Template execution error: %v", err) } } } func main() { // Home page http.HandleFunc("/{$}", homeHandler) // All package paths http.HandleFunc("/", packageHandler) port := getEnvOrDefault("PORT", "8421") log.Printf("Server listening on :%s", port) log.Fatal(http.ListenAndServe(":"+port, nil)) } const vanityTemplate = `
go get {{.Domain}}{{.Path}} ` const redirectTemplate = ` Redirecting to pkg.go.dev/{{.Domain}}{{.Path}}... ` const homeTemplate = `