diff --git a/binderhub/repoproviders.py b/binderhub/repoproviders.py index f8f3d0465..8690c4c57 100644 --- a/binderhub/repoproviders.py +++ b/binderhub/repoproviders.py @@ -593,6 +593,7 @@ def github_api_request(self, api_url, etag=None): elif ( e.code == 403 and e.response + and 'x-ratelimit-remaining' in e.response.headers and e.response.headers.get('x-ratelimit-remaining') == '0' ): rate_limit = e.response.headers['x-ratelimit-limit'] @@ -617,28 +618,30 @@ def github_api_request(self, api_url, etag=None): else: raise - # record and log github rate limit - remaining = int(resp.headers['x-ratelimit-remaining']) - rate_limit = int(resp.headers['x-ratelimit-limit']) - reset_timestamp = int(resp.headers['x-ratelimit-reset']) - - # record with prometheus - GITHUB_RATE_LIMIT.set(remaining) - - # log at different levels, depending on remaining fraction - fraction = remaining / rate_limit - if fraction < 0.2: - log = self.log.warning - elif fraction < 0.5: - log = self.log.info - else: - log = self.log.debug - - # str(timedelta) looks like '00:32' - delta = timedelta(seconds=int(reset_timestamp - time.time())) - log("GitHub rate limit remaining {remaining}/{limit}. Reset in {delta}.".format( - remaining=remaining, limit=rate_limit, delta=delta, - )) + if 'x-ratelimit-remaining' in resp.headers: + # record and log github rate limit + remaining = int(resp.headers['x-ratelimit-remaining']) + rate_limit = int(resp.headers['x-ratelimit-limit']) + reset_timestamp = int(resp.headers['x-ratelimit-reset']) + + # record with prometheus + GITHUB_RATE_LIMIT.set(remaining) + + # log at different levels, depending on remaining fraction + fraction = remaining / rate_limit + if fraction < 0.2: + log = self.log.warning + elif fraction < 0.5: + log = self.log.info + else: + log = self.log.debug + + # str(timedelta) looks like '00:32' + delta = timedelta(seconds=int(reset_timestamp - time.time())) + log("GitHub rate limit remaining {remaining}/{limit}. Reset in {delta}.".format( + remaining=remaining, limit=rate_limit, delta=delta, + )) + return resp @gen.coroutine