Skip to content

Commit 3f8bf40

Browse files
committed
Returns structured rate limit error.
1 parent 4ff8627 commit 3f8bf40

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

dropbox/dropbox.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
import requests
1818

1919
from . import stone_serializers
20-
from .auth import AuthError_validator
20+
from .auth import (
21+
AuthError_validator,
22+
RateLimitError_validator,
23+
)
2124
from .base import DropboxBase
2225
from .base_team import DropboxTeamBase
2326
from .exceptions import (
@@ -382,10 +385,18 @@ def request_json_string(self,
382385
AuthError_validator, r.json()['error'])
383386
raise AuthError(request_id, err)
384387
elif r.status_code == 429:
385-
retry_after = r.headers.get('retry-after')
386-
if retry_after is not None:
387-
retry_after = int(retry_after)
388-
raise RateLimitError(request_id, retry_after)
388+
err = None
389+
if r.headers.get('content-type') == 'application/json':
390+
err = stone_serializers.json_compat_obj_decode(
391+
RateLimitError_validator, r.json()['error'])
392+
retry_after = err.retry_after
393+
else:
394+
retry_after_str = r.headers.get('retry-after')
395+
if retry_after_str is not None:
396+
retry_after = int(retry_after_str)
397+
else:
398+
retry_after = None
399+
raise RateLimitError(request_id, err, retry_after)
389400
elif 200 <= r.status_code <= 299:
390401
if route_style == self._ROUTE_STYLE_DOWNLOAD:
391402
raw_resp = r.headers['dropbox-api-result']

dropbox/exceptions.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ def __repr__(self):
7171
class RateLimitError(HttpError):
7272
"""Error caused by rate limiting."""
7373

74-
def __init__(self, request_id, backoff=None):
74+
def __init__(self, request_id, error=None, backoff=None):
7575
super(RateLimitError, self).__init__(request_id, 429, None)
76+
self.error = error
7677
self.backoff = backoff
7778

7879
def __repr__(self):
79-
return 'RateLimitError({!r}, {!r})'.format(self.request_id, self.backoff)
80+
return 'RateLimitError({!r}, {!r}, {!r})'.format(
81+
self.request_id, self.error, self.backoff)
8082

8183

8284
class InternalServerError(HttpError):

0 commit comments

Comments
 (0)