in src/google/appengine/api/urlfetch.py [0:0]
def _get_fetch_result(rpc):
"""Checks for success, handles exceptions, and returns a converted RPC result.
This method waits for the `rpc` if it has not yet finished and calls the
post-call hooks on the first invocation.
Args:
rpc: A `UserRPC` object.
Raises:
InvalidURLError: If the URL was invalid.
DownloadError: If there was a problem fetching the URL.
PayloadTooLargeError: If the request and its payload was larger than the
allowed limit.
ResponseTooLargeError: If the response was either truncated (and
`allow_truncated=False` was passed to `make_fetch_call()`), or if it
was too big for us to download.
MalformedReplyError: If an invalid `HTTP` response was returned.
TooManyRedirectsError: If the redirect limit was hit while `follow_rediects`
was set to `True`.
InternalTransientError: An internal error occurred. Wait a few minutes, then
try again.
ConnectionClosedError: If the target server prematurely closed the
connection.
DNSLookupFailedError: If the `DNS` lookup for the URL failed.
DeadlineExceededError: If the deadline was exceeded; occurs when the
client-supplied `deadline` is invalid or if the client did not specify a
`deadline` and the system default value is invalid.
SSLCertificateError: If an invalid server certificate was presented.
AssertionError: If the `assert` statement fails.
Returns:
A `_URLFetchResult` object.
"""
assert rpc.service == 'urlfetch', repr(rpc.service)
assert rpc.method == 'Fetch', repr(rpc.method)
url = rpc.request.Url
try:
rpc.check_success()
except apiproxy_errors.RequestTooLargeError as err:
raise InvalidURLError(
'Request body too large fetching URL: ' + url)
except apiproxy_errors.ApplicationError as err:
error_detail = ''
if err.error_detail:
error_detail = ' Error: ' + err.error_detail
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.INVALID_URL):
raise InvalidURLError(
'Invalid request URL: ' + url + error_detail)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.PAYLOAD_TOO_LARGE):
raise PayloadTooLargeError(
'Request exceeds 10 MiB limit for URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.CLOSED):
raise ConnectionClosedError(
'Connection closed unexpectedly by server at URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.TOO_MANY_REDIRECTS):
raise TooManyRedirectsError(
'Too many redirects at URL: ' + url + ' with redirect=true')
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.MALFORMED_REPLY):
raise MalformedReplyError(
'Malformed HTTP reply received from server at URL: '
+ url + error_detail)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.INTERNAL_TRANSIENT_ERROR):
raise InternalTransientError(
'Temporary error in fetching URL: ' + url + ', please re-try')
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.DNS_ERROR):
raise DNSLookupFailedError('DNS lookup failed for URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.UNSPECIFIED_ERROR):
raise DownloadError('Unspecified error in fetching URL: '
+ url + error_detail)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.FETCH_ERROR):
raise DownloadError("Unable to fetch URL: " + url + error_detail)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.RESPONSE_TOO_LARGE):
raise ResponseTooLargeError('HTTP response too large from URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.DEADLINE_EXCEEDED):
raise DeadlineExceededError(
'Deadline exceeded while waiting for HTTP response from URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.SSL_CERTIFICATE_ERROR):
raise SSLCertificateError(
'Invalid and/or missing SSL certificate for URL: ' + url)
if (err.application_error ==
urlfetch_service_pb2.URLFetchServiceError.CONNECTION_ERROR):
raise DownloadError('Unable to connect to server at URL: ' + url)
raise err
response = rpc.response
allow_truncated = rpc.user_data
result = _URLFetchResult(response)
if response.ContentWasTruncated and not allow_truncated:
raise ResponseTooLargeError(result)
return result