@@ -10,6 +10,7 @@ import (
1010 "net/http"
1111 "os"
1212 "path/filepath"
13+ "strconv"
1314 "time"
1415)
1516
@@ -440,17 +441,27 @@ func (z *Zendesk) DeleteAttachment(attachmentID int) (err error) {
440441 return nil
441442}
442443
443- type BasicAuthTransport struct {
444+ type ZendeskAuthTransport struct {
444445 Username string
445446 Password string
446447}
447448
448- func (bat BasicAuthTransport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
449- req .SetBasicAuth (bat .Username , bat .Password )
449+ func (z ZendeskAuthTransport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
450+ req .SetBasicAuth (z .Username , z .Password )
450451
451- return http .DefaultTransport .RoundTrip (req )
452+ res , err := http .DefaultTransport .RoundTrip (req )
453+ if res .StatusCode == 429 {
454+ // we hit the rate limit, wait for the suggested seconds and retry
455+ if waitFor , castErr := strconv .Atoi (res .Header .Get ("Retry-After" )); castErr == nil {
456+ Log .Warnf ("Rate limited: wait for %d seconds" , waitFor )
457+
458+ time .Sleep (time .Duration (waitFor ) * time .Second )
459+ return http .DefaultTransport .RoundTrip (req )
460+ }
461+ }
462+ return res , err
452463}
453464
454- func (bat * BasicAuthTransport ) Client () * http.Client {
455- return & http.Client {Transport : bat }
465+ func (z * ZendeskAuthTransport ) Client () * http.Client {
466+ return & http.Client {Transport : z }
456467}
0 commit comments