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}