serveConnection method
Future<void>
serveConnection({
- required ServerTransportConnection connection,
- X509Certificate? clientCertificate,
- InternetAddress? remoteAddress,
Implementation
Future<void> serveConnection({
required ServerTransportConnection connection,
X509Certificate? clientCertificate,
InternetAddress? remoteAddress,
}) async {
_connections.add(connection);
handlers[connection] = [];
// TODO(jakobr): Set active state handlers, close connection after idle
// timeout.
final onDataReceivedController = StreamController<void>();
ServerKeepAlive(
options: _keepAliveOptions,
tooManyBadPings: () async =>
await connection.terminate(ErrorCode.ENHANCE_YOUR_CALM),
pingNotifier: connection.onPingReceived,
dataNotifier: onDataReceivedController.stream,
).handle();
connection.incomingStreams.listen((stream) {
final handler = serveStream_(
stream: stream,
clientCertificate: clientCertificate,
remoteAddress: remoteAddress,
onDataReceived: onDataReceivedController.sink,
);
handler.onCanceled.then((_) => handlers[connection]?.remove(handler));
handlers[connection]!.add(handler);
}, onError: (error, stackTrace) {
if (error is Error) {
Zone.current.handleUncaughtError(error, stackTrace);
}
}, onDone: () async {
// TODO(sigurdm): This is not correct behavior in the presence of
// half-closed tcp streams.
// Half-closed streams seems to not be fully supported by package:http2.
// https://github.com/dart-lang/http2/issues/42
for (var handler in handlers[connection]!) {
handler.cancel();
}
_connections.remove(connection);
handlers.remove(connection);
await onDataReceivedController.close();
});
}