diff --git a/enclave/src/integration-test/java/org/hyperledger/besu/enclave/GoQuorumEnclaveTest.java b/enclave/src/integration-test/java/org/hyperledger/besu/enclave/GoQuorumEnclaveTest.java index 617147f58..00e834f88 100644 --- a/enclave/src/integration-test/java/org/hyperledger/besu/enclave/GoQuorumEnclaveTest.java +++ b/enclave/src/integration-test/java/org/hyperledger/besu/enclave/GoQuorumEnclaveTest.java @@ -17,6 +17,7 @@ package org.hyperledger.besu.enclave; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -52,7 +53,8 @@ public class GoQuorumEnclaveTest { @Test public void upCheck() { - when(vertxTransmitter.get(any(), any(), ArgumentMatchers.contains("/upcheck"), any())) + when(vertxTransmitter.get( + any(), any(), ArgumentMatchers.contains("/upcheck"), any(), anyBoolean())) .thenReturn("I'm up!"); assertThat(enclave.upCheck()).isTrue(); @@ -60,7 +62,8 @@ public class GoQuorumEnclaveTest { @Test public void receiveThrowsWhenPayloadDoesNotExist() { - when(vertxTransmitter.get(any(), any(), ArgumentMatchers.contains("/transaction"), any())) + when(vertxTransmitter.get( + any(), any(), ArgumentMatchers.contains("/transaction"), any(), anyBoolean())) .thenThrow( new EnclaveClientException(404, "Message with hash " + MOCK_KEY + " was not found")); @@ -72,7 +75,8 @@ public class GoQuorumEnclaveTest { @Test public void sendAndReceive() { when(vertxTransmitter.post(any(), any(), any(), any())).thenReturn(new SendResponse(KEY)); - when(vertxTransmitter.get(any(), any(), ArgumentMatchers.contains("/transaction"), any())) + when(vertxTransmitter.get( + any(), any(), ArgumentMatchers.contains("/transaction"), any(), anyBoolean())) .thenReturn(new GoQuorumReceiveResponse(PAYLOAD, 0, null, null)); final List publicKeys = Arrays.asList("/+UuD63zItL1EbjxkKUljMgG8Z1w0AJ8pNOR4iq2yQc="); diff --git a/enclave/src/main/java/org/hyperledger/besu/enclave/Enclave.java b/enclave/src/main/java/org/hyperledger/besu/enclave/Enclave.java index 262fd5aae..d1c803653 100644 --- a/enclave/src/main/java/org/hyperledger/besu/enclave/Enclave.java +++ b/enclave/src/main/java/org/hyperledger/besu/enclave/Enclave.java @@ -49,7 +49,7 @@ public class Enclave { public boolean upCheck() { try { final String upcheckResponse = - requestTransmitter.get(null, null, "/upcheck", this::handleRawResponse); + requestTransmitter.get(null, null, "/upcheck", this::handleRawResponse, false); return upcheckResponse.equals("I'm up!"); } catch (final Exception e) { return false; diff --git a/enclave/src/main/java/org/hyperledger/besu/enclave/GoQuorumEnclave.java b/enclave/src/main/java/org/hyperledger/besu/enclave/GoQuorumEnclave.java index a5178f9bf..7d2929378 100644 --- a/enclave/src/main/java/org/hyperledger/besu/enclave/GoQuorumEnclave.java +++ b/enclave/src/main/java/org/hyperledger/besu/enclave/GoQuorumEnclave.java @@ -44,7 +44,7 @@ public class GoQuorumEnclave { public boolean upCheck() { try { final String upcheckResponse = - requestTransmitter.get(null, null, "/upcheck", this::handleRawResponse); + requestTransmitter.get(null, null, "/upcheck", this::handleRawResponse, false); return upcheckResponse.equals("I'm up!"); } catch (final Exception e) { return false; @@ -99,7 +99,6 @@ public class GoQuorumEnclave { } catch (final JsonProcessingException e) { throw new EnclaveClientException(400, "Unable to serialize request."); } - return requestTransmitter.post(mediaType, bodyText, endpoint, responseBodyHandler); } @@ -107,7 +106,7 @@ public class GoQuorumEnclave { final String mediaType, final String endpoint, final ResponseBodyHandler responseBodyHandler) { - final T t = requestTransmitter.get(mediaType, null, endpoint, responseBodyHandler); + final T t = requestTransmitter.get(mediaType, null, endpoint, responseBodyHandler, true); return t; } diff --git a/enclave/src/main/java/org/hyperledger/besu/enclave/RequestTransmitter.java b/enclave/src/main/java/org/hyperledger/besu/enclave/RequestTransmitter.java index 9ce6e8f0a..0375be4b3 100644 --- a/enclave/src/main/java/org/hyperledger/besu/enclave/RequestTransmitter.java +++ b/enclave/src/main/java/org/hyperledger/besu/enclave/RequestTransmitter.java @@ -31,5 +31,6 @@ public interface RequestTransmitter { String mediaType, String content, String endpoint, - ResponseBodyHandler responseBodyHandler); + ResponseBodyHandler responseBodyHandler, + final boolean withAcceptJsonHeader); } diff --git a/enclave/src/main/java/org/hyperledger/besu/enclave/VertxRequestTransmitter.java b/enclave/src/main/java/org/hyperledger/besu/enclave/VertxRequestTransmitter.java index 4c535504b..52faa142c 100644 --- a/enclave/src/main/java/org/hyperledger/besu/enclave/VertxRequestTransmitter.java +++ b/enclave/src/main/java/org/hyperledger/besu/enclave/VertxRequestTransmitter.java @@ -18,6 +18,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import io.netty.handler.codec.http.HttpHeaderNames; import io.vertx.core.http.HttpClient; import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; @@ -26,6 +27,7 @@ import io.vertx.core.http.HttpMethod; public class VertxRequestTransmitter implements RequestTransmitter { + private static final String APPLICATION_JSON = "application/json"; private final HttpClient client; private static final long REQUEST_TIMEOUT_MS = 5000L; @@ -40,7 +42,12 @@ public class VertxRequestTransmitter implements RequestTransmitter { final String endpoint, final ResponseBodyHandler responseHandler) { return sendRequest( - HttpMethod.POST, Optional.of(contentType), Optional.of(content), endpoint, responseHandler); + HttpMethod.POST, + Optional.of(contentType), + Optional.of(content), + endpoint, + responseHandler, + false); } @Override @@ -48,13 +55,15 @@ public class VertxRequestTransmitter implements RequestTransmitter { final String contentType, final String content, final String endpoint, - final ResponseBodyHandler responseHandler) { + final ResponseBodyHandler responseHandler, + final boolean withAcceptJsonHeader) { return sendRequest( HttpMethod.GET, Optional.ofNullable(contentType), Optional.ofNullable(content), endpoint, - responseHandler); + responseHandler, + withAcceptJsonHeader); } protected T sendRequest( @@ -62,7 +71,8 @@ public class VertxRequestTransmitter implements RequestTransmitter { final Optional contentType, final Optional content, final String endpoint, - final ResponseBodyHandler responseHandler) { + final ResponseBodyHandler responseHandler, + final boolean withAcceptJsonHeader) { try { final CompletableFuture result = new CompletableFuture<>(); final HttpClientRequest request = @@ -72,6 +82,10 @@ public class VertxRequestTransmitter implements RequestTransmitter { .setTimeout(REQUEST_TIMEOUT_MS) .exceptionHandler(result::completeExceptionally) .setChunked(false); + if (withAcceptJsonHeader) { + // this is needed when using Tessera GET /transaction/{hash} to choose the right RPC + request.putHeader(HttpHeaderNames.ACCEPT, APPLICATION_JSON); + } contentType.ifPresent(ct -> request.putHeader(HttpHeaders.CONTENT_TYPE, ct)); if (content.isPresent()) { request.end(content.get());