@@ -2,9 +2,15 @@ package keystone
2
2
3
3
import (
4
4
"bytes"
5
+ "crypto/tls"
6
+ "crypto/x509"
5
7
"encoding/json"
6
8
"errors"
9
+ "io/ioutil"
7
10
"net/http"
11
+
12
+ "github.com/grafana/grafana/pkg/log"
13
+ "github.com/grafana/grafana/pkg/setting"
8
14
)
9
15
10
16
///////////////////////
@@ -166,8 +172,7 @@ func authenticate(data *Auth_data, b []byte) error {
166
172
return err
167
173
}
168
174
169
- client := & http.Client {}
170
- resp , err := client .Do (request )
175
+ resp , err := GetHttpClient ().Do (request )
171
176
if err != nil {
172
177
return err
173
178
} else if resp .StatusCode != 201 {
@@ -203,8 +208,7 @@ func GetProjects(data *Projects_data) error {
203
208
}
204
209
request .Header .Add ("X-Auth-Token" , data .Token )
205
210
206
- client := & http.Client {}
207
- resp , err := client .Do (request )
211
+ resp , err := GetHttpClient ().Do (request )
208
212
if err != nil {
209
213
return err
210
214
} else if resp .StatusCode != 200 {
@@ -224,3 +228,35 @@ func GetProjects(data *Projects_data) error {
224
228
}
225
229
return nil
226
230
}
231
+
232
+ // From https://golang.org/pkg/net/http:
233
+ // "Clients and Transports are safe for concurrent use by multiple goroutines and for efficiency should only be created once and re-used."
234
+ var client * http.Client
235
+
236
+ func GetHttpClient () * http.Client {
237
+ if client != nil {
238
+ return client
239
+ } else {
240
+ var certPool * x509.CertPool
241
+ if pemfile := setting .KeystoneRootCAPEMFile ; pemfile != "" {
242
+ certPool = x509 .NewCertPool ()
243
+ pemFileContent , err := ioutil .ReadFile (pemfile )
244
+ if err != nil {
245
+ panic (err )
246
+ }
247
+ if ! certPool .AppendCertsFromPEM (pemFileContent ) {
248
+ log .Error (3 , "Failed to load any certificates from Root CA PEM file %s" , pemfile )
249
+ } else {
250
+ log .Info ("Successfully loaded certificate(s) from %s" , pemfile )
251
+ }
252
+ }
253
+ tr := & http.Transport {
254
+ TLSClientConfig : & tls.Config {RootCAs : certPool ,
255
+ InsecureSkipVerify : ! setting .KeystoneVerifySSLCert },
256
+ }
257
+ tr .Proxy = http .ProxyFromEnvironment
258
+
259
+ client = & http.Client {Transport : tr }
260
+ return client
261
+ }
262
+ }
0 commit comments