11package client
22
33import (
4- "context"
54 "crypto/tls"
6- "crypto/x509"
75 "fmt"
8- "io/ioutil"
9- "net"
106 "net/http"
117 "net/url"
128 "os"
139 "strings"
1410 "time"
11+
12+ "github.com/alibaba/pouch/pkg/httputils"
1513)
1614
1715var (
@@ -47,14 +45,14 @@ func NewAPIClient(host string, tls TLSConfig) (CommonAPIClient, error) {
4745 host = defaultHost
4846 }
4947
50- newURL , basePath , addr , err := parseHost (host )
48+ newURL , basePath , addr , err := httputils . ParseHost (host )
5149 if err != nil {
5250 return nil , fmt .Errorf ("failed to parse host %s: %v" , host , err )
5351 }
5452
5553 tlsConfig := generateTLSConfig (host , tls )
5654
57- httpCli := newHTTPClient (newURL , tlsConfig )
55+ httpCli := httputils . NewHTTPClient (newURL , tlsConfig , defaultTimeout )
5856
5957 basePath = generateBaseURL (newURL , tls )
6058
@@ -72,57 +70,11 @@ func NewAPIClient(host string, tls TLSConfig) (CommonAPIClient, error) {
7270 }, nil
7371}
7472
75- // parseHost inputs a host address string, and output three type:
76- // url.URL, basePath and an error
77- func parseHost (host string ) (* url.URL , string , string , error ) {
78- u , err := url .Parse (host )
79- if err != nil {
80- return nil , "" , "" , err
81- }
82-
83- var basePath string
84- switch u .Scheme {
85- case "unix" :
86- basePath = "http://d"
87- case "tcp" :
88- basePath = "http://" + u .Host
89- case "http" :
90- basePath = host
91- default :
92- return nil , "" , "" , fmt .Errorf ("not support url scheme %v" , u .Scheme )
93- }
94-
95- return u , basePath , strings .TrimPrefix (host , u .Scheme + "://" ), nil
96- }
97-
98- func newHTTPClient (u * url.URL , tlsConfig * tls.Config ) * http.Client {
99- tr := & http.Transport {
100- TLSClientConfig : tlsConfig ,
101- }
102-
103- switch u .Scheme {
104- case "unix" :
105- unixDial := func (ctx context.Context , network , addr string ) (net.Conn , error ) {
106- return net .DialTimeout ("unix" , u .Path , time .Duration (defaultTimeout ))
107- }
108- tr .DialContext = unixDial
109- default :
110- dial := func (ctx context.Context , network , addr string ) (net.Conn , error ) {
111- return net .DialTimeout (network , addr , time .Duration (defaultTimeout ))
112- }
113- tr .DialContext = dial
114- }
115-
116- return & http.Client {
117- Transport : tr ,
118- }
119- }
120-
12173// generateTLSConfig configures TLS for API Client.
12274func generateTLSConfig (host string , tls TLSConfig ) * tls.Config {
12375 // init tls config
12476 if tls .Key != "" && tls .Cert != "" && ! strings .HasPrefix (host , "unix://" ) {
125- tlsCfg , err := GenTLSConfig (tls .Key , tls .Cert , tls .CA )
77+ tlsCfg , err := httputils . GenTLSConfig (tls .Key , tls .Cert , tls .CA )
12678 if err != nil {
12779 fmt .Fprintf (os .Stderr , "fail to parse tls config %v" , err )
12880 os .Exit (1 )
@@ -174,27 +126,3 @@ func (client *APIClient) GetAPIPath(path string, query url.Values) string {
174126func (client * APIClient ) UpdateClientVersion (v string ) {
175127 client .version = v
176128}
177-
178- // GenTLSConfig returns a tls config object according to inputting parameters.
179- func GenTLSConfig (key , cert , ca string ) (* tls.Config , error ) {
180- tlsConfig := & tls.Config {}
181- tlsCert , err := tls .LoadX509KeyPair (cert , key )
182- if err != nil {
183- return nil , fmt .Errorf ("failed to read X509 key pair (cert: %q, key: %q): %v" , cert , key , err )
184- }
185- tlsConfig .Certificates = []tls.Certificate {tlsCert }
186- if ca == "" {
187- return tlsConfig , nil
188- }
189-
190- cp := x509 .NewCertPool ()
191- pem , err := ioutil .ReadFile (ca )
192- if err != nil {
193- return nil , fmt .Errorf ("failed to read CA certificate %q: %v" , ca , err )
194- }
195- if ! cp .AppendCertsFromPEM (pem ) {
196- return nil , fmt .Errorf ("failed to append certificates from PEM file: %q" , ca )
197- }
198- tlsConfig .ClientCAs = cp
199- return tlsConfig , nil
200- }
0 commit comments