start method
Implementation
Future<void> start() async {
print('${_client.toString()} , ${_client.hashCode}');
if (_controller.isClosed) {
logDebug('Stream controller closed.');
return;
}
// reset status, and cancel existing subscription
_resetState();
_subscription?.cancel();
logDebug('Starting connection to [$uri].');
try {
final request = Request('GET', Uri.parse(uri));
final response = await _client.send(request).timeout(timeout);
if (_controller.isClosed) {
logDebug('Stream controller closed before response handling.');
return;
}
if (response.statusCode >= 200 && response.statusCode < 300) {
logDebug('Connected $uri - (status code: ${response.statusCode})');
_subscription = response.stream.listen(
_handleChunk,
onDone: () {
logDebug('Done received.');
stop(closeController: true);
},
onError: (e, s) {
logDebug('Error received - (error: $e)');
_controller.addError(e, s);
stop(closeController: true);
},
cancelOnError: true, // auto cancel on error
);
} else {
logDebug(
'Connection failed $uri - (status code: ${response.statusCode})',
);
if (!_controller.isClosed) {
final error = HttpException(
'Connection failed $uri - (status code: ${response.statusCode})',
uri: Uri.parse(uri),
);
_controller.addError(error, StackTrace.current);
}
stop(closeController: true);
}
} catch (e, s) {
logDebug('Exception during connection - $e');
if (!_controller.isClosed) {
_controller.addError(e, s);
}
stop(closeController: true);
}
}