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 {
final requestCreatedAt = DateTime.now().millisecondsSinceEpoch;
final requestDateTime = DateTime.now();
// Intercept and modify the request
_onRequest(request);
try {
// Send the request
final response = await httpClient.send(request);
// Calculate request duration
final now = DateTime.now().millisecondsSinceEpoch;
final duration = (now - requestCreatedAt) / 1000.0;
// Intercept and process the response
_onResponse(request, response, requestDateTime, duration);
return response;
} catch (error, stackTrace) {
// Calculate request duration
final now = DateTime.now().millisecondsSinceEpoch;
final duration = (now - requestCreatedAt) / 1000.0;
// Intercept and handle errors
_onError(request, error, stackTrace, requestDateTime, duration);
rethrow; // Re-throw the error after handling it
}
}