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 {
  try {
    // Logging disabled for security
    // _logRequest(request);

    // Ensure reasonable defaults; headers from caller can override
    request.headers.putIfAbsent('Content-Type', () => 'application/json');
    request.headers.putIfAbsent('Accept', () => 'application/json');

    final response = await _client.send(request).timeout(const Duration(seconds: 60));

    // Read the original stream ONCE, then return a NEW stream with the same bytes
    // Logging disabled for security
    final bytes = await response.stream.toBytes();
    // _logResponseSnapshot(response, bytes);

    final clonedStream = Stream<Uint8List>.fromIterable([bytes]);
    return http.StreamedResponse(
      clonedStream,
      response.statusCode,
      contentLength: response.contentLength,
      request: response.request,
      headers: response.headers,
      reasonPhrase: response.reasonPhrase,
    );
  } catch (error) {
    // Logging disabled for security
    // _logError(request, error);
    rethrow;
  }
}