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 {
if (_closed) throw StateError('AuthTestHttpClient is closed');
final bytes = await request.finalize().toBytes();
final captured = AuthTestHttpRequest(
method: request.method.toUpperCase(),
uri: request.url,
headers: Map<String, String>.unmodifiable(request.headers),
body: utf8.decode(bytes),
);
_requests.add(captured);
AuthTestHttpResponder? responder;
if (_steps.isNotEmpty) {
final step = _steps.removeFirst();
if (step.method != captured.method ||
step.path != _normalizePath(captured.uri.path)) {
throw StateError(
'Expected ${step.method} ${step.path}, got '
'${captured.method} ${captured.uri.path}',
);
}
responder = step.responder;
} else {
responder = _fallback;
}
if (responder == null) {
throw StateError(
'No auth test response for ${captured.method} ${captured.uri.path}',
);
}
final response = await responder(captured);
return http.StreamedResponse(
Stream<List<int>>.value(utf8.encode(response.body)),
response.statusCode,
headers: response.headers,
request: request,
);
}