github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/cmd/getgo/server/main.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Command server serves get.golang.org, redirecting users to the appropriate 6 // getgo installer based on the request path. 7 package main 8 9 import ( 10 "fmt" 11 "net/http" 12 "os" 13 "strings" 14 "time" 15 ) 16 17 const ( 18 base = "https://dl.google.com/go/getgo/" 19 windowsInstaller = base + "installer.exe" 20 linuxInstaller = base + "installer_linux" 21 macInstaller = base + "installer_darwin" 22 ) 23 24 // substring-based redirects. 25 var stringMatch = map[string]string{ 26 // via uname, from bash 27 "MINGW": windowsInstaller, // Reported as MINGW64_NT-10.0 in git bash 28 "Linux": linuxInstaller, 29 "Darwin": macInstaller, 30 } 31 32 func main() { 33 http.HandleFunc("/", handler) 34 35 port := os.Getenv("PORT") 36 if port == "" { 37 port = "8080" 38 fmt.Printf("Defaulting to port %s", port) 39 } 40 41 fmt.Printf("Listening on port %s", port) 42 if err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil); err != nil { 43 fmt.Fprintf(os.Stderr, "http.ListenAndServe: %v", err) 44 } 45 } 46 47 func handler(w http.ResponseWriter, r *http.Request) { 48 if containsIgnoreCase(r.URL.Path, "installer.exe") { 49 // cache bust 50 http.Redirect(w, r, windowsInstaller+cacheBust(), http.StatusFound) 51 return 52 } 53 54 for match, redirect := range stringMatch { 55 if containsIgnoreCase(r.URL.Path, match) { 56 http.Redirect(w, r, redirect, http.StatusFound) 57 return 58 } 59 } 60 61 http.NotFound(w, r) 62 } 63 64 func containsIgnoreCase(s, substr string) bool { 65 return strings.Contains( 66 strings.ToLower(s), 67 strings.ToLower(substr), 68 ) 69 } 70 71 func cacheBust() string { 72 return fmt.Sprintf("?%d", time.Now().Nanosecond()) 73 }