serve method
Starts the Server with the given options.
address
can be either a String or an InternetAddress, in the latter
case it can be a Unix Domain Socket address.
If port
is null
then it defaults to 80
for non-secure and 443
for
secure variants. Pass 0
for port
to let OS select a port for the
server.
Implementation
Future<void> serve({
dynamic address,
int? port,
ServerCredentials? security,
ServerSettings? http2ServerSettings,
int backlog = 0,
bool v6Only = false,
bool shared = false,
bool requestClientCertificate = false,
bool requireClientCertificate = false,
}) async {
// TODO(dart-lang/grpc-dart#9): Handle HTTP/1.1 upgrade to h2c, if allowed.
Stream<Socket> server;
final securityContext = security?.securityContext;
if (securityContext != null) {
final _server = await SecureServerSocket.bind(
address ?? InternetAddress.anyIPv4,
port ?? 443,
securityContext,
backlog: backlog,
shared: shared,
v6Only: v6Only,
requestClientCertificate: requestClientCertificate,
requireClientCertificate: requireClientCertificate,
);
_secureServer = _server;
server = _server;
} else {
final _server = await ServerSocket.bind(
address ?? InternetAddress.anyIPv4,
port ?? 80,
backlog: backlog,
shared: shared,
v6Only: v6Only,
);
_insecureServer = _server;
server = _server;
}
server.listen((socket) {
// Don't wait for io buffers to fill up before sending requests.
if (socket.address.type != InternetAddressType.unix) {
socket.setOption(SocketOption.tcpNoDelay, true);
}
X509Certificate? clientCertificate;
if (socket is SecureSocket) {
clientCertificate = socket.peerCertificate;
}
final connection = ServerTransportConnection.viaSocket(
socket,
settings: http2ServerSettings,
);
serveConnection(
connection: connection,
clientCertificate: clientCertificate,
remoteAddress: socket.remoteAddressOrNull,
);
}, onError: (error, stackTrace) {
if (error is Error) {
Zone.current.handleUncaughtError(error, stackTrace);
}
});
}