send method
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;
}
}