| Index: chrome/common/extensions/docs/server2/url_fetcher_appengine.py
|
| diff --git a/chrome/common/extensions/docs/server2/url_fetcher_appengine.py b/chrome/common/extensions/docs/server2/url_fetcher_appengine.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5080aeb3f930b9b874b2bf978ec4088ff9813f4
|
| --- /dev/null
|
| +++ b/chrome/common/extensions/docs/server2/url_fetcher_appengine.py
|
| @@ -0,0 +1,43 @@
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import google.appengine.api.urlfetch as urlfetch
|
| +import logging
|
| +import time
|
| +import traceback
|
| +
|
| +from future import Future
|
| +from url_fetcher import UrlFetcher
|
| +
|
| +
|
| +_MAX_RETRIES = 5
|
| +_RETRY_DELAY_SECONDS = 30
|
| +
|
| +
|
| +class UrlFetcherAppengine(UrlFetcher):
|
| + """An implementation of UrlFetcher which uses the GAE urlfetch API to
|
| + execute URL fetches.
|
| + """
|
| + def __init__(self):
|
| + self._retries_left = _MAX_RETRIES
|
| +
|
| + def FetchImpl(self, url, headers):
|
| + return urlfetch.fetch(url, deadline=20, headers=headers)
|
| +
|
| + def FetchAsyncImpl(self, url, headers):
|
| + def process_result(result):
|
| + if result.status_code == 429:
|
| + if self._retries_left == 0:
|
| + logging.error('Still throttled. Giving up.')
|
| + return result
|
| + self._retries_left -= 1
|
| + logging.info('Throttled. Trying again in %s seconds.' %
|
| + _RETRY_DELAY_SECONDS)
|
| + time.sleep(_RETRY_DELAY_SECONDS)
|
| + return self.FetchAsync(url, username, password, access_token).Get()
|
| + return result
|
| +
|
| + rpc = urlfetch.create_rpc(deadline=20)
|
| + urlfetch.make_fetch_call(rpc, url, headers=headers)
|
| + return Future(callback=lambda: process_result(rpc.get_result()))
|
|
|