| Index: third_party/google-endpoints/endpoints/discovery_api_proxy.py
|
| diff --git a/third_party/google-endpoints/endpoints/discovery_api_proxy.py b/third_party/google-endpoints/endpoints/discovery_api_proxy.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d698faf3ece73b23104c0f0388ab07045611be6a
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/endpoints/discovery_api_proxy.py
|
| @@ -0,0 +1,111 @@
|
| +# Copyright 2016 Google Inc. All Rights Reserved.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +"""Proxy that dispatches Discovery requests to the Discovery service."""
|
| +
|
| +# pylint: disable=g-bad-name
|
| +import httplib
|
| +import json
|
| +import logging
|
| +
|
| +
|
| +class DiscoveryApiProxy(object):
|
| + """Proxies discovery service requests to a known cloud endpoint."""
|
| +
|
| + # The endpoint host we're using to proxy discovery and static requests.
|
| + # Using separate constants to make it easier to change the discovery service.
|
| + _DISCOVERY_PROXY_HOST = 'webapis-discovery.appspot.com'
|
| + _STATIC_PROXY_HOST = 'webapis-discovery.appspot.com'
|
| + _DISCOVERY_API_PATH_PREFIX = '/_ah/api/discovery/v1/'
|
| +
|
| + def _dispatch_request(self, path, body):
|
| + """Proxies GET request to discovery service API.
|
| +
|
| + Args:
|
| + path: A string containing the URL path relative to discovery service.
|
| + body: A string containing the HTTP POST request body.
|
| +
|
| + Returns:
|
| + HTTP response body or None if it failed.
|
| + """
|
| + full_path = self._DISCOVERY_API_PATH_PREFIX + path
|
| + headers = {'Content-type': 'application/json'}
|
| + connection = httplib.HTTPSConnection(self._DISCOVERY_PROXY_HOST)
|
| + try:
|
| + connection.request('POST', full_path, body, headers)
|
| + response = connection.getresponse()
|
| + response_body = response.read()
|
| + if response.status != 200:
|
| + logging.error('Discovery API proxy failed on %s with %d.\r\n'
|
| + 'Request: %s\r\nResponse: %s',
|
| + full_path, response.status, body, response_body)
|
| + return None
|
| + return response_body
|
| + finally:
|
| + connection.close()
|
| +
|
| + def generate_discovery_doc(self, api_config, api_format):
|
| + """Generates a discovery document from an API file.
|
| +
|
| + Args:
|
| + api_config: A string containing the .api file contents.
|
| + api_format: A string, either 'rest' or 'rpc' depending on the which kind
|
| + of discvoery doc is requested.
|
| +
|
| + Returns:
|
| + The discovery doc as JSON string.
|
| +
|
| + Raises:
|
| + ValueError: When api_format is invalid.
|
| + """
|
| + if api_format not in ['rest', 'rpc']:
|
| + raise ValueError('Invalid API format')
|
| + path = 'apis/generate/' + api_format
|
| + request_dict = {'config': json.dumps(api_config)}
|
| + request_body = json.dumps(request_dict)
|
| + return self._dispatch_request(path, request_body)
|
| +
|
| + def generate_directory(self, api_configs):
|
| + """Generates an API directory from a list of API files.
|
| +
|
| + Args:
|
| + api_configs: A list of strings which are the .api file contents.
|
| +
|
| + Returns:
|
| + The API directory as JSON string.
|
| + """
|
| + request_dict = {'configs': api_configs}
|
| + request_body = json.dumps(request_dict)
|
| + return self._dispatch_request('apis/generate/directory', request_body)
|
| +
|
| + def get_static_file(self, path):
|
| + """Returns static content via a GET request.
|
| +
|
| + Args:
|
| + path: A string containing the URL path after the domain.
|
| +
|
| + Returns:
|
| + A tuple of (response, response_body):
|
| + response: A HTTPResponse object with the response from the static
|
| + proxy host.
|
| + response_body: A string containing the response body.
|
| + """
|
| + connection = httplib.HTTPSConnection(self._STATIC_PROXY_HOST)
|
| + try:
|
| + connection.request('GET', path, None, {})
|
| + response = connection.getresponse()
|
| + response_body = response.read()
|
| + finally:
|
| + connection.close()
|
| + return response, response_body
|
|
|