mirror of https://github.com/grpc/grpc-dart.git
Send trailers included on GrpcError object (#538)
This commit is contained in:
parent
af965f15f7
commit
b8f872a3dc
|
@ -328,7 +328,8 @@ class ServerHandler_ extends ServiceCall {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void sendTrailers({int? status = 0, String? message}) {
|
void sendTrailers(
|
||||||
|
{int? status = 0, String? message, Map<String, String>? errorTrailers}) {
|
||||||
_timeoutTimer?.cancel();
|
_timeoutTimer?.cancel();
|
||||||
|
|
||||||
final outgoingTrailersMap = <String, String>{};
|
final outgoingTrailersMap = <String, String>{};
|
||||||
|
@ -354,6 +355,9 @@ class ServerHandler_ extends ServiceCall {
|
||||||
outgoingTrailersMap['grpc-message'] =
|
outgoingTrailersMap['grpc-message'] =
|
||||||
Uri.encodeFull(message).replaceAll('%20', ' ');
|
Uri.encodeFull(message).replaceAll('%20', ' ');
|
||||||
}
|
}
|
||||||
|
if (errorTrailers != null) {
|
||||||
|
outgoingTrailersMap.addAll(errorTrailers);
|
||||||
|
}
|
||||||
|
|
||||||
final outgoingTrailers = <Header>[];
|
final outgoingTrailers = <Header>[];
|
||||||
outgoingTrailersMap.forEach((key, value) =>
|
outgoingTrailersMap.forEach((key, value) =>
|
||||||
|
@ -407,7 +411,11 @@ class ServerHandler_ extends ServiceCall {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _sendError(GrpcError error) {
|
void _sendError(GrpcError error) {
|
||||||
sendTrailers(status: error.code, message: error.message);
|
sendTrailers(
|
||||||
|
status: error.code,
|
||||||
|
message: error.message,
|
||||||
|
errorTrailers: error.trailers,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cancel() {
|
void cancel() {
|
||||||
|
|
|
@ -50,6 +50,22 @@ class TestServiceWithOnMetadataException extends TestService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TestServiceWithGrpcError extends TestService {
|
||||||
|
@override
|
||||||
|
Stream<int> stream(ServiceCall call, Future request) async* {
|
||||||
|
throw GrpcError.custom(
|
||||||
|
StatusCode.internal,
|
||||||
|
'This error should contain trailers',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
'key1': 'value1',
|
||||||
|
'key2': 'value2',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class FixedConnectionClientChannel extends ClientChannelBase {
|
class FixedConnectionClientChannel extends ClientChannelBase {
|
||||||
final Http2ClientConnection clientConnection;
|
final Http2ClientConnection clientConnection;
|
||||||
List<ConnectionState> states = <ConnectionState>[];
|
List<ConnectionState> states = <ConnectionState>[];
|
||||||
|
@ -155,4 +171,30 @@ Future<void> main() async {
|
||||||
await channel.shutdown();
|
await channel.shutdown();
|
||||||
await server.shutdown();
|
await server.shutdown();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('trailers on server GrpcError', () async {
|
||||||
|
final server = Server([TestServiceWithGrpcError()]);
|
||||||
|
await server.serve(address: 'localhost', port: 0);
|
||||||
|
|
||||||
|
final channel = FixedConnectionClientChannel(Http2ClientConnection(
|
||||||
|
'localhost',
|
||||||
|
server.port!,
|
||||||
|
ChannelOptions(credentials: ChannelCredentials.insecure()),
|
||||||
|
));
|
||||||
|
final testClient = TestClient(channel);
|
||||||
|
await expectLater(
|
||||||
|
testClient.stream(TestService.requestFiniteStream).toList(),
|
||||||
|
throwsA(predicate<GrpcError>((e) {
|
||||||
|
final trailers = e.trailers;
|
||||||
|
if (trailers == null || trailers.length != 2) return false;
|
||||||
|
final entries = trailers.entries.toList();
|
||||||
|
final isOk = entries[0].key == 'key1' &&
|
||||||
|
entries[0].value == 'value1' &&
|
||||||
|
entries[1].key == 'key2' &&
|
||||||
|
entries[1].value == 'value2';
|
||||||
|
return isOk;
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
await server.shutdown();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue