Skip to content

Commit c1fa949

Browse files
authored
Fix regression on fetching the remote address of a closed socket. (#664)
* Fix regression on fetching the remote address of a closed socket * Changes as per review * Add changelog entry * Rev version for publish
1 parent dae290c commit c1fa949

File tree

3 files changed

+38
-23
lines changed

3 files changed

+38
-23
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
## 3.2.4-wip
1+
## 3.2.4
22

33
* Forward internal `GrpcError` on when throwing while sending a request.
44
* Add support for proxies, see [#33](https://github.com/grpc/grpc-dart/issues/33).
55
* Remove canceled `ServerHandler`s from tracking list.
6+
* Fix regression on fetching the remote address of a closed socket.
67

78
## 3.2.3
89

lib/src/server/server.dart

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: grpc
22
description: Dart implementation of gRPC, a high performance, open-source universal RPC framework.
3-
version: 3.2.4-wip
3+
version: 3.2.4
44

55
repository: https://github.com/grpc/grpc-dart
66

0 commit comments

Comments
 (0)