Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / cmd / getgo / server / main.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/cmd/getgo/server/main.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/cmd/getgo/server/main.go
new file mode 100644 (file)
index 0000000..bdb0f70
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Command server serves get.golang.org, redirecting users to the appropriate
+// getgo installer based on the request path.
+package main
+
+import (
+       "fmt"
+       "net/http"
+       "os"
+       "strings"
+       "time"
+)
+
+const (
+       base             = "https://dl.google.com/go/getgo/"
+       windowsInstaller = base + "installer.exe"
+       linuxInstaller   = base + "installer_linux"
+       macInstaller     = base + "installer_darwin"
+)
+
+// substring-based redirects.
+var stringMatch = map[string]string{
+       // via uname, from bash
+       "MINGW":  windowsInstaller, // Reported as MINGW64_NT-10.0 in git bash
+       "Linux":  linuxInstaller,
+       "Darwin": macInstaller,
+}
+
+func main() {
+       http.HandleFunc("/", handler)
+
+       port := os.Getenv("PORT")
+       if port == "" {
+               port = "8080"
+               fmt.Printf("Defaulting to port %s", port)
+       }
+
+       fmt.Printf("Listening on port %s", port)
+       if err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil); err != nil {
+               fmt.Fprintf(os.Stderr, "http.ListenAndServe: %v", err)
+       }
+}
+
+func handler(w http.ResponseWriter, r *http.Request) {
+       if containsIgnoreCase(r.URL.Path, "installer.exe") {
+               // cache bust
+               http.Redirect(w, r, windowsInstaller+cacheBust(), http.StatusFound)
+               return
+       }
+
+       for match, redirect := range stringMatch {
+               if containsIgnoreCase(r.URL.Path, match) {
+                       http.Redirect(w, r, redirect, http.StatusFound)
+                       return
+               }
+       }
+
+       http.NotFound(w, r)
+}
+
+func containsIgnoreCase(s, substr string) bool {
+       return strings.Contains(
+               strings.ToLower(s),
+               strings.ToLower(substr),
+       )
+}
+
+func cacheBust() string {
+       return fmt.Sprintf("?%d", time.Now().Nanosecond())
+}