@@ -23,7 +23,6 @@ package lib
23
23
import (
24
24
"bytes"
25
25
"encoding/json"
26
- "errors"
27
26
"fmt"
28
27
"io/ioutil"
29
28
"net"
@@ -34,6 +33,8 @@ import (
34
33
"strconv"
35
34
"strings"
36
35
36
+ "github.com/hyperledger/fabric-sdk-go/pkg/errors"
37
+
37
38
cfsslapi "github.com/cloudflare/cfssl/api"
38
39
"github.com/cloudflare/cfssl/csr"
39
40
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/api"
@@ -56,6 +57,8 @@ type Client struct {
56
57
keyFile , certFile , caCertsDir string
57
58
// The crypto service provider (BCCSP)
58
59
csp bccsp.BCCSP
60
+ // HTTP client associated with this Fabric CA client
61
+ httpClient * http.Client
59
62
}
60
63
61
64
// Init initializes the client
@@ -75,33 +78,59 @@ func (c *Client) Init() error {
75
78
keyDir := path .Join (mspDir , "keystore" )
76
79
err = os .MkdirAll (keyDir , 0700 )
77
80
if err != nil {
78
- return fmt . Errorf ( "Failed to create keystore directory: %s" , err )
81
+ return errors . Wrap ( err , "Failed to create keystore directory" )
79
82
}
80
83
c .keyFile = path .Join (keyDir , "key.pem" )
81
84
// Cert directory and file
82
85
certDir := path .Join (mspDir , "signcerts" )
83
86
err = os .MkdirAll (certDir , 0755 )
84
87
if err != nil {
85
- return fmt . Errorf ( "Failed to create signcerts directory: %s" , err )
88
+ return errors . Wrap ( err , "Failed to create signcerts directory" )
86
89
}
87
90
c .certFile = path .Join (certDir , "cert.pem" )
88
91
// CA certs directory
89
92
c .caCertsDir = path .Join (mspDir , "cacerts" )
90
93
err = os .MkdirAll (c .caCertsDir , 0755 )
91
94
if err != nil {
92
- return fmt . Errorf ( "Failed to create cacerts directory: %s" , err )
95
+ return errors . Wrap ( err , "Failed to create cacerts directory" )
93
96
}
94
97
// Initialize BCCSP (the crypto layer)
95
98
c .csp , err = util .InitBCCSP (& cfg .CSP , mspDir , c .HomeDir )
96
99
if err != nil {
97
100
return err
98
101
}
102
+ // Create http.Client object and associate it with this client
103
+ err = c .initHTTPClient ()
104
+ if err != nil {
105
+ return err
106
+ }
107
+
99
108
// Successfully initialized the client
100
109
c .initialized = true
101
110
}
102
111
return nil
103
112
}
104
113
114
+ func (c * Client ) initHTTPClient () error {
115
+ tr := new (http.Transport )
116
+ if c .Config .TLS .Enabled {
117
+ log .Info ("TLS Enabled" )
118
+
119
+ err := tls .AbsTLSClient (& c .Config .TLS , c .HomeDir )
120
+ if err != nil {
121
+ return err
122
+ }
123
+
124
+ tlsConfig , err2 := tls .GetClientTLSConfig (& c .Config .TLS , c .csp )
125
+ if err2 != nil {
126
+ return fmt .Errorf ("Failed to get client TLS config: %s" , err2 )
127
+ }
128
+ tr .TLSClientConfig = tlsConfig
129
+ }
130
+ c .httpClient = & http.Client {Transport : tr }
131
+ return nil
132
+ }
133
+
105
134
// GetServerInfoResponse is the response from the GetServerInfo call
106
135
type GetServerInfoResponse struct {
107
136
// CAName is the name of the CA
@@ -168,11 +197,12 @@ func (c *Client) Enroll(req *api.EnrollmentRequest) (*EnrollmentResponse, error)
168
197
// Generate the CSR
169
198
csrPEM , key , err := c .GenCSR (req .CSR , req .Name )
170
199
if err != nil {
171
- return nil , fmt . Errorf ( "Failure generating CSR: %s" , err )
200
+ return nil , errors . WithMessage ( err , "Failure generating CSR" )
172
201
}
173
202
174
203
reqNet := & api.EnrollmentRequestNet {
175
- CAName : req .CAName ,
204
+ CAName : req .CAName ,
205
+ AttrReqs : req .AttrReqs ,
176
206
}
177
207
178
208
if req .CSR != nil {
@@ -211,7 +241,7 @@ func (c *Client) newEnrollmentResponse(result *enrollmentResponseNet, id string,
211
241
log .Debugf ("newEnrollmentResponse %s" , id )
212
242
certByte , err := util .B64Decode (result .Cert )
213
243
if err != nil {
214
- return nil , fmt . Errorf ( "Invalid response format from server: %s" , err )
244
+ return nil , errors . WithMessage ( err , "Invalid response format from server" )
215
245
}
216
246
resp := & EnrollmentResponse {
217
247
Identity : newIdentity (c , id , key , certByte ),
@@ -298,7 +328,7 @@ func (c *Client) StoreMyIdentity(cert []byte) error {
298
328
}
299
329
err = util .WriteFile (c .certFile , cert , 0644 )
300
330
if err != nil {
301
- return fmt . Errorf ( "Failed to store my certificate: %s" , err )
331
+ return errors . WithMessage ( err , "Failed to store my certificate" )
302
332
}
303
333
log .Infof ("Stored client certificate at %s" , c .certFile )
304
334
return nil
@@ -322,7 +352,7 @@ func (c *Client) LoadIdentity(keyFile, certFile string) (*Identity, error) {
322
352
log .Debugf ("No key found in BCCSP keystore, attempting fallback" )
323
353
key , err = util .ImportBCCSPKeyFromPEM (keyFile , c .csp , true )
324
354
if err != nil {
325
- return nil , fmt .Errorf ("Could not find the private key in BCCSP keystore nor in keyfile %s: %s " , keyFile , err )
355
+ return nil , errors . WithMessage ( err , fmt .Sprintf ("Could not find the private key in BCCSP keystore nor in keyfile %s" , keyFile ) )
326
356
}
327
357
}
328
358
return c .NewIdentity (key , cert )
@@ -365,7 +395,7 @@ func (c *Client) newGet(endpoint string) (*http.Request, error) {
365
395
}
366
396
req , err := http .NewRequest ("GET" , curl , bytes .NewReader ([]byte {}))
367
397
if err != nil {
368
- return nil , fmt . Errorf ( "Failed creating GET request for %s: %s " , curl , err )
398
+ return nil , errors . Wrapf ( err , "Failed creating GET request for %s" , curl )
369
399
}
370
400
return req , nil
371
401
}
@@ -378,7 +408,7 @@ func (c *Client) newPost(endpoint string, reqBody []byte) (*http.Request, error)
378
408
}
379
409
req , err := http .NewRequest ("POST" , curl , bytes .NewReader (reqBody ))
380
410
if err != nil {
381
- return nil , fmt . Errorf ( "Failed posting to %s: %s " , curl , err )
411
+ return nil , errors . Wrapf ( err , "Failed posting to %s" , curl )
382
412
}
383
413
return req , nil
384
414
}
@@ -394,35 +424,21 @@ func (c *Client) SendReq(req *http.Request, result interface{}) (err error) {
394
424
return err
395
425
}
396
426
397
- var tr = new (http.Transport )
398
-
399
- if c .Config .TLS .Enabled {
400
- log .Info ("TLS Enabled" )
401
-
402
- err = tls .AbsTLSClient (& c .Config .TLS , c .HomeDir )
403
- if err != nil {
404
- return err
405
- }
406
-
407
- tlsConfig , err2 := tls .GetClientTLSConfig (& c .Config .TLS , c .csp )
408
- if err2 != nil {
409
- return fmt .Errorf ("Failed to get client TLS config: %s" , err2 )
410
- }
411
-
412
- tr .TLSClientConfig = tlsConfig
413
- }
414
-
415
- httpClient := & http.Client {Transport : tr }
416
- resp , err := httpClient .Do (req )
427
+ resp , err := c .httpClient .Do (req )
417
428
if err != nil {
418
- return fmt . Errorf ( "POST failure [%s]; not sending \n %s" , err , reqStr )
429
+ return errors . Wrapf ( err , "POST failure of request: %s" , reqStr )
419
430
}
420
431
var respBody []byte
421
432
if resp .Body != nil {
422
433
respBody , err = ioutil .ReadAll (resp .Body )
423
- defer resp .Body .Close ()
434
+ defer func () {
435
+ err := resp .Body .Close ()
436
+ if err != nil {
437
+ log .Debugf ("Failed to close the response body: %s" , err .Error ())
438
+ }
439
+ }()
424
440
if err != nil {
425
- return fmt . Errorf ( "Failed to read response [%s] of request:\n %s" , err , reqStr )
441
+ return errors . Wrapf ( err , "Failed to read response of request: %s" , reqStr )
426
442
}
427
443
log .Debugf ("Received response\n %s" , util .HTTPResponseToString (resp ))
428
444
}
@@ -431,22 +447,22 @@ func (c *Client) SendReq(req *http.Request, result interface{}) (err error) {
431
447
body = new (cfsslapi.Response )
432
448
err = json .Unmarshal (respBody , body )
433
449
if err != nil {
434
- return fmt . Errorf ( "Failed to parse response: %s\n %s" , err , respBody )
450
+ return errors . Wrapf ( err , "Failed to parse response: %s" , respBody )
435
451
}
436
452
if len (body .Errors ) > 0 {
437
453
msg := body .Errors [0 ].Message
438
- return fmt .Errorf ("Error response from server was : %s" , msg )
454
+ return errors .Errorf ("Response from server: %s" , msg )
439
455
}
440
456
}
441
457
scode := resp .StatusCode
442
458
if scode >= 400 {
443
- return fmt .Errorf ("Failed with server status code %d for request:\n %s" , scode , reqStr )
459
+ return errors .Errorf ("Failed with server status code %d for request:\n %s" , scode , reqStr )
444
460
}
445
461
if body == nil {
446
- return fmt .Errorf ("Empty response body:\n %s" , reqStr )
462
+ return errors .Errorf ("Empty response body:\n %s" , reqStr )
447
463
}
448
464
if ! body .Success {
449
- return fmt .Errorf ("Server returned failure for request:\n %s" , reqStr )
465
+ return errors .Errorf ("Server returned failure for request:\n %s" , reqStr )
450
466
}
451
467
log .Debugf ("Response body result: %+v" , body .Result )
452
468
if result != nil {
0 commit comments