forked from go-packages/paypal
Locking SendWithAuth to fix race condition
When SendWithAuth gets called in a multithreaded environment on the same Client object, a concurrent read and write of c.Token might happen in GetAccessToken. This patch solves the issue by locking the client while we get a new access token in SendWithAuth.
This commit is contained in:
parent
7a8d9e5531
commit
bb976e776e
|
@ -125,10 +125,12 @@ func (c *Client) Send(req *http.Request, v interface{}) error {
|
|||
// making the main request
|
||||
// client.Token will be updated when changed
|
||||
func (c *Client) SendWithAuth(req *http.Request, v interface{}) error {
|
||||
c.Lock()
|
||||
if c.Token != nil {
|
||||
if !c.tokenExpiresAt.IsZero() && c.tokenExpiresAt.Sub(time.Now()) < RequestNewTokenBeforeExpiresIn {
|
||||
// c.Token will be updated in GetAccessToken call
|
||||
if _, err := c.GetAccessToken(); err != nil {
|
||||
c.Unlock()
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -136,6 +138,7 @@ func (c *Client) SendWithAuth(req *http.Request, v interface{}) error {
|
|||
req.Header.Set("Authorization", "Bearer "+c.Token.Token)
|
||||
}
|
||||
|
||||
c.Unlock()
|
||||
return c.Send(req, v)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user