From 7bbdab5f7492343fd26193a5c4aba7dfc4755f7c Mon Sep 17 00:00:00 2001 From: KASHIMA Hiroaki Date: Mon, 8 Jun 2020 16:22:52 +0900 Subject: [PATCH] receive "x-ms-retry-after-ms" field on error 429 --- client.go | 15 ++++++++++++++- request.go | 12 ++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/client.go b/client.go index 3131aec..238e929 100644 --- a/client.go +++ b/client.go @@ -4,6 +4,8 @@ import ( "bytes" "io" "net/http" + "strconv" + "time" ) type Clienter interface { @@ -146,7 +148,18 @@ func (c *Client) do(r *Request, validator statusCodeValidatorFunc, data interfac return nil, err } if !validator(resp.StatusCode) { - err = &RequestError{} + if resp.StatusCode == 429 { + retry := resp.Header.Get("x-ms-retry-after-ms") + val, _ := strconv.Atoi(retry) + if val == 0 { + val = 100 + } + err = &RequestError429{ + Retry: time.Duration(val) * time.Millisecond, + } + } else { + err = &RequestError{} + } readJson(resp.Body, &err) return nil, err } diff --git a/request.go b/request.go index 322864e..8e0c60a 100644 --- a/request.go +++ b/request.go @@ -46,6 +46,18 @@ func (e RequestError) Error() string { return fmt.Sprintf("%v, %v", e.Code, e.Message) } +// Request Error +type RequestError429 struct { + Code string `json:"code"` + Message string `json:"message"` + Retry time.Duration +} + +// Implement Error function +func (e RequestError429) Error() string { + return fmt.Sprintf("%v, retry after %v", e.Code, e.Retry) +} + // Resource Request type Request struct { rId, rType string