From fa8552a9944ebcdbcf89e24bc229cff9f691bc1c Mon Sep 17 00:00:00 2001 From: i302705 Date: Thu, 24 Sep 2026 09:20:30 +0300 Subject: [PATCH] fix: Correctly handle empty 'Local-Tenant-Id' header values --- CHANGELOG.md | 12 ++++++++++- .../com/sap/cds/feature/ord/common/Utils.java | 7 +++++++ .../feature/ord/servlet/DocumentsServlet.java | 3 ++- .../feature/ord/servlet/WellKnownServlet.java | 3 ++- .../sap/cds/feature/ord/common/UtilsTest.java | 20 +++++++++++++++++++ pom.xml | 2 +- 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e0256b..a1f6c5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). ### Removed +## [v6.0.2] + +### Fixed +- Correctly handle empty 'Local-Tenant-Id' header values by @mlakov https://github.com/cap-java/cds-feature-ord/pull/39 + +### Changed +- Bump actions/setup-java in the minor-patch group by @dependabot https://github.com/cap-java/cds-feature-ord/pull/36 +- Bump the minor-patch group across 1 directory with 5 updates by @dependabot https://github.com/cap-java/cds-feature-ord/pull/35 +- Bump com.github.spotbugs:spotbugs-maven-plugin by @dependabot https://github.com/cap-java/cds-feature-ord/pull/37 +- Bump org.apache.maven.plugins:maven-deploy-plugin by @dependabot https://github.com/cap-java/cds-feature-ord/pull/38 + ## [v6.0.1] ### Added @@ -24,7 +35,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). ### Fixed - Use EDMX providers for loading OData API definitions by @mlakov https://github.com/cap-java/cds-feature-ord/pull/32 - ### Changed - Bump the minor-patch group across 1 directory with 4 updates by @dependabot https://github.com/cap-java/cds-feature-ord/pull/23 - Improve GH workflows by @mlakov https://github.com/cap-java/cds-feature-ord/pull/8 diff --git a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/common/Utils.java b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/common/Utils.java index 589e962..62aeb61 100644 --- a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/common/Utils.java +++ b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/common/Utils.java @@ -19,6 +19,7 @@ import com.sap.cds.services.environment.CdsProperties.Security.Authentication; import com.sap.cds.services.runtime.CdsRuntime; import com.sap.cds.services.utils.ErrorStatusException; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; @@ -40,6 +41,12 @@ public class Utils { @UtilityClass public static class Http { + public static String header(HttpServletRequest request, String header) { + String value = request.getHeader(header); + + return (value == null || value.isBlank()) ? null : value; + } + public static void respondWith(HttpServletResponse response, String payload) { try (PrintWriter writer = response.getWriter()) { writer.write(payload); diff --git a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/DocumentsServlet.java b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/DocumentsServlet.java index 9e46d78..64df3f0 100644 --- a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/DocumentsServlet.java +++ b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/DocumentsServlet.java @@ -5,6 +5,7 @@ import static com.sap.cds.feature.ord.common.Constants.HEADER_LOCAL_TENANT_ID; import static com.sap.cds.feature.ord.common.Utils.Http.handleException; +import static com.sap.cds.feature.ord.common.Utils.Http.header; import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static jakarta.servlet.http.HttpServletResponse.SC_OK; import static org.apache.commons.io.FilenameUtils.getExtension; @@ -47,7 +48,7 @@ private void process(HttpServletRequest request, HttpServletResponse response) { cdsRuntime .requestContext() - .systemUser(request.getHeader(HEADER_LOCAL_TENANT_ID)) + .systemUser(header(request, HEADER_LOCAL_TENANT_ID)) .run(rc -> { try { processDocument(request, response); diff --git a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/WellKnownServlet.java b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/WellKnownServlet.java index e97d33d..5f7217d 100644 --- a/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/WellKnownServlet.java +++ b/cds-feature-ord/src/main/java/com/sap/cds/feature/ord/servlet/WellKnownServlet.java @@ -8,6 +8,7 @@ import static com.sap.cds.feature.ord.common.Constants.PERSPECTIVE_SYSTEM_VERSION; import static com.sap.cds.feature.ord.common.Utils.CdsRuntimeProperties.getOrdProperties; import static com.sap.cds.feature.ord.common.Utils.Http.handleException; +import static com.sap.cds.feature.ord.common.Utils.Http.header; import static com.sap.cds.feature.ord.common.Utils.Http.respondWith; import static com.sap.cds.services.ErrorStatuses.NOT_FOUND; import static jakarta.servlet.http.HttpServletResponse.SC_OK; @@ -57,7 +58,7 @@ private void process(HttpServletRequest request, HttpServletResponse response) { cdsRuntime .requestContext() - .systemUser(request.getHeader(HEADER_LOCAL_TENANT_ID)) + .systemUser(header(request, HEADER_LOCAL_TENANT_ID)) .run(rc -> { response.setStatus(SC_OK); response.setContentType(APPLICATION_JSON.getMimeType()); diff --git a/cds-feature-ord/src/test/java/com/sap/cds/feature/ord/common/UtilsTest.java b/cds-feature-ord/src/test/java/com/sap/cds/feature/ord/common/UtilsTest.java index 9f144b0..078e09c 100644 --- a/cds-feature-ord/src/test/java/com/sap/cds/feature/ord/common/UtilsTest.java +++ b/cds-feature-ord/src/test/java/com/sap/cds/feature/ord/common/UtilsTest.java @@ -23,26 +23,46 @@ import com.sap.cds.services.runtime.CdsRuntime; import com.sap.cds.services.runtime.CdsRuntimeConfigurer; import com.sap.cds.services.utils.ErrorStatusException; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; +import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.hc.core5.http.ClassicHttpResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; class UtilsTest { private CdsRuntime cdsRuntime; + private HttpServletRequest httpServletRequest; private ClassicHttpResponse classicHttpResponse; @BeforeEach void setUp() { cdsRuntime = CdsRuntimeConfigurer.create().complete(); + httpServletRequest = mock(HttpServletRequest.class); classicHttpResponse = mock(ClassicHttpResponse.class); } + @SneakyThrows + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {" ", "value"}) + void whenHttpHeaderIsCalled_thenCorrectResultIsReturned(String input) { + doReturn(input).when(httpServletRequest).getHeader("header"); + + assertEquals( + (input == null || input.isBlank()) ? null : input, // + Utils.Http.header(httpServletRequest, "header")); + + verify(httpServletRequest).getHeader("header"); + verifyNoMoreInteractions(httpServletRequest); + } + @Test void whenHttpAssertSuccessfulIsCalled_thenNoExceptionIsThrown() { doReturn(200).when(classicHttpResponse).getCode(); diff --git a/pom.xml b/pom.xml index 6044305..b07a1e4 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 6.0.1 + 6.0.2 17 5.1.1 2.0.19