stream method
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);
}
}