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 startTime = DateTime.now();
  http.StreamedResponse response;
  Object? requestBody;
  if (request is http.Request) {
    requestBody = request.body;
  }
  try {
    response = await _inner.send(request);
    final endTime = DateTime.now();
    final duration = endTime.difference(startTime);
    final responseBody = await http.Response.fromStream(response);
    _logApiCall(
      heading: '[${request.method}] ${request.url}',
      content: responseBody.body,
      method: request.method,
      url: request.url.toString(),
      headers: request.headers,
      body: requestBody,
      statusCode: responseBody.statusCode,
      timings: duration,
    );
    // Return a new stream because we've consumed the original one
    return http.StreamedResponse(
      http.ByteStream.fromBytes(responseBody.bodyBytes),
      responseBody.statusCode,
      headers: response.headers,
      contentLength: responseBody.contentLength,
      isRedirect: response.isRedirect,
      persistentConnection: response.persistentConnection,
      reasonPhrase: response.reasonPhrase,
      request: response.request,
    );
  } catch (e) {
    final endTime = DateTime.now();
    final duration = endTime.difference(startTime);
    _logApiCall(
      heading: '[${request.method}] ${request.url}',
      content: e.toString(),
      method: request.method,
      url: request.url.toString(),
      headers: request.headers,
      body: requestBody,
      statusCode: null,
      timings: duration,
    );
    rethrow;
  }
}