stream method

  1. @override
Stream<String> stream(
  1. AiHttpRequest request
)
override

Sends a request and yields decoded text chunks as they arrive.

Implementations should throw AiHttpException for non-success responses when a streaming request cannot continue.

Implementation

@override
Stream<String> stream(AiHttpRequest request) async* {
  final client = HttpClient();
  try {
    final req = await client
        .openUrl(request.method.toUpperCase(), request.uri)
        .timeout(timeout);

    request.headers.forEach(req.headers.set);

    final body = request.body;
    if (body != null) {
      if (body is List<int>) {
        req.add(body);
      } else {
        req.write(body.toString());
      }
    }

    final response = await req.close().timeout(timeout);
    if (response.statusCode < 200 || response.statusCode >= 300) {
      final responseBody = await utf8.decoder.bind(response).join();
      throw AiHttpException(
        'Streaming request failed with status ${response.statusCode}: '
        '$responseBody',
      );
    }

    yield* utf8.decoder.bind(response);
  } on SocketException catch (error) {
    throw AiHttpException('Network stream failed', cause: error);
  } on TimeoutException catch (error) {
    throw AiHttpException('HTTP stream timed out', cause: error);
  } finally {
    client.close(force: true);
  }
}