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 ClientException
s.
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;
}
}