From ac30b522e65bb584885f8bcb7a93d89dce9a1200 Mon Sep 17 00:00:00 2001 From: Igor Artamonov Date: Fri, 23 Aug 2019 21:39:31 -0400 Subject: [PATCH] solution: propagate native call exception to downstream --- src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt | 3 ++- .../io/emeraldpay/dshackle/upstream/EthereumGrpcTransport.kt | 3 ++- .../groovy/io/emeraldpay/dshackle/rpc/NativeCallSpec.groovy | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt b/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt index 8305c328..555178b0 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt @@ -75,6 +75,7 @@ class NativeCall( } return BlockchainOuterClass.NativeCallReplyItem.newBuilder() .setSucceed(false) + .setErrorMessage(it?.message ?: "Internal error") .setId(id) .build() .toMono() @@ -139,7 +140,7 @@ class NativeCall( else CallFailure(ctx.id, it) } .switchIfEmpty( - Mono.error>(CallFailure(ctx.id, Exception("No response or no available upstream for ${ctx.payload.method}"))) + Mono.error(CallFailure(ctx.id, Exception("No response or no available upstream for ${ctx.payload.method}")) as Throwable) ) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/EthereumGrpcTransport.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/EthereumGrpcTransport.kt index 7d7ce3d4..8b56d933 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/EthereumGrpcTransport.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/EthereumGrpcTransport.kt @@ -24,6 +24,7 @@ import io.emeraldpay.grpc.Chain import io.infinitape.etherjar.rpc.Batch import io.infinitape.etherjar.rpc.JacksonRpcConverter import io.infinitape.etherjar.rpc.RpcException +import io.infinitape.etherjar.rpc.RpcResponseError import io.infinitape.etherjar.rpc.transport.BatchStatus import io.infinitape.etherjar.rpc.transport.RpcTransport import reactor.core.publisher.Flux @@ -74,7 +75,7 @@ class EthereumGrpcTransport( bi.onError(e) } } else { - bi.onError(RpcException(-32603, resp.error.toString())) + bi.onError(RpcException(RpcResponseError.CODE_INTERNAL_ERROR, resp.errorMessage)) } } false diff --git a/src/test/groovy/io/emeraldpay/dshackle/rpc/NativeCallSpec.groovy b/src/test/groovy/io/emeraldpay/dshackle/rpc/NativeCallSpec.groovy index 14505e72..70054dc5 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/rpc/NativeCallSpec.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/rpc/NativeCallSpec.groovy @@ -135,6 +135,7 @@ class NativeCallSpec extends Specification { StepVerifier.create(resp) .expectNext(BlockchainOuterClass.NativeCallReplyItem.newBuilder() .setSucceed(false) + .setErrorMessage("Failed to call 5: test test") .setId(5) .build()) .expectComplete() @@ -151,6 +152,7 @@ class NativeCallSpec extends Specification { StepVerifier.create(resp) .expectNext(BlockchainOuterClass.NativeCallReplyItem.newBuilder() .setSucceed(false) + .setErrorMessage("test test") .build()) .expectComplete() .verify(Duration.ofSeconds(1))