Use interface for RequestBuilder
This commit was moved from ipfs/go-ipfs-http-client@0534b7ca8319329459c505a546f3025862a735f5
Łukasz Magiera committed
May 10, 2019 at 15:38 UTC
8d953a7359c488cde5299ca704594bd8e1349ab2
3 files changed
+31
-17
client/httpapi/api.go
+5
-5
@@ -36,7 +36,7 @@ type HttpApi struct {
36
url string
37
httpcli gohttp.Client
38
Headers http.Header
39
- applyGlobal func(*RequestBuilder)
39
+ applyGlobal func(*requestBuilder)
40
}
41
42
// NewLocalApi tries to construct new HttpApi instance communicating with local
@@ -117,7 +117,7 @@ func NewURLApiWithClient(url string, c *gohttp.Client) (*HttpApi, error) {
117
url: url,
118
httpcli: *c,
119
Headers: make(map[string][]string),
120
- applyGlobal: func(*RequestBuilder) {},
120
+ applyGlobal: func(*requestBuilder) {},
121
}
122
123
// We don't support redirects.
@@ -134,7 +134,7 @@ func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreAPI, error)
134
}
135
136
subApi := *api
137
- subApi.applyGlobal = func(req *RequestBuilder) {
137
+ subApi.applyGlobal = func(req *requestBuilder) {
138
if options.Offline {
139
req.Option("offline", options.Offline)
140
}
@@ -143,14 +143,14 @@ func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreAPI, error)
143
return &subApi, nil
144
}
145
146
-func (api *HttpApi) Request(command string, args ...string) *RequestBuilder {
146
+func (api *HttpApi) Request(command string, args ...string) RequestBuilder {
147
headers := make(map[string]string)
148
if api.Headers != nil {
149
for k := range api.Headers {
150
headers[k] = api.Headers.Get(k)
151
}
152
}
153
- return &RequestBuilder{
153
+ return &requestBuilder{
154
command: command,
155
args: args,
156
shell: api,
client/httpapi/requestbuilder.go
+25
-11
@@ -12,8 +12,20 @@ import (
12
"github.com/ipfs/go-ipfs-files"
13
)
14
15
-// RequestBuilder is an IPFS commands request builder.
16
-type RequestBuilder struct {
15
+type RequestBuilder interface {
16
+ Arguments(args ...string) RequestBuilder
17
+ BodyString(body string) RequestBuilder
18
+ BodyBytes(body []byte) RequestBuilder
19
+ Body(body io.Reader) RequestBuilder
20
+ FileBody(body io.Reader) RequestBuilder
21
+ Option(key string, value interface{}) RequestBuilder
22
+ Header(name, value string) RequestBuilder
23
+ Send(ctx context.Context) (*Response, error)
24
+ Exec(ctx context.Context, res interface{}) error
25
+}
26
+
27
+// requestBuilder is an IPFS commands request builder.
28
+type requestBuilder struct {
29
command string
30
args []string
31
opts map[string]string
@@ -24,29 +36,29 @@ type RequestBuilder struct {
36
}
37
38
// Arguments adds the arguments to the args.
27
-func (r *RequestBuilder) Arguments(args ...string) *RequestBuilder {
39
+func (r *requestBuilder) Arguments(args ...string) RequestBuilder {
40
r.args = append(r.args, args...)
41
return r
42
}
43
44
// BodyString sets the request body to the given string.
33
-func (r *RequestBuilder) BodyString(body string) *RequestBuilder {
45
+func (r *requestBuilder) BodyString(body string) RequestBuilder {
46
return r.Body(strings.NewReader(body))
47
}
48
49
// BodyBytes sets the request body to the given buffer.
38
-func (r *RequestBuilder) BodyBytes(body []byte) *RequestBuilder {
50
+func (r *requestBuilder) BodyBytes(body []byte) RequestBuilder {
51
return r.Body(bytes.NewReader(body))
52
}
53
54
// Body sets the request body to the given reader.
43
-func (r *RequestBuilder) Body(body io.Reader) *RequestBuilder {
55
+func (r *requestBuilder) Body(body io.Reader) RequestBuilder {
56
r.body = body
57
return r
58
}
59
60
// FileBody sets the request body to the given reader wrapped into multipartreader.
49
-func (r *RequestBuilder) FileBody(body io.Reader) *RequestBuilder {
61
+func (r *requestBuilder) FileBody(body io.Reader) RequestBuilder {
62
pr, _ := files.NewReaderPathFile("/dev/stdin", ioutil.NopCloser(body), nil)
63
d := files.NewMapDirectory(map[string]files.Node{"": pr})
64
r.body = files.NewMultiFileReader(d, false)
@@ -55,7 +67,7 @@ func (r *RequestBuilder) FileBody(body io.Reader) *RequestBuilder {
67
}
68
69
// Option sets the given option.
58
-func (r *RequestBuilder) Option(key string, value interface{}) *RequestBuilder {
70
+func (r *requestBuilder) Option(key string, value interface{}) RequestBuilder {
71
var s string
72
switch v := value.(type) {
73
case bool:
@@ -76,7 +88,7 @@ func (r *RequestBuilder) Option(key string, value interface{}) *RequestBuilder {
88
}
89
90
// Header sets the given header.
79
-func (r *RequestBuilder) Header(name, value string) *RequestBuilder {
91
+func (r *requestBuilder) Header(name, value string) RequestBuilder {
92
if r.headers == nil {
93
r.headers = make(map[string]string, 1)
94
}
@@ -85,7 +97,7 @@ func (r *RequestBuilder) Header(name, value string) *RequestBuilder {
97
}
98
99
// Send sends the request and return the response.
88
-func (r *RequestBuilder) Send(ctx context.Context) (*Response, error) {
100
+func (r *requestBuilder) Send(ctx context.Context) (*Response, error) {
101
r.shell.applyGlobal(r)
102
103
req := NewRequest(ctx, r.shell.url, r.command, r.args...)
@@ -96,7 +108,7 @@ func (r *RequestBuilder) Send(ctx context.Context) (*Response, error) {
108
}
109
110
// Exec sends the request a request and decodes the response.
99
-func (r *RequestBuilder) Exec(ctx context.Context, res interface{}) error {
111
+func (r *requestBuilder) Exec(ctx context.Context, res interface{}) error {
112
httpRes, err := r.Send(ctx)
113
if err != nil {
114
return err
@@ -112,3 +124,5 @@ func (r *RequestBuilder) Exec(ctx context.Context, res interface{}) error {
124
125
return httpRes.decode(res)
126
}
127
+
128
+var _ RequestBuilder = &requestBuilder{}
client/httpapi/response.go
+1
-1
@@ -97,7 +97,7 @@ func (r *Request) Send(c *http.Client) (*Response, error) {
97
98
req = req.WithContext(r.Ctx)
99
100
- // Add any headers that were supplied via the RequestBuilder.
100
+ // Add any headers that were supplied via the requestBuilder.
101
for k, v := range r.Headers {
102
req.Header.Add(k, v)
103
}