From ea4df5f17aa6b0c8c6dc2d16e0c95e857d7ce63b Mon Sep 17 00:00:00 2001 From: Kirstyn Joy Amperiadis Date: Fri, 20 Jan 2023 14:45:42 -0600 Subject: [PATCH 1/4] Enable use of nullable maps for headers, params and query --- .../binding/RpcHttpRequestDataSource.java | 18 +++- .../handler/WorkerInitRequestHandler.java | 1 + .../tests/RpcHttpRequestDataSourceTest.java | 98 +++++++++++++++++-- 3 files changed, 106 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java index 056c9fbc..1b2b7c4d 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java +++ b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java @@ -6,7 +6,9 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import com.microsoft.azure.functions.rpc.messages.NullableTypes; import org.apache.commons.lang3.reflect.TypeUtils; import com.microsoft.azure.functions.HttpMethod; @@ -22,8 +24,10 @@ public RpcHttpRequestDataSource(String name, RpcHttp value) { super(name, null, HTTP_DATA_OPERATIONS); this.httpPayload = value; this.bodyDataSource = BindingDataStore.rpcSourceFromTypedData(null, this.httpPayload.getBody()); - this.fields = Arrays.asList(this.httpPayload.getHeadersMap(), this.httpPayload.getQueryMap(), - this.httpPayload.getParamsMap()); + this.fields = Arrays.asList( + convertFromNullableMap(this.httpPayload.getNullableHeadersMap()), + convertFromNullableMap(this.httpPayload.getNullableQueryMap()), + convertFromNullableMap(this.httpPayload.getNullableParamsMap())); this.setValue(this); } @@ -45,12 +49,12 @@ public HttpMethod getHttpMethod() { @Override public Map getHeaders() { - return this.parentDataSource.httpPayload.getHeadersMap(); + return convertFromNullableMap(this.parentDataSource.httpPayload.getNullableHeadersMap()); } @Override public Map getQueryParameters() { - return this.parentDataSource.httpPayload.getQueryMap(); + return convertFromNullableMap(this.parentDataSource.httpPayload.getNullableQueryMap()); } @Override @@ -86,4 +90,10 @@ public Builder createResponseBuilder(HttpStatus status) { return new HttpRequestMessageImpl(v, bodyData.getValue()); }); } + + private static Map convertFromNullableMap(Map nullableMap) { + return nullableMap.entrySet().stream().collect( + Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getValue()) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/microsoft/azure/functions/worker/handler/WorkerInitRequestHandler.java b/src/main/java/com/microsoft/azure/functions/worker/handler/WorkerInitRequestHandler.java index 9ef511e8..75d3b96e 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/handler/WorkerInitRequestHandler.java +++ b/src/main/java/com/microsoft/azure/functions/worker/handler/WorkerInitRequestHandler.java @@ -23,6 +23,7 @@ String execute(WorkerInitRequest request, WorkerInitResponse.Builder response) { response.putCapabilities("TypedDataCollection", "TypedDataCollection"); response.putCapabilities("WorkerStatus", "WorkerStatus"); response.putCapabilities("RpcHttpBodyOnly", "RpcHttpBodyOnly"); + response.putCapabilities("UseNullableValueDictionaryForHttp", "UseNullableValueDictionaryForHttp"); response.putCapabilities("RpcHttpTriggerMetadataRemoved", "RpcHttpTriggerMetadataRemoved"); response.putCapabilities("HandlesWorkerTerminateMessage", "HandlesWorkerTerminateMessage"); response.setWorkerMetadata(composeWorkerMetadata()); diff --git a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java index 813f4fa4..884bec3d 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java @@ -5,6 +5,8 @@ import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.*; + +import com.microsoft.azure.functions.rpc.messages.NullableTypes.NullableString; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpStatus; import com.microsoft.azure.functions.rpc.messages.RpcHttp; @@ -26,13 +28,23 @@ public void HttpRequestIntBody(HttpRequestMessage request) { public void HttpRequestBinaryBody(HttpRequestMessage request) { } - public static RpcHttp getTestRpcHttp(Object inputBody) throws Exception { + public static RpcHttp getTestRpcHttp( + Object inputBody, + Map headersMap, + Map queryMap) throws Exception { TypedData.Builder dataBuilder = TypedData.newBuilder(); RpcHttp.Builder httpBuilder = RpcHttp.newBuilder() .setStatusCode(Integer.toString(HttpStatus.OK.value())); - Map headers = new HashMap<>(); - headers.put("header", "testHeader"); - headers.forEach(httpBuilder::putHeaders); + if (headersMap != null) { + for (String key : headersMap.keySet()) { + httpBuilder.putNullableHeaders(key, NullableString.newBuilder().setValue(headersMap.get(key)).build()); + } + } + if (queryMap != null) { + for (String key : queryMap.keySet()) { + httpBuilder.putNullableQuery(key, NullableString.newBuilder().setValue(queryMap.get(key)).build()); + } + } RpcUnspecifiedDataTarget bodyTarget = new RpcUnspecifiedDataTarget(); Object body = inputBody; bodyTarget.setValue(body); @@ -41,6 +53,78 @@ public static RpcHttp getTestRpcHttp(Object inputBody) throws Exception { return httpBuilder.build(); } + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty() throws Exception { + + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map queryMap = new HashMap() {{ + put("name", ""); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, null, queryMap); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getQueryParameters().get("name"), ""); + } + + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsNonEmpty() throws Exception { + + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map queryMap = new HashMap() {{ + put("name", "random"); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, null, queryMap); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getQueryParameters().get("name"), "random"); + } + + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty() throws Exception { + + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map headersMap = new HashMap() {{ + put("cookie", ""); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, headersMap, null); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getHeaders().get("cookie"), ""); + } + + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersNonEmpty() throws Exception { + + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map headersMap = new HashMap() {{ + put("cookie", "foo=bar"); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, headersMap, null); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getHeaders().get("cookie"), "foo=bar"); + } + @Test public void rpcHttpDataSource_To_HttpRequestMessage_StringBody() throws Exception { @@ -48,7 +132,7 @@ public void rpcHttpDataSource_To_HttpRequestMessage_StringBody() throws Exceptio Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp("testStringBody"); + RpcHttp input = getTestRpcHttp("testStringBody", null, null); RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); Optional actualBindingData = rpcHttp.computeByName(sourceKey, parameters[0].getParameterizedType()); @@ -64,7 +148,7 @@ public void rpcHttpDataSource_To_HttpRequestMessage_IntegerBody() throws Excepti Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(1234); + RpcHttp input = getTestRpcHttp(1234, null, null); RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); Optional actualBindingData = rpcHttp.computeByName(sourceKey, parameters[0].getParameterizedType()); @@ -82,7 +166,7 @@ public void rpcHttpDataSource_To_HttpRequestMessage_byteArrayBody() throws Excep String sourceKey = "testRpcHttp"; String expectedString = "Example String"; byte[] inputBytes = expectedString.getBytes(); - RpcHttp input = getTestRpcHttp(inputBytes); + RpcHttp input = getTestRpcHttp(inputBytes, null, null); RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); Optional actualBindingData = rpcHttp.computeByName(sourceKey, parameters[0].getParameterizedType()); From 5c74367ee38ccd82073d57c1960ab3d5dd6755cc Mon Sep 17 00:00:00 2001 From: Kirstyn Joy Amperiadis Date: Mon, 23 Jan 2023 15:24:57 -0600 Subject: [PATCH 2/4] Check app setting and filter map --- .../binding/RpcHttpRequestDataSource.java | 13 +++- .../tests/RpcHttpRequestDataSourceTest.java | 75 ++++++++++++++++++- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java index 1b2b7c4d..6d95cff3 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java +++ b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import com.microsoft.azure.functions.rpc.messages.NullableTypes; +import com.microsoft.azure.functions.worker.Util; import org.apache.commons.lang3.reflect.TypeUtils; import com.microsoft.azure.functions.HttpMethod; @@ -92,8 +93,14 @@ public Builder createResponseBuilder(HttpStatus status) { } private static Map convertFromNullableMap(Map nullableMap) { - return nullableMap.entrySet().stream().collect( - Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getValue()) - ); + if (Util.isTrue(System.getenv("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED"))) { + return nullableMap.entrySet().stream().collect( + Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getValue()) + ); + } else { + return nullableMap.entrySet().stream() + .filter(e -> e.getValue().getValue() != null && !e.getValue().getValue().trim().isEmpty()) + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getValue())); + } } } \ No newline at end of file diff --git a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java index 884bec3d..1fea472f 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java @@ -12,6 +12,9 @@ import com.microsoft.azure.functions.rpc.messages.RpcHttp; import com.microsoft.azure.functions.rpc.messages.TypedData; import com.microsoft.azure.functions.worker.binding.*; +import com.microsoft.azure.functions.worker.broker.JavaFunctionBroker; +import com.microsoft.azure.functions.worker.handler.FunctionEnvironmentReloadRequestHandler; +import com.microsoft.azure.functions.worker.reflect.DefaultClassLoaderProvider; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -54,8 +57,15 @@ public static RpcHttp getTestRpcHttp( } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty() throws Exception { - + public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty_EnvSettingEnabled() throws Exception { + DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); + JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); + FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); + Map existingVariables = System.getenv(); + Map newEnvVariables = new HashMap<>(); + newEnvVariables.putAll(existingVariables); + newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "true"); + envHandler.setEnv(newEnvVariables); Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map queryMap = new HashMap() {{ put("name", ""); @@ -71,6 +81,31 @@ public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty() t assertEquals(requestMsg.getQueryParameters().get("name"), ""); } + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty_EnvSettingDisabled() throws Exception { + DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); + JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); + FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); + Map existingVariables = System.getenv(); + Map newEnvVariables = new HashMap<>(); + newEnvVariables.putAll(existingVariables); + newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "false"); + envHandler.setEnv(newEnvVariables); + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map queryMap = new HashMap() {{ + put("name", ""); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, null, queryMap); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getQueryParameters().get("name"), null); + } + @Test public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsNonEmpty() throws Exception { @@ -90,8 +125,15 @@ public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsNonEmpty( } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty() throws Exception { - + public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty_EnvSettingEnabled() throws Exception { + DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); + JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); + FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); + Map existingVariables = System.getenv(); + Map newEnvVariables = new HashMap<>(); + newEnvVariables.putAll(existingVariables); + newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "true"); + envHandler.setEnv(newEnvVariables); Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map headersMap = new HashMap() {{ put("cookie", ""); @@ -107,6 +149,31 @@ public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty() throw assertEquals(requestMsg.getHeaders().get("cookie"), ""); } + @Test + public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty_EnvSettingDisabled() throws Exception { + DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); + JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); + FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); + Map existingVariables = System.getenv(); + Map newEnvVariables = new HashMap<>(); + newEnvVariables.putAll(existingVariables); + newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "false"); + envHandler.setEnv(newEnvVariables); + Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map headersMap = new HashMap() {{ + put("cookie", ""); + }}; + Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); + String sourceKey = "testRpcHttp"; + RpcHttp input = getTestRpcHttp(null, headersMap, null); + RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); + Optional actualBindingData = rpcHttp.computeByName(sourceKey, + parameters[0].getParameterizedType()); + BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); + HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); + assertEquals(requestMsg.getHeaders().get("cookie"), null); + } + @Test public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersNonEmpty() throws Exception { From 1e536839e7fd6ed1dfe77927199772acb014afc1 Mon Sep 17 00:00:00 2001 From: Kirstyn Joy Amperiadis Date: Wed, 25 Jan 2023 16:38:46 -0600 Subject: [PATCH 3/4] Simplify unit tests --- .../tests/RpcHttpRequestDataSourceTest.java | 117 ++++-------------- 1 file changed, 24 insertions(+), 93 deletions(-) diff --git a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java index 1fea472f..acb784de 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java @@ -17,8 +17,7 @@ import com.microsoft.azure.functions.worker.reflect.DefaultClassLoaderProvider; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - +import static org.junit.jupiter.api.Assertions.*; public class RpcHttpRequestDataSourceTest { @@ -57,7 +56,7 @@ public static RpcHttp getTestRpcHttp( } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty_EnvSettingEnabled() throws Exception { + public void rpcHttpDataSourceToHttpRequestMessageEnvSettingEnabled() throws Exception { DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); @@ -69,88 +68,29 @@ public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty_Env Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map queryMap = new HashMap() {{ put("name", ""); + put("count", "1"); }}; - Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); - String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, null, queryMap); - RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); - Optional actualBindingData = rpcHttp.computeByName(sourceKey, - parameters[0].getParameterizedType()); - BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); - HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getQueryParameters().get("name"), ""); - } - - @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsEmpty_EnvSettingDisabled() throws Exception { - DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); - JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); - FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); - Map existingVariables = System.getenv(); - Map newEnvVariables = new HashMap<>(); - newEnvVariables.putAll(existingVariables); - newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "false"); - envHandler.setEnv(newEnvVariables); - Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); - Map queryMap = new HashMap() {{ - put("name", ""); - }}; - Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); - String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, null, queryMap); - RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); - Optional actualBindingData = rpcHttp.computeByName(sourceKey, - parameters[0].getParameterizedType()); - BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); - HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getQueryParameters().get("name"), null); - } - - @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableQueryParamsNonEmpty() throws Exception { - - Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); - Map queryMap = new HashMap() {{ - put("name", "random"); - }}; - Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); - String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, null, queryMap); - RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); - Optional actualBindingData = rpcHttp.computeByName(sourceKey, - parameters[0].getParameterizedType()); - BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); - HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getQueryParameters().get("name"), "random"); - } - - @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty_EnvSettingEnabled() throws Exception { - DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); - JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); - FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); - Map existingVariables = System.getenv(); - Map newEnvVariables = new HashMap<>(); - newEnvVariables.putAll(existingVariables); - newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "true"); - envHandler.setEnv(newEnvVariables); - Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map headersMap = new HashMap() {{ put("cookie", ""); + put("accept-encoding", "gzip, deflate, br"); }}; Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, headersMap, null); + RpcHttp input = getTestRpcHttp(null, headersMap, queryMap); RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); Optional actualBindingData = rpcHttp.computeByName(sourceKey, parameters[0].getParameterizedType()); BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getHeaders().get("cookie"), ""); + + assertTrue(requestMsg.getQueryParameters().get("name").isEmpty()); + assertEquals("1", requestMsg.getQueryParameters().get("count")); + assertTrue(requestMsg.getHeaders().get("cookie").isEmpty()); + assertEquals("gzip, deflate, br", requestMsg.getHeaders().get("accept-encoding")); } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty_EnvSettingDisabled() throws Exception { + public void rpcHttpDataSourceToHttpRequestMessageEnvSettingDisabled() throws Exception { DefaultClassLoaderProvider classLoader = new DefaultClassLoaderProvider(); JavaFunctionBroker broker = new JavaFunctionBroker(classLoader); FunctionEnvironmentReloadRequestHandler envHandler = new FunctionEnvironmentReloadRequestHandler(broker); @@ -160,40 +100,31 @@ public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersEmpty_EnvSett newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "false"); envHandler.setEnv(newEnvVariables); Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); + Map queryMap = new HashMap() {{ + put("name", ""); + put("count", "1"); + }}; Map headersMap = new HashMap() {{ put("cookie", ""); + put("accept-encoding", "gzip, deflate, br"); }}; Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, headersMap, null); + RpcHttp input = getTestRpcHttp(null, headersMap, queryMap); RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); Optional actualBindingData = rpcHttp.computeByName(sourceKey, parameters[0].getParameterizedType()); BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getHeaders().get("cookie"), null); - } - - @Test - public void rpcHttpDataSource_To_HttpRequestMessage_NullableHeadersNonEmpty() throws Exception { - Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); - Map headersMap = new HashMap() {{ - put("cookie", "foo=bar"); - }}; - Parameter[] parameters = httpRequestMessageStringBodyMethod.getParameters(); - String sourceKey = "testRpcHttp"; - RpcHttp input = getTestRpcHttp(null, headersMap, null); - RpcHttpRequestDataSource rpcHttp = new RpcHttpRequestDataSource(sourceKey, input); - Optional actualBindingData = rpcHttp.computeByName(sourceKey, - parameters[0].getParameterizedType()); - BindingData actualArg = actualBindingData.orElseThrow(WrongMethodTypeException::new); - HttpRequestMessage requestMsg = (HttpRequestMessage) actualArg.getValue(); - assertEquals(requestMsg.getHeaders().get("cookie"), "foo=bar"); + assertNull(requestMsg.getQueryParameters().get("name")); + assertEquals("1", requestMsg.getQueryParameters().get("count")); + assertNull(requestMsg.getHeaders().get("cookie")); + assertEquals("gzip, deflate, br", requestMsg.getHeaders().get("accept-encoding")); } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_StringBody() throws Exception { + public void rpcHttpDataSourceToHttpRequestMessageStringBody() throws Exception { Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); @@ -209,7 +140,7 @@ public void rpcHttpDataSource_To_HttpRequestMessage_StringBody() throws Exceptio } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_IntegerBody() throws Exception { + public void rpcHttpDataSourceToHttpRequestMessageIntegerBody() throws Exception { Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestIntBody"); @@ -225,7 +156,7 @@ public void rpcHttpDataSource_To_HttpRequestMessage_IntegerBody() throws Excepti } @Test - public void rpcHttpDataSource_To_HttpRequestMessage_byteArrayBody() throws Exception { + public void rpcHttpDataSourceToHttpRequestMessageByteArrayBody() throws Exception { Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestBinaryBody"); From 83d5388fbc97edb3febc93251827d596bd98a09f Mon Sep 17 00:00:00 2001 From: Kirstyn Joy Amperiadis Date: Fri, 27 Jan 2023 10:01:59 -0600 Subject: [PATCH 4/4] Add app setting name in constants file --- .../java/com/microsoft/azure/functions/worker/Constants.java | 1 + .../functions/worker/binding/RpcHttpRequestDataSource.java | 3 ++- .../worker/binding/tests/RpcHttpRequestDataSourceTest.java | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/azure/functions/worker/Constants.java b/src/main/java/com/microsoft/azure/functions/worker/Constants.java index ed5a1e32..ea5d5404 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/Constants.java +++ b/src/main/java/com/microsoft/azure/functions/worker/Constants.java @@ -9,4 +9,5 @@ private Constants(){} public final static String JAVA_LIBRARY_DIRECTORY = "/annotationLib"; public final static String JAVA_LIBRARY_ARTIFACT_ID = "azure-functions-java-library"; public final static String HAS_IMPLICIT_OUTPUT_QUALIFIED_NAME = "com.microsoft.azure.functions.annotation.HasImplicitOutput"; + public final static String NULLABLE_VALUES_ENABLED_APP_SETTING = "FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED"; } diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java index 6d95cff3..3fd67f6f 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java +++ b/src/main/java/com/microsoft/azure/functions/worker/binding/RpcHttpRequestDataSource.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import com.microsoft.azure.functions.rpc.messages.NullableTypes; +import com.microsoft.azure.functions.worker.Constants; import com.microsoft.azure.functions.worker.Util; import org.apache.commons.lang3.reflect.TypeUtils; @@ -93,7 +94,7 @@ public Builder createResponseBuilder(HttpStatus status) { } private static Map convertFromNullableMap(Map nullableMap) { - if (Util.isTrue(System.getenv("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED"))) { + if (Util.isTrue(System.getenv(Constants.NULLABLE_VALUES_ENABLED_APP_SETTING))) { return nullableMap.entrySet().stream().collect( Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getValue()) ); diff --git a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java index acb784de..7ab659c1 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/binding/tests/RpcHttpRequestDataSourceTest.java @@ -11,6 +11,7 @@ import com.microsoft.azure.functions.HttpStatus; import com.microsoft.azure.functions.rpc.messages.RpcHttp; import com.microsoft.azure.functions.rpc.messages.TypedData; +import com.microsoft.azure.functions.worker.Constants; import com.microsoft.azure.functions.worker.binding.*; import com.microsoft.azure.functions.worker.broker.JavaFunctionBroker; import com.microsoft.azure.functions.worker.handler.FunctionEnvironmentReloadRequestHandler; @@ -63,7 +64,7 @@ public void rpcHttpDataSourceToHttpRequestMessageEnvSettingEnabled() throws Exce Map existingVariables = System.getenv(); Map newEnvVariables = new HashMap<>(); newEnvVariables.putAll(existingVariables); - newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "true"); + newEnvVariables.put(Constants.NULLABLE_VALUES_ENABLED_APP_SETTING, "true"); envHandler.setEnv(newEnvVariables); Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map queryMap = new HashMap() {{ @@ -97,7 +98,7 @@ public void rpcHttpDataSourceToHttpRequestMessageEnvSettingDisabled() throws Exc Map existingVariables = System.getenv(); Map newEnvVariables = new HashMap<>(); newEnvVariables.putAll(existingVariables); - newEnvVariables.put("FUNCTIONS_WORKER_NULLABLE_VALUES_ENABLED", "false"); + newEnvVariables.put(Constants.NULLABLE_VALUES_ENABLED_APP_SETTING, "false"); envHandler.setEnv(newEnvVariables); Method httpRequestMessageStringBodyMethod = getFunctionMethod("HttpRequestStringBody"); Map queryMap = new HashMap() {{