problem: single invalid response from upstream breaks whole batch

solution: handle http and json errors and convert to RPC errors
This commit is contained in:
Igor Artamonov
2020-05-25 18:30:55 -04:00
parent d7bb121ef0
commit 5584858e44
4 changed files with 97 additions and 44 deletions

View File

@@ -17,6 +17,8 @@ package io.emeraldpay.dshackle.upstream.rpcclient
import io.emeraldpay.dshackle.config.AuthConfig
import io.emeraldpay.dshackle.test.TestingCommons
import io.infinitape.etherjar.rpc.RpcException
import io.infinitape.etherjar.rpc.RpcResponseError
import org.mockserver.integration.ClientAndServer
import org.mockserver.model.HttpRequest
import org.mockserver.model.HttpResponse
@@ -88,4 +90,25 @@ class JsonRpcHttpClientSpec extends Specification {
)
}
def "Produces RPC Exception on error status code"() {
setup:
def client = new JsonRpcHttpClient("localhost:18332", null, null)
mockServer.when(
HttpRequest.request()
).respond(
HttpResponse.response()
.withStatusCode(500)
.withBody("pong")
)
when:
def act = client.execute("ping".bytes).map { new String(it) }
then:
StepVerifier.create(act)
.expectErrorMatches { t ->
t instanceof RpcException && t.code == RpcResponseError.CODE_UPSTREAM_INVALID_RESPONSE
}
.verify(Duration.ofSeconds(1))
}
}

View File

@@ -15,6 +15,7 @@
*/
package io.emeraldpay.dshackle.upstream.rpcclient
import io.infinitape.etherjar.rpc.RpcResponseError
import spock.lang.Specification
class JsonRpcParserSpec extends Specification {
@@ -177,4 +178,16 @@ class JsonRpcParserSpec extends Specification {
!act.hasResult()
}
def "Handle non-json with producing an error response"() {
setup:
def json = 'NOT JSON'
when:
def act = parser.parse(json.getBytes())
then:
act.error != null
act.error.code == RpcResponseError.CODE_UPSTREAM_INVALID_RESPONSE
act.hasError()
!act.hasResult()
}
}