diff --git a/gravitee-apim-definition/gravitee-apim-definition-model/src/main/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResource.java b/gravitee-apim-definition/gravitee-apim-definition-model/src/main/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResource.java index 82d531cc2f9..24128cad045 100644 --- a/gravitee-apim-definition/gravitee-apim-definition-model/src/main/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResource.java +++ b/gravitee-apim-definition/gravitee-apim-definition-model/src/main/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResource.java @@ -171,7 +171,7 @@ private void removeUnsupportedFields() { if (spec.hasNonNull(PROXY_FIELD)) { var proxy = getSpec().get(PROXY_FIELD); if (proxy.hasNonNull(ENDPOINT_GROUPS_FIELD)) { - proxy.get(ENDPOINT_GROUPS_FIELD).forEach(this::removeUnsupportedEndpointGroupFields); + proxy.get(ENDPOINT_GROUPS_FIELD).forEach(this::prepareEndpointGroup); } } } @@ -190,4 +190,29 @@ private JsonNode mapPages(ArrayNode pages) { } return pagesMap; } + + private void prepareEndpointGroup(JsonNode group) { + removeUnsupportedEndpointGroupFields(group); + replaceEndpointHeaders((ObjectNode) group); + if (group.hasNonNull(ENDPOINTS_FIELD)) { + var endpoints = (ArrayNode) group.get(ENDPOINTS_FIELD); + endpoints.forEach(endpoint -> replaceEndpointHeaders((ObjectNode) endpoint)); + } + } + + private void replaceEndpointHeaders(ObjectNode endpoint) { + if (endpoint.has("headers")) { + endpoint.replace("headers", mapHeaders((ArrayNode) endpoint.get("headers"))); + } + } + + private ObjectNode mapHeaders(ArrayNode headers) { + var headerMap = JsonNodeFactory.instance.objectNode(); + headers.forEach(header -> { + var name = header.get("name").asText(); + var value = header.get("value").asText(); + headerMap.put(name, value); + }); + return headerMap; + } } diff --git a/gravitee-apim-definition/gravitee-apim-definition-model/src/test/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResourceTest.java b/gravitee-apim-definition/gravitee-apim-definition-model/src/test/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResourceTest.java index 376eac2ed2c..8de15015144 100644 --- a/gravitee-apim-definition/gravitee-apim-definition-model/src/test/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResourceTest.java +++ b/gravitee-apim-definition/gravitee-apim-definition-model/src/test/java/io/gravitee/definition/model/kubernetes/v1alpha1/ApiDefinitionResourceTest.java @@ -87,6 +87,19 @@ public void shouldMapPages() throws Exception { assertFalse(page.has("contentType")); } + @Test + void shouldMapHeadersToMap() throws Exception { + var resource = new ApiDefinitionResource("api-definition", readDefinition("api-definition.json")); + var proxy = (ObjectNode) resource.getSpec().get("proxy"); + assertTrue(proxy.has("groups")); + var groups = (ArrayNode) proxy.get("groups"); + assertEquals(1, groups.size()); + var group = groups.get(0); + assertTrue(group.has("headers")); + var headers = group.get("headers"); + assertEquals("true", headers.get("x-test").asText()); + } + @Test public void shouldMapPageWithoutName() throws Exception { ApiDefinitionResource resource = new ApiDefinitionResource( diff --git a/gravitee-apim-definition/gravitee-apim-definition-model/src/test/resources/io/gravitee/definition/model/kubernetes/v1alpha1/api-definition.json b/gravitee-apim-definition/gravitee-apim-definition-model/src/test/resources/io/gravitee/definition/model/kubernetes/v1alpha1/api-definition.json index 866dbd8ec79..6bc487d3322 100644 --- a/gravitee-apim-definition/gravitee-apim-definition-model/src/test/resources/io/gravitee/definition/model/kubernetes/v1alpha1/api-definition.json +++ b/gravitee-apim-definition/gravitee-apim-definition-model/src/test/resources/io/gravitee/definition/model/kubernetes/v1alpha1/api-definition.json @@ -146,7 +146,13 @@ "maxConcurrentConnections": 100, "useCompression": true, "followRedirects": false - } + }, + "headers": [ + { + "name": "x-test", + "value": "true" + } + ] } ] }, diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/ApiExportServiceImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/ApiExportServiceImpl.java index 46ee43bf302..62c421040e9 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/ApiExportServiceImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/ApiExportServiceImpl.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.BooleanNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import io.gravitee.apim.core.api.model.Path; import io.gravitee.common.component.Lifecycle;