funcgetpkg(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) return } if r.FormValue("go-get") != "1" { http.Error(w, "Bad Request", http.StatusBadRequest) return } pkg := path.Join(r.Host, r.URL.Path)
log.Printf("get %s", pkg)
meta := pkgs[pkg] if meta == nil { for _, m := range pkgs { if m.re != nil && m.re.MatchString(pkg) { meta = m break } } } if meta == nil { http.Error(w, "Not Found", http.StatusNotFound) return } metatpl.Execute(w, meta) }
funcloadmeta(filename string)error { data, err := ioutil.ReadFile(filename) if err != nil { return err } var allmeta []*Meta err = json.Unmarshal(data, &allmeta) if err != nil { return err } pkgs = make(map[string]*Meta, len(allmeta)) for _, m := range allmeta { if m.Pattern != "" { m.re = regexp.MustCompile(m.Pattern) } pkgs[m.Pkg] = m } returnnil }
这个比较难解决,好在 go get 提供了一个 -insecure 的命令允许 tls 建立连接过程跳过对证书的 CA 的校验。但这个做法只能在手动操作下比较好操作,如果走集成的命令,比如 vim-go 的 GoUpdateBinaries 命令的话,就要去改 vim-go 的 plugin 源码了。其实还有一种方式,如果只是我们私人使用的话,直接让系统 CA 信任我们自签的证书就完全没毛病了。(或者找黑心证书商买,大雾