/
stub.go
136 lines (111 loc) · 3.26 KB
/
stub.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//<developer>
// <name>linapex 曹一峰</name>
// <email>linapex@163.com</email>
// <wx>superexc</wx>
// <qqgroup>128148617</qqgroup>
// <url>https://jsq.ink</url>
// <role>pku engineer</role>
// <date>2019-03-16 19:40:18</date>
//</624456047716732928>
/*
版权所有IBM公司。保留所有权利。
SPDX许可证标识符:Apache-2.0
**/
package discovery
import (
"context"
"github.com/hyperledger/fabric/cmd/common"
"github.com/hyperledger/fabric/cmd/common/comm"
"github.com/hyperledger/fabric/cmd/common/signer"
"github.com/hyperledger/fabric/discovery/client"
. "github.com/hyperledger/fabric/protos/discovery"
"github.com/hyperledger/fabric/protos/utils"
"github.com/pkg/errors"
)
//go:generate mokery-dir../client/-name localresponse-case underline-output mocks/
//go:generate mokery-dir../client/-name channelresponse-case underline-output mocks/
//去:生成mokery-dir。-name serviceresponse-case underline-输出模拟/
//ServiceResponse表示从发现服务发送的响应
type ServiceResponse interface {
//ForChannel返回给定通道上下文中的ChannelResponse
ForChannel(string) discovery.ChannelResponse
//forlocal返回无通道上下文中的localresponse
ForLocal() discovery.LocalResponse
//RAW返回来自服务器的原始响应
Raw() *Response
}
type response struct {
raw *Response
discovery.Response
}
func (r *response) Raw() *Response {
return r.raw
}
//ClientStub是一个与发现服务通信的存根
//using the discovery client implementation
type ClientStub struct {
}
//发送发送请求并接收响应
func (stub *ClientStub) Send(server string, conf common.Config, req *discovery.Request) (ServiceResponse, error) {
comm, err := comm.NewClient(conf.TLSConfig)
if err != nil {
return nil, err
}
signer, err := signer.NewSigner(conf.SignerConfig)
if err != nil {
return nil, err
}
timeout, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
disc := discovery.NewClient(comm.NewDialer(server), signer.Sign, 0)
resp, err := disc.Send(timeout, req, &AuthInfo{
ClientIdentity: signer.Creator,
ClientTlsCertHash: comm.TLSCertHash,
})
if err != nil {
return nil, errors.Errorf("failed connecting to %s: %v", server, err)
}
return &response{
Response: resp,
}, nil
}
//rawstub是一个与发现服务通信的存根
//没有任何中间人。
type RawStub struct {
}
//发送发送请求并接收响应
func (stub *RawStub) Send(server string, conf common.Config, req *discovery.Request) (ServiceResponse, error) {
comm, err := comm.NewClient(conf.TLSConfig)
if err != nil {
return nil, err
}
signer, err := signer.NewSigner(conf.SignerConfig)
if err != nil {
return nil, err
}
timeout, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
req.Authentication = &AuthInfo{
ClientIdentity: signer.Creator,
ClientTlsCertHash: comm.TLSCertHash,
}
payload := utils.MarshalOrPanic(req.Request)
sig, err := signer.Sign(payload)
if err != nil {
return nil, err
}
cc, err := comm.NewDialer(server)()
if err != nil {
return nil, err
}
resp, err := NewDiscoveryClient(cc).Discover(timeout, &SignedRequest{
Payload: payload,
Signature: sig,
})
if err != nil {
return nil, err
}
return &response{
raw: resp,
}, nil
}