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 {
bool enabled = DebugOverlay.enabled;
try {
var effectiveRequest = request;
if (enabled) {
var requestBody = await request.finalize().toBytes();
httpBucket.add(HttpInteraction(
id: request.hashCode,
uri: request.url,
method: request.method,
request: convertRequest(request, requestBody),
));
effectiveRequest =
_copyRequest(request, http.ByteStream.fromBytes(requestBody));
}
http.StreamedResponse response = await _inner.send(effectiveRequest);
if (enabled) {
var responseBody = await response.stream.toBytes();
httpBucket.addResponse(
request.hashCode,
convertResponse(response, responseBody),
);
return _copyResponse(response, http.ByteStream.fromBytes(responseBody));
}
return response;
} catch (e, stack) {
if (enabled) {
httpBucket.addError(request.hashCode, convertError(e, stack));
}
rethrow;
}
}