send method

  1. @override
Future<StreamedResponse> send(
  1. BaseRequest request
)

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,
  );
}