send method

  1. @override
Future<StreamedResponse> send(
  1. BaseRequest request
)

Sends an HTTP request and asynchronously returns the response.

Implementers should call BaseRequest.finalize to get the body of the request as a ByteStream. They shouldn't make any assumptions about the state of the stream; it could have data written to it asynchronously at a later point, or it could already be closed when it's returned. Any internal HTTP errors should be wrapped as ClientExceptions.

Implementation

@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
  final client = _oAuthClient ?? _httpClient;

  http.StreamedResponse response;
  try {
    response = await client.send(request);

    if (response.statusCode == 401) {
      _logger('401 response received, trying to refresh credentials');
      await refresh();

      final secondResponse = await client.send(copyRequest(request));
      if (secondResponse.statusCode == 401) {
        throw oauth2.AuthorizationException('Unauthorized', '', request.url);
      } else {
        return secondResponse;
      }
    }
  } on oauth2.AuthorizationException {
    await _logOutInternal();
    _logger(
      'An error while sending a request occured, '
      'successfully logged out and cleared credentials.',
    );
    rethrow;
  }

  return response;
}