2018-11-27 22:52:20 +01:00
|
|
|
// Package client contains helper function to deal with the different client
|
|
|
|
// protocols.
|
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
2021-04-23 02:08:53 +02:00
|
|
|
"crypto/tls"
|
|
|
|
"crypto/x509"
|
2018-11-27 22:52:20 +01:00
|
|
|
"fmt"
|
2021-04-23 02:08:53 +02:00
|
|
|
gohttp "net/http"
|
2018-11-27 22:52:20 +01:00
|
|
|
|
2020-03-17 17:19:58 +01:00
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport/file"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport/git"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport/http"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
|
2018-11-27 22:52:20 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// Protocols are the protocols supported by default.
|
|
|
|
var Protocols = map[string]transport.Transport{
|
|
|
|
"http": http.DefaultClient,
|
|
|
|
"https": http.DefaultClient,
|
|
|
|
"ssh": ssh.DefaultClient,
|
|
|
|
"git": git.DefaultClient,
|
|
|
|
"file": file.DefaultClient,
|
|
|
|
}
|
|
|
|
|
2021-04-23 02:08:53 +02:00
|
|
|
var insecureClient = http.NewClient(&gohttp.Client{
|
|
|
|
Transport: &gohttp.Transport{
|
|
|
|
TLSClientConfig: &tls.Config{
|
|
|
|
InsecureSkipVerify: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2018-11-27 22:52:20 +01:00
|
|
|
// InstallProtocol adds or modifies an existing protocol.
|
|
|
|
func InstallProtocol(scheme string, c transport.Transport) {
|
|
|
|
if c == nil {
|
|
|
|
delete(Protocols, scheme)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
Protocols[scheme] = c
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewClient returns the appropriate client among of the set of known protocols:
|
|
|
|
// http://, https://, ssh:// and file://.
|
|
|
|
// See `InstallProtocol` to add or modify protocols.
|
|
|
|
func NewClient(endpoint *transport.Endpoint) (transport.Transport, error) {
|
2021-04-23 02:08:53 +02:00
|
|
|
return getTransport(endpoint)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getTransport(endpoint *transport.Endpoint) (transport.Transport, error) {
|
|
|
|
if endpoint.Protocol == "https" {
|
|
|
|
if endpoint.InsecureSkipTLS {
|
|
|
|
return insecureClient, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(endpoint.CaBundle) != 0 {
|
|
|
|
rootCAs, _ := x509.SystemCertPool()
|
|
|
|
if rootCAs == nil {
|
|
|
|
rootCAs = x509.NewCertPool()
|
|
|
|
}
|
|
|
|
rootCAs.AppendCertsFromPEM(endpoint.CaBundle)
|
|
|
|
return http.NewClient(&gohttp.Client{
|
|
|
|
Transport: &gohttp.Transport{
|
|
|
|
TLSClientConfig: &tls.Config{
|
|
|
|
RootCAs: rootCAs,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}), nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-27 22:52:20 +01:00
|
|
|
f, ok := Protocols[endpoint.Protocol]
|
|
|
|
if !ok {
|
|
|
|
return nil, fmt.Errorf("unsupported scheme %q", endpoint.Protocol)
|
|
|
|
}
|
|
|
|
|
|
|
|
if f == nil {
|
|
|
|
return nil, fmt.Errorf("malformed client for scheme %q, client is defined as nil", endpoint.Protocol)
|
|
|
|
}
|
|
|
|
return f, nil
|
|
|
|
}
|