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<StreamedResponse> send(BaseRequest request) async {
  try {
    final response = await client.requestStream(
      method: HttpMethod(request.method.toUpperCase()),
      url: request.url.toString(),
      headers: HttpHeaders.rawMap(request.headers),
      body: HttpBody.bytes(await request.finalize().toBytes()),
    );

    final responseHeaderMap = response.headerMap;

    return StreamedResponse(
      response.body,
      response.statusCode,
      contentLength: switch (responseHeaderMap['content-length']) {
        String s => int.parse(s),
        null => null,
      },
      request: request,
      headers: responseHeaderMap,
      isRedirect: false,

      // TODO
      persistentConnection: true,

      // TODO: Is this even relevant nowadays?
      reasonPhrase: null,
    );
  } on RhttpException catch (e, st) {
    Error.throwWithStackTrace(
      RhttpWrappedClientException(e.toString(), request.url, e),
      st,
    );
  } catch (e, st) {
    Error.throwWithStackTrace(
      ClientException(e.toString(), request.url),
      st,
    );
  }
}