all repos — gomod-index @ 8cb0ced36a8a9bdcfbda9586f8b871613731de34

simple go get handler

main.go (view raw)

 1package main
 2
 3import (
 4	"flag"
 5	"html/template"
 6	"log"
 7	"net/http"
 8	"net/url"
 9	"strings"
10)
11
12var (
13	lFlag = flag.String("l", ":8080", "address and port to listen")
14	mFlag = flag.String("m", "aaoth.xyz", "module root path")
15	gFlag = flag.String("g", "https://git.aaoth.xyz", "repository root path")
16)
17
18const indexTmpl = `<!DOCTYPE html>
19<html lang="en">
20<head>
21<title>aaoth.xyz go</title>
22<meta charset="utf-8">
23<meta name="go-import" content="{{.Mod}} git {{.Repo}}">
24<meta http-equiv="refresh" content="0; url={{.Repo}}">
25</head>
26<body>
27<p>redirecting to <a href="{{.Repo}}">repository</a>...</p>
28</body>
29</html>`
30
31var t = template.Must(template.New("index").Parse(indexTmpl))
32
33type Data struct {
34	Mod  string
35	Repo string
36}
37
38func indexHandler(w http.ResponseWriter, req *http.Request) {
39	err := req.ParseForm()
40	if err != nil {
41		log.Println("parse form:", err)
42		http.Error(w, "bad request", http.StatusBadRequest)
43		return
44	}
45	if goGet, ok := req.Form["go-get"]; !ok || len(goGet) < 1 || goGet[0] != "1" {
46		http.Error(w, "bad request", http.StatusBadRequest)
47		return
48	}
49	path := strings.Trim(req.URL.EscapedPath(), "/")
50	parts := strings.Split(path, "/")
51	if len(parts) < 2 {
52		log.Println("requested", req.RequestURI, "got", parts)
53		http.Error(w, "bad request", http.StatusBadRequest)
54		return
55	}
56	mod, err := url.JoinPath(*mFlag, parts[0], parts[1])
57	if err != nil {
58		log.Println("url join:", err)
59		http.Error(w, "internal server error", http.StatusInternalServerError)
60		return
61	}
62	repo, err := url.JoinPath(*gFlag, parts[0], parts[1])
63	if err != nil {
64		log.Println("url join:", err)
65		http.Error(w, "internal server error", http.StatusInternalServerError)
66		return
67	}
68	data := Data{mod, repo}
69	err = t.ExecuteTemplate(w, "index", data)
70	if err != nil {
71		log.Println("url join:", err)
72		http.Error(w, "internal server error", http.StatusInternalServerError)
73		return
74	}
75	log.Println("go get", mod)
76}
77
78func main() {
79	flag.Parse()
80
81	mux := http.NewServeMux()
82	mux.HandleFunc("/", indexHandler)
83	log.Fatal(http.ListenAndServe(*lFlag, mux))
84}