@@ -4,14 +4,23 @@ import (
4
4
"context"
5
5
"net"
6
6
"net/http"
7
+ "sync"
7
8
"time"
8
9
9
10
"github.com/frankli0324/go-requests/internal/request"
10
11
"github.com/frankli0324/go-requests/internal/response"
11
12
)
12
13
14
+ type Handler = func (* RequestCtx ) error
15
+ type Middleware = func (next Handler ) Handler
16
+
13
17
type Client struct {
14
18
Client http.Client
19
+
20
+ // I miss partial classes in C#
21
+ middlewares []Middleware
22
+ chainedHandler Handler
23
+ mwLock sync.RWMutex
15
24
}
16
25
17
26
func New (opts ... Option ) (* Client , error ) {
@@ -39,24 +48,31 @@ func New(opts ...Option) (*Client, error) {
39
48
},
40
49
},
41
50
}
51
+ cli .chainedHandler = cli .request
42
52
return cli , cli .Configure (opts ... )
43
53
}
44
54
45
55
func (c * Client ) CtxDo (
46
56
ctx context.Context , req * request.Request ,
47
57
) (func (), * response.Response , error ) {
48
- r , err := req .Build (ctx )
58
+ rctx := getRequestCtx (ctx )
59
+ rctx .Request = req
60
+ c .mwLock .RLock ()
61
+ call := c .chainedHandler
62
+ c .mwLock .RUnlock ()
63
+ return rctx .Done , rctx .Response , call (rctx )
64
+ }
65
+
66
+ func (c * Client ) request (rc * RequestCtx ) error {
67
+ r , err := rc .Request .Build (rc .Context )
49
68
if err != nil {
50
- return func () {}, nil , err
69
+ return err
51
70
}
52
71
resp , err := c .Client .Do (r )
53
72
if err != nil {
54
73
// on error, return a Response that won't be recovered
55
- return func () {}, response . Wrap ( resp ), err
74
+ return err
56
75
}
57
- ret := response .Wrap (resp )
58
- return func () {
59
- ret .Done ()
60
- request .PutRequest (r )
61
- }, ret , nil
76
+ rc .Response = response .Wrap (resp )
77
+ return nil
62
78
}
0 commit comments