@@ -23,7 +23,6 @@ package lib
2323import (
2424 "bytes"
2525 "encoding/json"
26- "errors"
2726 "fmt"
2827 "io/ioutil"
2928 "net"
@@ -34,6 +33,8 @@ import (
3433 "strconv"
3534 "strings"
3635
36+ "github.com/hyperledger/fabric-sdk-go/pkg/errors"
37+
3738 cfsslapi "github.com/cloudflare/cfssl/api"
3839 "github.com/cloudflare/cfssl/csr"
3940 "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/api"
@@ -56,6 +57,8 @@ type Client struct {
5657 keyFile , certFile , caCertsDir string
5758 // The crypto service provider (BCCSP)
5859 csp bccsp.BCCSP
60+ // HTTP client associated with this Fabric CA client
61+ httpClient * http.Client
5962}
6063
6164// Init initializes the client
@@ -75,33 +78,59 @@ func (c *Client) Init() error {
7578 keyDir := path .Join (mspDir , "keystore" )
7679 err = os .MkdirAll (keyDir , 0700 )
7780 if err != nil {
78- return fmt . Errorf ( "Failed to create keystore directory: %s" , err )
81+ return errors . Wrap ( err , "Failed to create keystore directory" )
7982 }
8083 c .keyFile = path .Join (keyDir , "key.pem" )
8184 // Cert directory and file
8285 certDir := path .Join (mspDir , "signcerts" )
8386 err = os .MkdirAll (certDir , 0755 )
8487 if err != nil {
85- return fmt . Errorf ( "Failed to create signcerts directory: %s" , err )
88+ return errors . Wrap ( err , "Failed to create signcerts directory" )
8689 }
8790 c .certFile = path .Join (certDir , "cert.pem" )
8891 // CA certs directory
8992 c .caCertsDir = path .Join (mspDir , "cacerts" )
9093 err = os .MkdirAll (c .caCertsDir , 0755 )
9194 if err != nil {
92- return fmt . Errorf ( "Failed to create cacerts directory: %s" , err )
95+ return errors . Wrap ( err , "Failed to create cacerts directory" )
9396 }
9497 // Initialize BCCSP (the crypto layer)
9598 c .csp , err = util .InitBCCSP (& cfg .CSP , mspDir , c .HomeDir )
9699 if err != nil {
97100 return err
98101 }
102+ // Create http.Client object and associate it with this client
103+ err = c .initHTTPClient ()
104+ if err != nil {
105+ return err
106+ }
107+
99108 // Successfully initialized the client
100109 c .initialized = true
101110 }
102111 return nil
103112}
104113
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+
105134// GetServerInfoResponse is the response from the GetServerInfo call
106135type GetServerInfoResponse struct {
107136 // CAName is the name of the CA
@@ -168,11 +197,12 @@ func (c *Client) Enroll(req *api.EnrollmentRequest) (*EnrollmentResponse, error)
168197 // Generate the CSR
169198 csrPEM , key , err := c .GenCSR (req .CSR , req .Name )
170199 if err != nil {
171- return nil , fmt . Errorf ( "Failure generating CSR: %s" , err )
200+ return nil , errors . WithMessage ( err , "Failure generating CSR" )
172201 }
173202
174203 reqNet := & api.EnrollmentRequestNet {
175- CAName : req .CAName ,
204+ CAName : req .CAName ,
205+ AttrReqs : req .AttrReqs ,
176206 }
177207
178208 if req .CSR != nil {
@@ -211,7 +241,7 @@ func (c *Client) newEnrollmentResponse(result *enrollmentResponseNet, id string,
211241 log .Debugf ("newEnrollmentResponse %s" , id )
212242 certByte , err := util .B64Decode (result .Cert )
213243 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" )
215245 }
216246 resp := & EnrollmentResponse {
217247 Identity : newIdentity (c , id , key , certByte ),
@@ -298,7 +328,7 @@ func (c *Client) StoreMyIdentity(cert []byte) error {
298328 }
299329 err = util .WriteFile (c .certFile , cert , 0644 )
300330 if err != nil {
301- return fmt . Errorf ( "Failed to store my certificate: %s" , err )
331+ return errors . WithMessage ( err , "Failed to store my certificate" )
302332 }
303333 log .Infof ("Stored client certificate at %s" , c .certFile )
304334 return nil
@@ -322,7 +352,7 @@ func (c *Client) LoadIdentity(keyFile, certFile string) (*Identity, error) {
322352 log .Debugf ("No key found in BCCSP keystore, attempting fallback" )
323353 key , err = util .ImportBCCSPKeyFromPEM (keyFile , c .csp , true )
324354 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 ) )
326356 }
327357 }
328358 return c .NewIdentity (key , cert )
@@ -365,7 +395,7 @@ func (c *Client) newGet(endpoint string) (*http.Request, error) {
365395 }
366396 req , err := http .NewRequest ("GET" , curl , bytes .NewReader ([]byte {}))
367397 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 )
369399 }
370400 return req , nil
371401}
@@ -378,7 +408,7 @@ func (c *Client) newPost(endpoint string, reqBody []byte) (*http.Request, error)
378408 }
379409 req , err := http .NewRequest ("POST" , curl , bytes .NewReader (reqBody ))
380410 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 )
382412 }
383413 return req , nil
384414}
@@ -394,35 +424,21 @@ func (c *Client) SendReq(req *http.Request, result interface{}) (err error) {
394424 return err
395425 }
396426
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 )
417428 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 )
419430 }
420431 var respBody []byte
421432 if resp .Body != nil {
422433 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+ }()
424440 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 )
426442 }
427443 log .Debugf ("Received response\n %s" , util .HTTPResponseToString (resp ))
428444 }
@@ -431,22 +447,22 @@ func (c *Client) SendReq(req *http.Request, result interface{}) (err error) {
431447 body = new (cfsslapi.Response )
432448 err = json .Unmarshal (respBody , body )
433449 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 )
435451 }
436452 if len (body .Errors ) > 0 {
437453 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 )
439455 }
440456 }
441457 scode := resp .StatusCode
442458 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 )
444460 }
445461 if body == nil {
446- return fmt .Errorf ("Empty response body:\n %s" , reqStr )
462+ return errors .Errorf ("Empty response body:\n %s" , reqStr )
447463 }
448464 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 )
450466 }
451467 log .Debugf ("Response body result: %+v" , body .Result )
452468 if result != nil {
0 commit comments