@cryptotaxi247 / kubo / commits / 8d953a735

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 }