mirror of https://github.com/grpc/grpc-dart.git
Prevent an exception to be thrown when a web connection stream is closed (#414)
This commit is contained in:
parent
ed960c26c6
commit
93c21feb56
|
|
@ -59,7 +59,7 @@ class XhrTransportStream implements GrpcTransportStream {
|
||||||
.listen((data) => _request.send(data), cancelOnError: true);
|
.listen((data) => _request.send(data), cancelOnError: true);
|
||||||
|
|
||||||
_request.onReadyStateChange.listen((data) {
|
_request.onReadyStateChange.listen((data) {
|
||||||
if (_incomingMessages.isClosed) {
|
if (_incomingProcessor.isClosed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (_request.readyState) {
|
switch (_request.readyState) {
|
||||||
|
|
@ -80,7 +80,7 @@ class XhrTransportStream implements GrpcTransportStream {
|
||||||
});
|
});
|
||||||
|
|
||||||
_request.onError.listen((ProgressEvent event) {
|
_request.onError.listen((ProgressEvent event) {
|
||||||
if (_incomingMessages.isClosed) {
|
if (_incomingProcessor.isClosed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_onError(GrpcError.unavailable('XhrConnection connection-error'),
|
_onError(GrpcError.unavailable('XhrConnection connection-error'),
|
||||||
|
|
@ -89,7 +89,7 @@ class XhrTransportStream implements GrpcTransportStream {
|
||||||
});
|
});
|
||||||
|
|
||||||
_request.onProgress.listen((_) {
|
_request.onProgress.listen((_) {
|
||||||
if (_incomingMessages.isClosed) {
|
if (_incomingProcessor.isClosed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Use response over responseText as most browsers don't support
|
// Use response over responseText as most browsers don't support
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,28 @@ void main() {
|
||||||
terminated = true;
|
terminated = true;
|
||||||
await channel.terminate();
|
await channel.terminate();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Verify that stream cancellation does not cause an exception
|
||||||
|
test("stream cancellation works", () async {
|
||||||
|
final channel = GrpcWebClientChannel.xhr(server.uri);
|
||||||
|
final service = EchoServiceClient(channel);
|
||||||
|
|
||||||
|
const testMessage = 'hello from gRPC-web';
|
||||||
|
|
||||||
|
final stream = service
|
||||||
|
.serverStreamingEcho(ServerStreamingEchoRequest()
|
||||||
|
..message = testMessage
|
||||||
|
..messageCount = 20
|
||||||
|
..messageInterval = 100)
|
||||||
|
.listen((response) {
|
||||||
|
expect(response.message, equals(testMessage));
|
||||||
|
});
|
||||||
|
|
||||||
|
await Future.delayed(Duration(milliseconds: 500));
|
||||||
|
await stream.cancel();
|
||||||
|
|
||||||
|
await channel.terminate();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class GrpcWebServer {
|
class GrpcWebServer {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue