From 98ff843751e5d824432c158d38b1e902cb7cc8d8 Mon Sep 17 00:00:00 2001 From: Koichi Ishida Date: Mon, 20 Jul 2020 23:11:19 +0900 Subject: [PATCH] Decode gRPC error message (#326) --- lib/src/client/call.dart | 8 ++++++-- test/client_tests/client_test.dart | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/src/client/call.dart b/lib/src/client/call.dart index 267f95b..b30eb88 100644 --- a/lib/src/client/call.dart +++ b/lib/src/client/call.dart @@ -242,7 +242,9 @@ class ClientCall implements Response { // TODO(jakobr): Parse more! if (metadata.containsKey('grpc-status')) { final status = int.parse(metadata['grpc-status']); - final message = metadata['grpc-message']; + final message = metadata['grpc-message'] == null + ? null + : Uri.decodeFull(metadata['grpc-message']); if (status != 0) { _responseError(GrpcError.custom(status, message)); } @@ -283,7 +285,9 @@ class ClientCall implements Response { // If status code is missing, we must treat it as '0'. As in 'success'. final statusCode = status != null ? int.parse(status) : 0; if (statusCode != 0) { - final message = _headerMetadata['grpc-message']; + final message = _headerMetadata['grpc-message'] == null + ? null + : Uri.decodeFull(_headerMetadata['grpc-message']); _responseError(GrpcError.custom(statusCode, message)); } } diff --git a/test/client_tests/client_test.dart b/test/client_tests/client_test.dart index 32d82ac..70480df 100644 --- a/test/client_tests/client_test.dart +++ b/test/client_tests/client_test.dart @@ -257,6 +257,27 @@ void main() { ); }); + test('Call throws decoded message', () async { + const customStatusCode = 17; + const customStatusMessage = 'エラー'; + const encodedCustomStatusMessage = '%E3%82%A8%E3%83%A9%E3%83%BC'; + + void handleRequest(_) { + harness.toClient.add(HeadersStreamMessage([ + Header.ascii('grpc-status', '$customStatusCode'), + Header.ascii('grpc-message', encodedCustomStatusMessage) + ], endStream: true)); + harness.toClient.close(); + } + + await harness.runFailureTest( + clientCall: harness.client.unary(dummyValue), + expectedException: + GrpcError.custom(customStatusCode, customStatusMessage), + serverHandlers: [handleRequest], + ); + }); + test('Call throws on response stream errors', () async { void handleRequest(_) { harness.toClient.addError('Test error');