| Index: chrome/common/extensions/docs/server2/url_fetcher.py
|
| diff --git a/chrome/common/extensions/docs/server2/url_fetcher.py b/chrome/common/extensions/docs/server2/url_fetcher.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9daa5fae553abe8e13370218623b3016784eaade
|
| --- /dev/null
|
| +++ b/chrome/common/extensions/docs/server2/url_fetcher.py
|
| @@ -0,0 +1,60 @@
|
| +# 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 posixpath
|
| +
|
| +from environment import GetAppVersion
|
| +from future import Future
|
| +from urllib import urlencode
|
| +from urlparse import urlparse, parse_qs
|
| +
|
| +def _MakeHeaders(headers={}):
|
| + headers['User-Agent'] = 'Chomium docserver %s' % GetAppVersion()
|
| + headers['Cache-Control'] = 'max-age=0'
|
| + return headers
|
| +
|
| +
|
| +def _AddQueryToUrl(url, new_query):
|
| + """Adds query paramters to a URL. This merges the given set of query params
|
| + with any that were already a part of the URL.
|
| + """
|
| + parsed_url = urlparse(url)
|
| + query = parse_qs(parsed_url.query)
|
| + query.update(new_query)
|
| + query_string = urlencode(query, True)
|
| + return '%s://%s%s?%s#%s' % (parsed_url.scheme, parsed_url.netloc,
|
| + parsed_url.path, query_string, parsed_url.fragment)
|
| +
|
| +
|
| +class UrlFetcher(object):
|
| + def __init__(self):
|
| + self._base_path = None
|
| +
|
| + def SetBasePath(self, base_path):
|
| + assert base_path is None or not base_path.endswith('/'), base_path
|
| + self._base_path = base_path
|
| +
|
| + def Fetch(self, url, headers={}, query={}):
|
| + return self.FetchImpl(_AddQueryToUrl(self._FromBasePath(url), query),
|
| + _MakeHeaders(headers))
|
| +
|
| + def FetchAsync(self, url, headers={}, query={}):
|
| + return self.FetchAsyncImpl(_AddQueryToUrl(self._FromBasePath(url), query),
|
| + _MakeHeaders(headers))
|
| +
|
| + def FetchImpl(self, url, headers):
|
| + """Fetches a URL synchronously.
|
| + """
|
| + raise NotImplementedError(self.__class__)
|
| +
|
| + def FetchAsyncImpl(self, url, headers):
|
| + """Fetches a URL asynchronously and returns a Future with the result.
|
| + """
|
| + raise NotImplementedError(self.__class__)
|
| +
|
| + def _FromBasePath(self, url):
|
| + assert not url.startswith('/'), url
|
| + if self._base_path is not None:
|
| + url = posixpath.join(self._base_path, url) if url else self._base_path
|
| + return url
|
|
|