From 707519e220256f9d00386fec1d0525c7d37309be Mon Sep 17 00:00:00 2001 From: Florent CHAMFROY Date: Mon, 3 Jun 2024 10:10:25 +0200 Subject: [PATCH] feat: add methods for binary content of messages https://gravitee.atlassian.net/browse/APIM-5260 --- README.adoc | 5 +++++ .../groovy/model/message/BindableMessage.java | 9 ++++++++ .../policy/groovy/GroovyPolicyTest.java | 21 +++++++++++++++++++ .../groovy/get_message_binary_content.groovy | 3 +++ 4 files changed, 38 insertions(+) create mode 100644 src/test/resources/io/gravitee/policy/groovy/get_message_binary_content.groovy diff --git a/README.adoc b/README.adoc index a2c081f..b9ef8b8 100644 --- a/README.adoc +++ b/README.adoc @@ -190,6 +190,11 @@ content.greeting = 'Hello Universe!' return JsonOutput.toJson(content) ---- +The content of a message can also be accessed directly: + + - as a base64 string with `message.contentAsBase64` + - as an array of bytes with `message.contentAsByteArray` + == Errors === Sandbox diff --git a/src/main/java/io/gravitee/policy/groovy/model/message/BindableMessage.java b/src/main/java/io/gravitee/policy/groovy/model/message/BindableMessage.java index 92c549e..2cd41cb 100644 --- a/src/main/java/io/gravitee/policy/groovy/model/message/BindableMessage.java +++ b/src/main/java/io/gravitee/policy/groovy/model/message/BindableMessage.java @@ -19,6 +19,7 @@ import io.gravitee.gateway.api.http.HttpHeaders; import io.gravitee.gateway.reactive.api.message.Message; import io.gravitee.policy.groovy.model.BindableHttpHeaders; +import java.util.Base64; import java.util.List; import java.util.Map; import java.util.Set; @@ -111,6 +112,14 @@ public String getContent() { return message.content() == null ? "" : content().toString(); } + public String getContentAsBase64() { + return message.content() == null ? "" : Base64.getEncoder().encodeToString(message.content().getBytes()); + } + + public byte[] getContentAsByteArray() { + return message.content() == null ? new byte[0] : message.content().getBytes(); + } + @Override public Message content(Buffer content) { throw new UnsupportedOperationException("Setting content must be done returning a value and setting `overrideContent` to true"); diff --git a/src/test/java/io/gravitee/policy/groovy/GroovyPolicyTest.java b/src/test/java/io/gravitee/policy/groovy/GroovyPolicyTest.java index 8976d32..c60a993 100644 --- a/src/test/java/io/gravitee/policy/groovy/GroovyPolicyTest.java +++ b/src/test/java/io/gravitee/policy/groovy/GroovyPolicyTest.java @@ -35,6 +35,9 @@ import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.MaybeTransformer; import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; import java.util.function.Function; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -302,6 +305,24 @@ private static GroovyPolicyConfiguration buildConfig(String script) { return GroovyPolicyConfiguration.builder().script(loadScript(script)).readContent(true).build(); } + @Test + void should_get_message_binary_content_as_base64() { + var policy = new GroovyPolicy(buildConfig("get_message_binary_content.groovy")); + var message = new DefaultMessage(); + byte[] isoEncodedCharacter = "é".getBytes(StandardCharsets.ISO_8859_1); + message.content(Buffer.buffer(isoEncodedCharacter)); + + when(request.onMessage(onMessageCaptor.capture())).thenReturn(Completable.complete()); + policy.onMessageRequest(ctx).test().assertNoValues(); + + onMessageCaptor.getValue().apply(message).test().assertComplete().assertNoErrors(); + + assertThat(message.attribute("wronglyBase64EncodedContent")) + .isNotEqualTo(Base64.getEncoder().encodeToString(isoEncodedCharacter)); + assertThat(message.attribute("goodBase64Content")).isEqualTo(Base64.getEncoder().encodeToString(isoEncodedCharacter)); + assertThat(message.attribute("byteArray")).isEqualTo(Arrays.toString(isoEncodedCharacter)); + } + private static String loadScript(String file) { try { return new String(getResourceAsStream(file).readAllBytes()); diff --git a/src/test/resources/io/gravitee/policy/groovy/get_message_binary_content.groovy b/src/test/resources/io/gravitee/policy/groovy/get_message_binary_content.groovy new file mode 100644 index 0000000..f15bd22 --- /dev/null +++ b/src/test/resources/io/gravitee/policy/groovy/get_message_binary_content.groovy @@ -0,0 +1,3 @@ +message.attributes.wronglyBase64EncodedContent = message.content.bytes.encodeBase64().toString() // final value is not well encoded because of Charset transformation +message.attributes.goodBase64Content = message.contentAsBase64 +message.attributes.byteArray = message.contentAsByteArray.toString()