@@ -241,28 +241,33 @@ class Server extends ConnectionServer {
241
241
bool requireClientCertificate = false ,
242
242
}) async {
243
243
// TODO(dart-lang/grpc-dart#9): Handle HTTP/1.1 upgrade to h2c, if allowed.
244
- Stream <Socket >? server;
244
+ Stream <Socket > server;
245
245
final securityContext = security? .securityContext;
246
246
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;
255
259
} else {
256
- _insecureServer = await ServerSocket .bind (
260
+ final _server = await ServerSocket .bind (
257
261
address ?? InternetAddress .anyIPv4,
258
262
port ?? 80 ,
259
263
backlog: backlog,
260
264
shared: shared,
261
265
v6Only: v6Only,
262
266
);
263
- server = _insecureServer;
267
+ _insecureServer = _server;
268
+ server = _server;
264
269
}
265
- server! .listen ((socket) {
270
+ server.listen ((socket) {
266
271
// Don't wait for io buffers to fill up before sending requests.
267
272
if (socket.address.type != InternetAddressType .unix) {
268
273
socket.setOption (SocketOption .tcpNoDelay, true );
@@ -282,7 +287,7 @@ class Server extends ConnectionServer {
282
287
serveConnection (
283
288
connection: connection,
284
289
clientCertificate: clientCertificate,
285
- remoteAddress: socket.remoteAddress ,
290
+ remoteAddress: socket.remoteAddressOrNull ,
286
291
);
287
292
}, onError: (error, stackTrace) {
288
293
if (error is Error ) {
@@ -320,15 +325,24 @@ class Server extends ConnectionServer {
320
325
}
321
326
322
327
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
+ ]);
331
333
_insecureServer = null ;
332
334
_secureServer = null ;
333
335
}
334
336
}
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