@@ -241,28 +241,33 @@ class Server extends ConnectionServer {
241241 bool requireClientCertificate = false ,
242242 }) async {
243243 // TODO(dart-lang/grpc-dart#9): Handle HTTP/1.1 upgrade to h2c, if allowed.
244- Stream <Socket >? server;
244+ Stream <Socket > server;
245245 final securityContext = security? .securityContext;
246246 if (securityContext != null ) {
247- _secureServer = await SecureServerSocket .bind (
248- address ?? InternetAddress .anyIPv4, port ?? 443 , securityContext,
249- backlog: backlog,
250- shared: shared,
251- v6Only: v6Only,
252- requestClientCertificate: requestClientCertificate,
253- requireClientCertificate: requireClientCertificate);
254- server = _secureServer;
247+ final _server = await SecureServerSocket .bind (
248+ address ?? InternetAddress .anyIPv4,
249+ port ?? 443 ,
250+ securityContext,
251+ backlog: backlog,
252+ shared: shared,
253+ v6Only: v6Only,
254+ requestClientCertificate: requestClientCertificate,
255+ requireClientCertificate: requireClientCertificate,
256+ );
257+ _secureServer = _server;
258+ server = _server;
255259 } else {
256- _insecureServer = await ServerSocket .bind (
260+ final _server = await ServerSocket .bind (
257261 address ?? InternetAddress .anyIPv4,
258262 port ?? 80 ,
259263 backlog: backlog,
260264 shared: shared,
261265 v6Only: v6Only,
262266 );
263- server = _insecureServer;
267+ _insecureServer = _server;
268+ server = _server;
264269 }
265- server! .listen ((socket) {
270+ server.listen ((socket) {
266271 // Don't wait for io buffers to fill up before sending requests.
267272 if (socket.address.type != InternetAddressType .unix) {
268273 socket.setOption (SocketOption .tcpNoDelay, true );
@@ -282,7 +287,7 @@ class Server extends ConnectionServer {
282287 serveConnection (
283288 connection: connection,
284289 clientCertificate: clientCertificate,
285- remoteAddress: socket.remoteAddress ,
290+ remoteAddress: socket.remoteAddressOrNull ,
286291 );
287292 }, onError: (error, stackTrace) {
288293 if (error is Error ) {
@@ -320,15 +325,24 @@ class Server extends ConnectionServer {
320325 }
321326
322327 Future <void > shutdown () async {
323- final done = _connections.map ((connection) => connection.finish ()).toList ();
324- if (_insecureServer != null ) {
325- done.add (_insecureServer! .close ());
326- }
327- if (_secureServer != null ) {
328- done.add (_secureServer! .close ());
329- }
330- await Future .wait (done);
328+ await Future .wait ([
329+ for (var connection in _connections) connection.finish (),
330+ if (_insecureServer != null ) _insecureServer! .close (),
331+ if (_secureServer != null ) _secureServer! .close (),
332+ ]);
331333 _insecureServer = null ;
332334 _secureServer = null ;
333335 }
334336}
337+
338+ extension on Socket {
339+ InternetAddress ? get remoteAddressOrNull {
340+ try {
341+ // Using a try-catch control flow as dart:io Sockets don't expose their
342+ // connectivity state.
343+ return remoteAddress;
344+ } on Exception catch (_) {
345+ return null ;
346+ }
347+ }
348+ }
0 commit comments