blockedHeaders();
}
diff --git a/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedRecorder.java b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedRecorder.java
index e795f9919..81acb9ca4 100644
--- a/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedRecorder.java
+++ b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedRecorder.java
@@ -8,7 +8,8 @@ public class HeadersAllowedRecorder {
public void setAllowedHeadersToSystemProperty() {
HeadersAllowedConfig allowedConfig = Arc.container().instance(HeadersAllowedConfig.class).get();
- allowedConfig.allowedHeaders().ifPresent(allowedHeaders -> System.setProperty("headers.allowed", allowedHeaders));
- allowedConfig.blockedHeaders().ifPresent(blockedHeaders -> System.setProperty("headers.blocked", blockedHeaders));
+
+ allowedConfig.allowedHeaders()
+ .ifPresent(allowedHeaders -> System.setProperty("headers.allowed", allowedHeaders));
}
}
diff --git a/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfig.java b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfig.java
new file mode 100644
index 000000000..bb5411a22
--- /dev/null
+++ b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfig.java
@@ -0,0 +1,33 @@
+package com.netcracker.cloud.framework.quarkus.contexts.xchannelrequestid;
+
+import io.quarkus.runtime.annotations.ConfigPhase;
+import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithName;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Configuration for headers that are restricted from propagation by default and may be
+ * optionally enabled via {@code quarkus.context.propagation.headers.enable.optional}.
+ *
+ * The framework owns a hard-coded list of restricted headers (currently {@code X-Channel-Request-Id})
+ * that are not propagated to outgoing requests by default. This configuration lets users opt in
+ * to propagating one or more of those restricted headers by listing them, comma-separated, in the
+ * {@code quarkus.context.propagation.headers.enable.optional} property.
+ *
+ */
+@ConfigMapping(prefix = "quarkus.context.propagation.headers")
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+public interface HeadersOptionalConfig {
+
+ /**
+ * Comma-separated list of restricted headers to enable for propagation. Header names that
+ * are not part of the framework's restricted list are ignored.
+ *
+ * When the value is absent or empty, the restricted list applies in full.
+ */
+ @WithName("enable.optional")
+ Optional> enableOptional();
+}
diff --git a/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalRecorder.java b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalRecorder.java
new file mode 100644
index 000000000..bbb3d786c
--- /dev/null
+++ b/core-context-propagation-quarkus/framework-contexts/runtime/src/main/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalRecorder.java
@@ -0,0 +1,25 @@
+package com.netcracker.cloud.framework.quarkus.contexts.xchannelrequestid;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import io.quarkus.arc.Arc;
+import io.quarkus.runtime.annotations.Recorder;
+
+/**
+ * Bridges {@link HeadersOptionalConfig} to the JVM system property
+ * {@link HeaderPropagationConfiguration#ENABLE_OPTIONAL_PROPERTY} which the non-Quarkus
+ * framework reads to compute the effective restricted list.
+ */
+@Recorder
+public class HeadersOptionalRecorder {
+
+ public void setEnableOptionalToSystemProperty() {
+ HeadersOptionalConfig config = Arc.container().instance(HeadersOptionalConfig.class).get();
+
+ config.enableOptional()
+ .filter(list -> !list.isEmpty())
+ .ifPresent(list -> System.setProperty(
+ HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY,
+ String.join(",", list)));
+ }
+}
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/pom.xml b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/pom.xml
index 15caa016e..01828114b 100644
--- a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/pom.xml
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud.quarkus
integration-tests
- 9.1.0-SNAPSHOT
+ 9.1.1-SNAPSHOT
context-propagation-reactive-test
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedConfigTest.java b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedConfigTest.java
index 0d5618251..34d672f7e 100644
--- a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedConfigTest.java
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/allowedheaders/HeadersAllowedConfigTest.java
@@ -6,10 +6,12 @@
import java.util.Optional;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
@QuarkusTest
class HeadersAllowedConfigTest {
+
@Inject
HeadersAllowedConfig headersAllowedConfig;
@@ -20,6 +22,4 @@ void shouldReadHeadersAllowedFromProperty() {
assertTrue(value.isPresent(), "quarkus.headers.allowed must be present");
assertEquals("test-quarkus.headers.allowed", value.get());
}
-
}
-
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersEnableOptionalRecorderEffectTest.java b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersEnableOptionalRecorderEffectTest.java
new file mode 100644
index 000000000..06b3f93c5
--- /dev/null
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersEnableOptionalRecorderEffectTest.java
@@ -0,0 +1,49 @@
+package com.netcracker.cloud.framework.quarkus.contexts.xchannelrequestid;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
+/**
+ * End-to-end integration scenario in a real running Quarkus application:
+ *
+ *
+ * - {@code application.properties} declares
+ * {@code quarkus.context.propagation.headers.enable.optional=X-Channel-Request-Id}.
+ * - At {@code RUNTIME_INIT}, {@code HeadersOptionalRecorder} reads the config from Arc
+ * and writes {@code context.propagation.headers.enable.optional=X-Channel-Request-Id} into the
+ * JVM system properties.
+ * - The non-Quarkus {@link HeaderPropagationConfiguration} reads the system property,
+ * drops {@code X-Channel-Request-Id} from the restricted list, and reports an empty
+ * effective restricted list.
+ *
+ *
+ */
+@QuarkusTest
+class HeadersEnableOptionalRecorderEffectTest {
+
+ @Test
+ void shouldExposeEnableOptionalValueAsSystemProperty() {
+ assertEquals(X_CHANNEL_REQUEST_ID,
+ System.getProperty("context.propagation.headers.enable.optional"),
+ "Recorder must propagate the quarkus.context.propagation.headers.enable.optional value " +
+ "to the context.propagation.headers.enable.optional system property.");
+ }
+
+ @Test
+ void shouldDropEnabledHeaderFromRestrictedList() {
+ HeaderPropagationConfiguration.resetCache();
+
+ assertTrue(HeaderPropagationConfiguration.restrictedHeaders().isEmpty(),
+ "Any entry of the restricted list must be dropped " +
+ "by the optional-enable configured in application.properties.");
+ assertFalse(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID),
+ "X-Channel-Request-Id must not be restricted when explicitly enabled.");
+ }
+}
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigNotSetTest.java b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigNotSetTest.java
new file mode 100644
index 000000000..e81384031
--- /dev/null
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigNotSetTest.java
@@ -0,0 +1,46 @@
+package com.netcracker.cloud.framework.quarkus.contexts.xchannelrequestid;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.QuarkusTestProfile;
+import io.quarkus.test.junit.TestProfile;
+import jakarta.inject.Inject;
+import org.junit.jupiter.api.Test;
+
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+/**
+ * Integration scenario: {@code quarkus.context.propagation.headers.enable.optional} is effectively
+ * not configured. Verifies that {@link HeadersOptionalConfig#enableOptional()} resolves to
+ * {@link java.util.Optional#empty()} — which is the signal the recorder uses to leave the
+ * system property untouched and let the restricted list apply in full.
+ *
+ * The module's {@code application.properties} sets the property to {@code X-Channel-Request-Id},
+ * so we use a {@link QuarkusTestProfile} that overrides it to an empty value. Under SmallRye Config
+ * semantics, an empty value for {@code Optional>} resolves to {@code Optional.empty()} —
+ * exactly the same observable state as "not configured".
+ */
+@QuarkusTest
+@TestProfile(HeadersOptionalConfigNotSetTest.NotSetProfile.class)
+class HeadersOptionalConfigNotSetTest {
+
+ @Inject
+ HeadersOptionalConfig headersOptionalConfig;
+
+ @Test
+ void shouldResolveToEmptyWhenNotConfigured() {
+ assertFalse(headersOptionalConfig.enableOptional().isPresent(),
+ "quarkus.context.propagation.headers.enable.optional must resolve to Optional.empty() " +
+ "when no value is configured");
+ }
+
+ public static class NotSetProfile implements QuarkusTestProfile {
+
+ @Override
+ public Map getConfigOverrides() {
+ return Map.of("quarkus.context.propagation.headers.enable.optional", "");
+ }
+ }
+}
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigTest.java b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigTest.java
new file mode 100644
index 000000000..b4cd5358d
--- /dev/null
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/java/com/netcracker/cloud/framework/quarkus/contexts/xchannelrequestid/HeadersOptionalConfigTest.java
@@ -0,0 +1,30 @@
+package com.netcracker.cloud.framework.quarkus.contexts.xchannelrequestid;
+
+import io.quarkus.test.junit.QuarkusTest;
+import jakarta.inject.Inject;
+import org.junit.jupiter.api.Test;
+
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
+@QuarkusTest
+class HeadersOptionalConfigTest {
+
+ @Inject
+ HeadersOptionalConfig headersOptionalConfig;
+
+ @Test
+ void shouldReadEnableOptionalFromProperty() {
+ Optional> value = headersOptionalConfig.enableOptional();
+
+ assertTrue(value.isPresent(),
+ "quarkus.context.propagation.headers.enable.optional must be present when configured");
+ assertEquals(List.of(X_CHANNEL_REQUEST_ID), value.get(),
+ "SmallRye must parse the comma-separated value into a list");
+ }
+}
diff --git a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/resources/application.properties b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/resources/application.properties
index 6fecc5866..463e3b318 100644
--- a/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/resources/application.properties
+++ b/core-context-propagation-quarkus/integration-tests/context-propagation-reactive-test/src/test/resources/application.properties
@@ -4,4 +4,6 @@ quarkus.devservices.enabled=false
quarkus.rest-client.my-client.url=http://localhost:${quarkus.http.test-port}
quarkus.headers.allowed=test-quarkus.headers.allowed
+
+quarkus.context.propagation.headers.enable.optional=X-Channel-Request-Id
headers.allowed=test-headers.allowed
diff --git a/core-context-propagation-quarkus/integration-tests/pom.xml b/core-context-propagation-quarkus/integration-tests/pom.xml
index 42bd7156a..69ed13318 100644
--- a/core-context-propagation-quarkus/integration-tests/pom.xml
+++ b/core-context-propagation-quarkus/integration-tests/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud.quarkus
cloud-core-context-propagation-build-parent
- 9.1.0-SNAPSHOT
+ 9.1.1-SNAPSHOT
../build-parent/pom.xml
integration-tests
diff --git a/core-context-propagation-quarkus/pom.xml b/core-context-propagation-quarkus/pom.xml
index 7972156b8..815d71d51 100644
--- a/core-context-propagation-quarkus/pom.xml
+++ b/core-context-propagation-quarkus/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.netcracker.cloud.quarkus
- 9.1.0-SNAPSHOT
+ 9.1.1-SNAPSHOT
cloud-core-context-propagation
Cloud-Core Context Propagation
diff --git a/core-context-propagation-quarkus/report-aggregate/pom.xml b/core-context-propagation-quarkus/report-aggregate/pom.xml
index 6f474eab9..52c5da4fd 100644
--- a/core-context-propagation-quarkus/report-aggregate/pom.xml
+++ b/core-context-propagation-quarkus/report-aggregate/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud.quarkus
cloud-core-context-propagation-build-parent
- 9.1.0-SNAPSHOT
+ 9.1.1-SNAPSHOT
../build-parent/pom.xml
pom
diff --git a/core-context-propagation/README.md b/core-context-propagation/README.md
index 40f550846..7a4b4e456 100644
--- a/core-context-propagation/README.md
+++ b/core-context-propagation/README.md
@@ -147,32 +147,85 @@ Propagates and allows to get `X-Channel-Request-Id` value. If an incoming reques
**Default behavior:** `X-Channel-Request-Id` is NOT propagated to outgoing requests.
-**Enabling propagation:** To allow `X-Channel-Request-Id` to be propagated to outgoing requests, remove it from the
-blacklist using one of the following methods:
+#### Restricted contexts
-1. **Via environment variable:**
-```text
-HEADERS_BLOCKED=
+The framework owns a hard-coded list of restricted contexts — headers that are not propagated
+to outgoing requests by default. It currently contains:
+
+- `X-Channel-Request-Id`
+
+The list itself cannot be changed from configuration. The only externally visible knob is the
+`context.propagation.headers.enable.optional` property, which names headers from that list that
+should be enabled for propagation.
+
+#### `context.propagation.headers.enable.optional` property
+
+The property carries a comma-separated list of header names. Every name that matches a restricted
+context is dropped from the effective restricted list (and thus becomes eligible for propagation).
+Names that are not in the restricted list have no effect.
+
+Examples:
+
+| Property value | Effect |
+|---|---|
+| not set / empty | Restricted list applies in full. `X-Channel-Request-Id` is not propagated. |
+| `X-Channel-Request-Id` | `X-Channel-Request-Id` is propagated to outgoing requests. |
+| `Some-Other-Header` | No effect — the header is not in the restricted list. |
+| `X-Channel-Request-Id, Some-Other-Header` | `X-Channel-Request-Id` is propagated; the second entry is ignored. |
+
+Comparison is case-insensitive. Whitespace around comma-separated entries is trimmed.
+
+#### How to set the property
+
+**Spring (`application.properties` / `application.yml`):**
+
+```properties
+context.propagation.headers.enable.optional=X-Channel-Request-Id
```
-2. **Via system property:**
-```text
--Dheaders.blocked=
+```yaml
+context:
+ propagation:
+ headers:
+ enable:
+ optional: X-Channel-Request-Id
```
-3. **Via application.properties (Spring):**
+**Via JVM system property:**
+
```text
-headers.blocked=
+-Dcontext.propagation.headers.enable.optional=X-Channel-Request-Id
+```
+
+**Sourcing the value from an environment variable**
+
+Instead of hard-coding the list of enabled headers in `application.properties` / `application.yml`,
+the value can be sourced from an environment variable using a standard `${ENV_VAR:default}` placeholder.
+This way the file structure stays the same across environments and the actual list is controlled
+externally — through an ENV variable that is set somewhere outside Spring (a container manifest,
+a Helm chart, `systemd` unit, CI variable, local shell, etc.).
+
+```properties
+context.propagation.headers.enable.optional=${CONTEXT_PROPAGATION_HEADERS_ENABLE_OPTIONAL:}
+```
+
+or, equivalently, in `application.yml`:
+
+```yaml
+context:
+ propagation:
+ headers:
+ enable:
+ optional: ${CONTEXT_PROPAGATION_HEADERS_ENABLE_OPTIONAL:}
```
-**`headers.blocked` rules and limitations**
+The trailing `:` (empty default) lets the property gracefully resolve to an empty value when the ENV
+variable is absent — under our model that is equivalent to "not configured" and the restricted list
+applies in full. Setting `CONTEXT_PROPAGATION_HEADERS_ENABLE_OPTIONAL=X-Channel-Request-Id` in the runtime
+environment enables that header for propagation without touching the YAML.
-- Source priority: system property `headers.blocked` overrides environment variable `HEADERS_BLOCKED`.
-- Default when not configured at all: `X-Channel-Request-Id` is blocked.
-- Explicit empty value (`headers.blocked=` / `HEADERS_BLOCKED=`): blacklist is empty (nothing is blocked).
-- Explicit non-empty value with valid headers (for example `headers.blocked=Some-Header`): only listed headers are blocked.
-- `X-Request-Id` is non-blockable: if it is listed in `headers.blocked`/`HEADERS_BLOCKED`, it is ignored.
-- If configured value contains only non-blockable entries (for example only `X-Request-Id`), default block is applied and `X-Channel-Request-Id` remains blocked.
+The ENV variable name in the placeholder is just a contract between the application file and the runtime
+environment — it can be any name, as long as both sides agree.
**MDC Integration:**
The `X-Channel-Request-Id` is automatically integrated with SLF4J's Mapped Diagnostic Context (MDC) for seamless logging.
@@ -802,12 +855,4 @@ List of supported libraries:
`context-propagation-test-extensions` module provides Junit extension that can help running context tests from your IDE.
It addresses the problem that maven plugins execution can be skipped when running tests directly from IDE. This leads to issue
that jandex index isn't built and context defined in your module aren't loaded. `JandexContextLoaderExtension` Junit resolves
-this problem by building jandex index and loading contexts from it before tests are executed. You can add it to your tests using standard
-Junit annotation `@ExtendWith`:
-```
-@ExtendWith(JandexContextLoaderExtension.class)
-class SampleContextTest {
- ...
-}
-```
-
+this problem by building jandex index and loading contexts from it before tests are executed. You can add it t
\ No newline at end of file
diff --git a/core-context-propagation/api-tests/pom.xml b/core-context-propagation/api-tests/pom.xml
index 27c33b289..65e864a43 100644
--- a/core-context-propagation/api-tests/pom.xml
+++ b/core-context-propagation/api-tests/pom.xml
@@ -4,7 +4,7 @@
context-propagation
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
diff --git a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/IncomingContextDataFactory.java b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/IncomingContextDataFactory.java
index 20d6d3a25..600a7dec3 100644
--- a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/IncomingContextDataFactory.java
+++ b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/IncomingContextDataFactory.java
@@ -1,6 +1,7 @@
package com.netcracker.cloud.contexts;
import com.netcracker.cloud.context.propagation.core.contextdata.IncomingContextData;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
import java.util.*;
@@ -100,7 +101,7 @@ private static Map xVersionData() {
private static Map xChannelRequestIdData() {
Map requestData = new HashMap<>();
- requestData.put("X-Channel-Request-Id", UUID.randomUUID().toString());
+ requestData.put(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, UUID.randomUUID().toString());
return requestData;
}
}
diff --git a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdContextObjectApiTest.java b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdContextObjectApiTest.java
index 417aa3c8b..8aaa858b1 100644
--- a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdContextObjectApiTest.java
+++ b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdContextObjectApiTest.java
@@ -15,7 +15,6 @@
import static org.junit.jupiter.api.Assertions.*;
-
class XChannelRequestIdContextObjectApiTest {
@BeforeEach
@@ -33,7 +32,7 @@ void testDefaultXChannelRequestId() {
void testXChannelRequestIdFromIncomingContextData() {
IncomingContextData xChannelRequestIdIncomingContextData = IncomingContextDataFactory.getXChannelRequestIdIncomingContextData();
XChannelRequestIdContextObject xChannelRequestIdContextObject = new XChannelRequestIdContextObject(xChannelRequestIdIncomingContextData);
- String expectedValue = (String) xChannelRequestIdIncomingContextData.get("X-Channel-Request-Id");
+ String expectedValue = (String) xChannelRequestIdIncomingContextData.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
assertEquals(expectedValue, xChannelRequestIdContextObject.getChannelRequestId());
}
@@ -52,7 +51,7 @@ void testGetXChannelRequestIdFromContextManager() {
RequestContextPropagation.initRequestContext(xChannelRequestIdIncomingContextData);
XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
- assertEquals(xChannelRequestIdIncomingContextData.get("X-Channel-Request-Id"), xChannelRequestIdContextObject.getChannelRequestId());
+ assertEquals(xChannelRequestIdIncomingContextData.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME), xChannelRequestIdContextObject.getChannelRequestId());
// No data, default placeholder "-"
RequestContextPropagation.initRequestContext(null);
diff --git a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdProviderApiTest.java b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdProviderApiTest.java
index 19e3efb9a..58b276bcc 100644
--- a/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdProviderApiTest.java
+++ b/core-context-propagation/api-tests/src/test/java/com/netcracker/cloud/contexts/xchannelrequestid/XChannelRequestIdProviderApiTest.java
@@ -15,12 +15,6 @@
class XChannelRequestIdProviderApiTest {
- @Test
- void checkXChannelRequestIdContextName() {
- assertEquals("X-Channel-Request-Id", XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
- assertEquals("X-Channel-Request-Id", new XChannelRequestIdContextProvider().contextName());
- }
-
@Test
void xChannelRequestIdProviderMustHaveDefaultConstructor() {
XChannelRequestIdContextProvider xChannelRequestIdContextProvider = new XChannelRequestIdContextProvider();
@@ -33,7 +27,7 @@ void xChannelRequestIdProvideMethodWithIncomingContextData() {
IncomingContextData xChannelRequestIdIncomingContextData = IncomingContextDataFactory.getXChannelRequestIdIncomingContextData();
XChannelRequestIdContextObject xChannelRequestIdContextObject = xChannelRequestIdContextProvider.provide(xChannelRequestIdIncomingContextData);
- assertEquals(xChannelRequestIdIncomingContextData.get("X-Channel-Request-Id"), xChannelRequestIdContextObject.getChannelRequestId());
+ assertEquals(xChannelRequestIdIncomingContextData.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME), xChannelRequestIdContextObject.getChannelRequestId());
}
@Test
diff --git a/core-context-propagation/context-propagation-bom/pom.xml b/core-context-propagation/context-propagation-bom/pom.xml
index 421ebc3ba..115753bc2 100644
--- a/core-context-propagation/context-propagation-bom/pom.xml
+++ b/core-context-propagation/context-propagation-bom/pom.xml
@@ -5,7 +5,7 @@
com.netcracker.cloud
context-propagation-bom
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
pom
diff --git a/core-context-propagation/context-propagation-core/pom.xml b/core-context-propagation/context-propagation-core/pom.xml
index f0331b791..5b5db2512 100644
--- a/core-context-propagation/context-propagation-core/pom.xml
+++ b/core-context-propagation/context-propagation-core/pom.xml
@@ -5,7 +5,7 @@
context-propagation
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
diff --git a/core-context-propagation/context-propagation-report-aggregate/pom.xml b/core-context-propagation/context-propagation-report-aggregate/pom.xml
index ebd44dcc9..8ee5e16a6 100644
--- a/core-context-propagation/context-propagation-report-aggregate/pom.xml
+++ b/core-context-propagation/context-propagation-report-aggregate/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud
context-propagation
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
pom
diff --git a/core-context-propagation/context-propagation-test-extensions/pom.xml b/core-context-propagation/context-propagation-test-extensions/pom.xml
index 49868d3c0..f0608ad23 100644
--- a/core-context-propagation/context-propagation-test-extensions/pom.xml
+++ b/core-context-propagation/context-propagation-test-extensions/pom.xml
@@ -5,7 +5,7 @@
context-propagation
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
diff --git a/core-context-propagation/framework-contexts/pom.xml b/core-context-propagation/framework-contexts/pom.xml
index 23f609278..f2802639d 100644
--- a/core-context-propagation/framework-contexts/pom.xml
+++ b/core-context-propagation/framework-contexts/pom.xml
@@ -4,7 +4,7 @@
context-propagation
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
diff --git a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersContextObject.java b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersContextObject.java
index f991e8c05..10d65d869 100644
--- a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersContextObject.java
+++ b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersContextObject.java
@@ -8,6 +8,7 @@
import com.netcracker.cloud.context.propagation.core.contexts.SerializableContext;
import com.netcracker.cloud.context.propagation.core.contexts.SerializableDataContext;
import com.netcracker.cloud.context.propagation.core.contexts.common.RequestContextObject;
+
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -24,7 +25,7 @@ public AllowedHeadersContextObject(@Nullable IncomingContextData contextData, Li
if (contextData != null) {
for (String headerName : this.allowedHeaders) {
- if (!HeaderPropagationConfiguration.isBlacklisted(headerName) && contextData.get(headerName) != null) {
+ if (contextData.get(headerName) != null) {
headers.put(headerName, (String) contextData.get(headerName));
}
}
@@ -41,9 +42,7 @@ private static Map filterBlocked(Map headers) {
Map filteredHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
if (headers != null) {
for (Map.Entry entry : headers.entrySet()) {
- if (!HeaderPropagationConfiguration.isBlacklisted(entry.getKey())) {
- filteredHeaders.put(entry.getKey(), entry.getValue());
- }
+ filteredHeaders.put(entry.getKey(), entry.getValue());
}
}
return filteredHeaders;
@@ -52,9 +51,7 @@ private static Map filterBlocked(Map headers) {
@Override
public void serialize(OutgoingContextData outgoingContextData) {
for (String headerName : headers.keySet()) {
- if (!HeaderPropagationConfiguration.isBlacklisted(headerName)) {
- outgoingContextData.set(headerName, headers.get(headerName));
- }
+ outgoingContextData.set(headerName, headers.get(headerName));
}
}
@@ -67,7 +64,7 @@ public Map getDefault() {
Map> headersFromContext = ((RequestContextObject) ContextManager.get("request")).getHttpHeaders();
Map result = new HashMap<>();
for (String headerName : headersFromContext.keySet()) {
- if (allowedHeaders.contains(headerName) && !HeaderPropagationConfiguration.isBlacklisted(headerName)) {
+ if (allowedHeaders.contains(headerName)) {
result.put(headerName, headersFromContext.get(headerName).get(0));
}
}
@@ -77,9 +74,7 @@ public Map getDefault() {
@Override
public void propagate(OutgoingContextData outgoingContextData) {
for (String headerName : headers.keySet()) {
- if (!HeaderPropagationConfiguration.isBlacklisted(headerName)) {
- outgoingContextData.set(headerName, headers.get(headerName));
- }
+ outgoingContextData.set(headerName, headers.get(headerName));
}
}
diff --git a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfiguration.java b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfiguration.java
deleted file mode 100644
index aa9de6028..000000000
--- a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfiguration.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.netcracker.cloud.framework.contexts.allowedheaders;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
-
-public final class HeaderPropagationConfiguration {
- public static final String HEADERS_BLOCKED_PROPERTY = "headers.blocked";
- public static final String HEADERS_BLOCKED_ENV = "HEADERS_BLOCKED";
- public static final List DEFAULT_BLOCKED_HEADERS =
- List.of("X-Channel-Request-Id");
-
- public static final List NON_BLOCKABLE_HEADERS =
- List.of("X-Request-Id");
-
- private static final AtomicReference cachedHeaders = new AtomicReference<>(null);
-
- private static final class CachedHeaders {
- final List list;
- final Set lowerSet;
-
- CachedHeaders(List list) {
- this.list = list;
- this.lowerSet = list.stream()
- .filter(h -> h != null && !h.isBlank())
- .map(h -> h.toLowerCase(Locale.ROOT))
- .collect(Collectors.toUnmodifiableSet());
- }
- }
-
- private HeaderPropagationConfiguration() {
- }
-
- private static CachedHeaders getOrInit() {
- CachedHeaders local = cachedHeaders.get();
- if (local == null) {
- synchronized (HeaderPropagationConfiguration.class) {
- local = cachedHeaders.get();
- if (local == null) {
- local = new CachedHeaders(readBlockedHeaders());
- cachedHeaders.set(local);
- }
- }
- }
- return local;
- }
-
- public static List blockedHeaders() {
- return getOrInit().list;
- }
-
- public static void resetCache() {
- cachedHeaders.set(null);
- }
-
- public static boolean isBlacklisted(String headerName) {
- if (headerName == null || headerName.isBlank()) {
- return false;
- }
- return getOrInit().lowerSet.contains(headerName.toLowerCase(Locale.ROOT));
- }
-
- private static List readBlockedHeaders() {
- boolean propertySpecified = System.getProperties().containsKey(HEADERS_BLOCKED_PROPERTY);
- String envValue = System.getenv(HEADERS_BLOCKED_ENV);
- boolean envSpecified = envValue != null;
-
- String blockedHeaders = propertySpecified
- ? System.getProperty(HEADERS_BLOCKED_PROPERTY)
- : envValue;
-
- boolean anySourceSpecified = propertySpecified || envSpecified;
-
- if (blockedHeaders == null || blockedHeaders.isBlank()) {
- return anySourceSpecified ? Collections.emptyList() : DEFAULT_BLOCKED_HEADERS;
- }
-
- List configured = Arrays.stream(blockedHeaders.split(","))
- .map(String::trim)
- .filter(s -> !s.isEmpty())
- .filter(s -> NON_BLOCKABLE_HEADERS.stream()
- .noneMatch(s::equalsIgnoreCase))
- .toList();
-
- return configured.isEmpty() ? DEFAULT_BLOCKED_HEADERS : configured;
- }
-}
diff --git a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/HeaderPropagationConfiguration.java b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/HeaderPropagationConfiguration.java
new file mode 100644
index 000000000..00d29ed31
--- /dev/null
+++ b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/HeaderPropagationConfiguration.java
@@ -0,0 +1,112 @@
+package com.netcracker.cloud.framework.contexts.xchannelrequestid;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * Computes the effective set of restricted headers — i.e. headers that are NOT propagated to
+ * outgoing requests by default.
+ *
+ * Model
+ *
+ * - The framework owns a hard-coded list of restricted headers
+ * ({@link #RESTRICTED_HEADERS}). It cannot be changed from configuration. By default it
+ * restricts {@code X-Channel-Request-Id}.
+ * - A user-facing system property {@value #ENABLE_OPTIONAL_PROPERTY} carries a
+ * comma-separated list of restricted header names that should be enabled for propagation.
+ * Names that are not in the restricted list have no effect.
+ *
+ *
+ */
+public final class HeaderPropagationConfiguration {
+
+ /** System property carrying header names to enable for propagation, comma-separated. */
+ public static final String ENABLE_OPTIONAL_PROPERTY = "context.propagation.headers.enable.optional";
+
+ /**
+ * Hard-coded list of restricted headers — contexts that the framework refuses to propagate
+ * unless explicitly enabled via {@link #ENABLE_OPTIONAL_PROPERTY}.
+ */
+ public static final List RESTRICTED_HEADERS = List.of(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
+
+ private static final AtomicReference cachedHeaders = new AtomicReference<>(null);
+
+ private static final class CachedHeaders {
+ final List list;
+ final Set lowerSet;
+
+ CachedHeaders(List list) {
+ this.list = list;
+ this.lowerSet = list.stream()
+ .filter(h -> h != null && !h.isBlank())
+ .map(h -> h.toLowerCase(Locale.ROOT))
+ .collect(Collectors.toUnmodifiableSet());
+ }
+ }
+
+ private HeaderPropagationConfiguration() {
+ }
+
+ private static CachedHeaders getOrInit() {
+ CachedHeaders local = cachedHeaders.get();
+ if (local == null) {
+ synchronized (HeaderPropagationConfiguration.class) {
+ local = cachedHeaders.get();
+ if (local == null) {
+ local = new CachedHeaders(computeEffectiveRestricted());
+ cachedHeaders.set(local);
+ }
+ }
+ }
+ return local;
+ }
+
+ /**
+ * @return effective list of headers that are restricted from propagation right now
+ * (the hard-coded {@link #RESTRICTED_HEADERS} minus any enabled via
+ * {@link #ENABLE_OPTIONAL_PROPERTY}).
+ */
+ public static List restrictedHeaders() {
+ return getOrInit().list;
+ }
+
+ public static void resetCache() {
+ cachedHeaders.set(null);
+ }
+
+ /**
+ * @return {@code true} iff the given header is currently restricted from propagation.
+ */
+ public static boolean isRestricted(String headerName) {
+ if (headerName == null || headerName.isBlank()) {
+ return false;
+ }
+ return getOrInit().lowerSet.contains(headerName.toLowerCase(Locale.ROOT));
+ }
+
+ private static List computeEffectiveRestricted() {
+ Set enabled = readEnabledOptional();
+ if (enabled.isEmpty()) {
+ return RESTRICTED_HEADERS;
+ }
+ return RESTRICTED_HEADERS.stream()
+ .filter(h -> !enabled.contains(h.toLowerCase(Locale.ROOT)))
+ .toList();
+ }
+
+ private static Set readEnabledOptional() {
+ String raw = System.getProperty(ENABLE_OPTIONAL_PROPERTY);
+ if (raw == null || raw.isBlank()) {
+ return Set.of();
+ }
+ return Arrays.stream(raw.split(","))
+ .map(String::trim)
+ .filter(s -> !s.isEmpty())
+ .map(s -> s.toLowerCase(Locale.ROOT))
+ .collect(Collectors.toUnmodifiableSet());
+ }
+}
diff --git a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObject.java b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObject.java
index 9d2160195..f5bb5cd99 100644
--- a/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObject.java
+++ b/core-context-propagation/framework-contexts/src/main/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObject.java
@@ -5,7 +5,7 @@
import com.netcracker.cloud.context.propagation.core.contexts.ResponsePropagatableContext;
import com.netcracker.cloud.context.propagation.core.contexts.SerializableContext;
import com.netcracker.cloud.context.propagation.core.contexts.SerializableDataContext;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
@@ -17,7 +17,7 @@
*/
public class XChannelRequestIdContextObject implements SerializableContext,
ResponsePropagatableContext, SerializableDataContext {
- public static final String X_CHANNEL_REQUEST_ID = "X-Channel-Request-Id";
+ public static final String X_CHANNEL_REQUEST_ID = XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME;
private String channelRequestId;
@@ -35,7 +35,7 @@ public XChannelRequestIdContextObject(String channelRequestId) {
@Override
public void serialize(OutgoingContextData outgoingContextData) {
- if (!HeaderPropagationConfiguration.isBlacklisted(X_CHANNEL_REQUEST_ID)) {
+ if (!HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID)) {
outgoingContextData.set(X_CHANNEL_REQUEST_ID, channelRequestId);
}
}
@@ -51,7 +51,7 @@ public void propagate(OutgoingContextData outgoingContextData) {
@Override
public Map getSerializableContextData() {
- if (HeaderPropagationConfiguration.isBlacklisted(X_CHANNEL_REQUEST_ID)) {
+ if (HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID)) {
return Collections.emptyMap();
}
return Map.of(X_CHANNEL_REQUEST_ID, channelRequestId);
diff --git a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersPropertyTest.java b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersPropertyTest.java
index 51233e083..0d52376bd 100644
--- a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersPropertyTest.java
+++ b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/AllowedHeadersPropertyTest.java
@@ -5,6 +5,8 @@
import com.netcracker.cloud.framework.contexts.data.ContextDataRequest;
import com.netcracker.cloud.framework.contexts.data.ContextDataResponse;
import com.netcracker.cloud.framework.contexts.helper.AbstractContextTestWithProperties;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
diff --git a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfigurationTest.java b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfigurationTest.java
index cf5944adf..d5fea098b 100644
--- a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfigurationTest.java
+++ b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/allowedheaders/HeaderPropagationConfigurationTest.java
@@ -1,137 +1,88 @@
package com.netcracker.cloud.framework.contexts.allowedheaders;
-import java.util.List;
-
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
-import uk.org.webcompere.systemstubs.jupiter.SystemStub;
-import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;
-@ExtendWith(SystemStubsExtension.class)
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
class HeaderPropagationConfigurationTest {
- @SystemStub
- private EnvironmentVariables environmentVariables = new EnvironmentVariables("TEST_PROP_FOR_ENV_SETUP", "1");
@BeforeEach
void setup() {
- System.clearProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY);
+ System.clearProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY);
HeaderPropagationConfiguration.resetCache();
}
@AfterEach
void cleanup() {
- System.clearProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY);
+ System.clearProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY);
HeaderPropagationConfiguration.resetCache();
}
@Test
- void shouldBlacklistHeaderByPropertyName() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "X-Channel-Request-Id");
- HeaderPropagationConfiguration.resetCache();
-
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("x-channel-request-id"));
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
+ void shouldBlockXChannelRequestIdByDefault() {
+ Assertions.assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID));
+ Assertions.assertTrue(HeaderPropagationConfiguration.isRestricted("x-channel-request-id"));
+ Assertions.assertEquals(HeaderPropagationConfiguration.RESTRICTED_HEADERS,
+ HeaderPropagationConfiguration.restrictedHeaders());
}
@Test
- void shouldParseCommaSeparatedBlacklistedHeaders() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "X-Channel-Request-Id, X-Request-Id");
+ void shouldNotBlockXChannelRequestIdWhenExempted() {
+ System.setProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY, X_CHANNEL_REQUEST_ID);
HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("x-channel-request-id"));
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("Custom-Header"));
- }
-
- @Test
- void shouldBlacklistXChannelRequestIdByDefault() {
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("x-channel-request-id"));
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted("x-channel-request-id"));
+ Assertions.assertTrue(HeaderPropagationConfiguration.restrictedHeaders().isEmpty());
}
@Test
- void shouldNotBlacklistXChannelRequestIdWhenBlockedHeadersExplicitlyEmpty() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "");
+ void shouldApplyExemptionsCaseInsensitively() {
+ System.setProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY, "x-channel-request-id");
HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("x-channel-request-id"));
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID));
}
@Test
- void shouldNotBlacklistXChannelRequestIdWhenOtherHeadersExplicitlyBlocked() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "X-Request-Id");
+ void shouldIgnoreUnknownExemptionEntries() {
+ // Names that are not in the restricted list must not change anything.
+ System.setProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY, "Custom-Header, X-Request-Id");
HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
+ Assertions.assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID),
+ "Restricted list must remain unchanged when no entry matches it");
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted("Custom-Header"));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted("X-Request-Id"));
}
@Test
- void shouldApplyDefaultBlacklistWhenOnlyNonBlockableHeadersConfigured() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "X-Request-Id, x-request-id");
+ void shouldTreatEmptyExemptionPropertyAsNoExemption() {
+ System.setProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY, "");
HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- Assertions.assertEquals(HeaderPropagationConfiguration.DEFAULT_BLOCKED_HEADERS,
- HeaderPropagationConfiguration.blockedHeaders());
+ Assertions.assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID));
+ Assertions.assertEquals(HeaderPropagationConfiguration.RESTRICTED_HEADERS,
+ HeaderPropagationConfiguration.restrictedHeaders());
}
@Test
- void shouldBlacklistHeaderByEnvWhenPropertyNotSet() throws Exception {
- environmentVariables.set(HeaderPropagationConfiguration.HEADERS_BLOCKED_ENV, "X-Request-Id");
- try {
- HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- } finally {
- environmentVariables.remove(HeaderPropagationConfiguration.HEADERS_BLOCKED_ENV);
- HeaderPropagationConfiguration.resetCache();
- }
- }
-
- @Test
- void shouldNotBlockXRequestIdEvenWhenExplicitlyListed() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "X-Channel-Request-Id, X-Request-Id");
+ void shouldTreatBlankAndCommaOnlyExemptionPropertyAsNoExemption() {
+ System.setProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY, " , ,, ");
HeaderPropagationConfiguration.resetCache();
-
- // X-Request-Id is never blocked
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Request-Id"));
- // X-Channel-Request-Id blocked
- Assertions.assertTrue(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- // there is no X-Request-Id in a list
- Assertions.assertFalse(HeaderPropagationConfiguration.blockedHeaders()
- .stream().anyMatch(h -> h.equalsIgnoreCase("X-Request-Id")));
- }
-
- @Test
- void shouldReturnEmptyListWhenEnvExplicitlyEmpty() throws Exception {
- environmentVariables.set(HeaderPropagationConfiguration.HEADERS_BLOCKED_ENV, "");
- try {
- HeaderPropagationConfiguration.resetCache();
- Assertions.assertFalse(HeaderPropagationConfiguration.isBlacklisted("X-Channel-Request-Id"));
- Assertions.assertTrue(HeaderPropagationConfiguration.blockedHeaders().isEmpty());
- } finally {
- environmentVariables.remove(HeaderPropagationConfiguration.HEADERS_BLOCKED_ENV);
- HeaderPropagationConfiguration.resetCache();
- }
+
+ Assertions.assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID));
}
-
+
@Test
- void shouldBlockedHeadersReturnCorrectList() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, "Custom-Header, X-Request-Id");
- HeaderPropagationConfiguration.resetCache();
-
- List blocked = HeaderPropagationConfiguration.blockedHeaders();
- Assertions.assertTrue(blocked.contains("Custom-Header"));
- Assertions.assertFalse(blocked.stream().anyMatch(h -> h.equalsIgnoreCase("X-Request-Id")));
+ void isRestrictedShouldReturnFalseForNullAndBlank() {
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted(null));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted(""));
+ Assertions.assertFalse(HeaderPropagationConfiguration.isRestricted(" "));
}
}
diff --git a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/helper/AbstractContextTestWithProperties.java b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/helper/AbstractContextTestWithProperties.java
index be887345a..df5f66c83 100644
--- a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/helper/AbstractContextTestWithProperties.java
+++ b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/helper/AbstractContextTestWithProperties.java
@@ -3,7 +3,7 @@
import java.util.Map;
import com.netcracker.cloud.context.propagation.core.ContextManager;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
public abstract class AbstractContextTestWithProperties {
diff --git a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObjectPropagationTest.java b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObjectPropagationTest.java
index e806c6573..21cd00a70 100644
--- a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObjectPropagationTest.java
+++ b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/framework/contexts/xchannelrequestid/XChannelRequestIdContextObjectPropagationTest.java
@@ -7,7 +7,6 @@
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.context.propagation.core.RequestContextPropagation;
import com.netcracker.cloud.context.propagation.core.contextdata.IncomingContextData;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
import com.netcracker.cloud.framework.contexts.data.ContextDataRequest;
import com.netcracker.cloud.framework.contexts.data.ContextDataResponse;
import com.netcracker.cloud.framework.contexts.data.SimpleIncomingContextData;
@@ -20,10 +19,8 @@
import java.util.Map;
import static com.netcracker.cloud.framework.contexts.data.ContextDataRequest.CUSTOM_HEADER;
-import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME;
class XChannelRequestIdContextObjectPropagationTest extends AbstractContextTestWithProperties {
- public static final String X_CHANNEL_REQUEST_ID = "X-Channel-Request-Id";
static Map properties = Map.of("headers.allowed", CUSTOM_HEADER);
@@ -40,58 +37,55 @@ static void cleanup() {
@Test
void getDefaultValue() {
RequestContextPropagation.initRequestContext(new DefaultContextDataRequest()); // filter
- Assertions.assertNotNull(ContextManager.get(X_CHANNEL_REQUEST_ID));
- XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(X_CHANNEL_REQUEST_ID);
+ Assertions.assertNotNull(ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
+ XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
Assertions.assertNotNull(xChannelRequestIdContextObject.getChannelRequestId());
}
@Test
void testXChannelRequestIdPropagation() {
RequestContextPropagation.initRequestContext(new ContextDataRequest()); // filter
- Assertions.assertNotNull(ContextManager.get(X_CHANNEL_REQUEST_ID));
- XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(X_CHANNEL_REQUEST_ID);
+ Assertions.assertNotNull(ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
+ XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
Assertions.assertNotNull(xChannelRequestIdContextObject.getChannelRequestId());
- ContextManager.set(X_CHANNEL_REQUEST_ID, xChannelRequestIdContextObject);
+ ContextManager.set(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, xChannelRequestIdContextObject);
ContextDataResponse responseContextData = new ContextDataResponse();
RequestContextPropagation.populateResponse(responseContextData);
- Assertions.assertNull(responseContextData.getResponseHeaders().get(X_CHANNEL_REQUEST_ID));
+ Assertions.assertNull(responseContextData.getResponseHeaders().get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
}
@Test
void testXChannelRequestIdPropagationWithResponsePropagatableData() {
RequestContextPropagation.initRequestContext(new ContextDataRequest()); // filter
- XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(X_CHANNEL_REQUEST_ID);
+ XChannelRequestIdContextObject xChannelRequestIdContextObject = ContextManager.get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
Assertions.assertNotNull(xChannelRequestIdContextObject.getChannelRequestId());
- ContextManager.set(X_CHANNEL_REQUEST_ID, xChannelRequestIdContextObject);
+ ContextManager.set(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, xChannelRequestIdContextObject);
ContextDataResponse responseContextData = new ContextDataResponse();
RequestContextPropagation.setResponsePropagatableData(responseContextData);
- Assertions.assertEquals("-", responseContextData.getResponseHeaders().get(X_CHANNEL_REQUEST_ID));
+ Assertions.assertEquals("-", responseContextData.getResponseHeaders().get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
}
@Test
- void testXChannelRequestIdPropagationIsBlockedWhenConfigured() {
- System.setProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY, X_CHANNEL_REQUEST_ID);
+ void testXChannelRequestIdPropagationIsBlockedByRestrictedList() {
+ System.clearProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY);
HeaderPropagationConfiguration.resetCache();
- try {
- RequestContextPropagation.initRequestContext(new ContextDataRequest()); // filter
- ContextDataResponse responseContextData = new ContextDataResponse();
- RequestContextPropagation.setResponsePropagatableData(responseContextData);
- Assertions.assertEquals("-", responseContextData.getResponseHeaders().get(X_CHANNEL_REQUEST_ID));
-
- Map> serializableContextData = ContextManager.getSerializableContextData();
- Assertions.assertTrue(serializableContextData.getOrDefault(X_CHANNEL_REQUEST_ID_CONTEXT_NAME, Collections.emptyMap()).isEmpty());
- } finally {
- System.clearProperty(HeaderPropagationConfiguration.HEADERS_BLOCKED_PROPERTY);
- }
+
+ RequestContextPropagation.initRequestContext(new ContextDataRequest()); // filter
+ ContextDataResponse responseContextData = new ContextDataResponse();
+ RequestContextPropagation.setResponsePropagatableData(responseContextData);
+ Assertions.assertEquals("-", responseContextData.getResponseHeaders().get(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
+
+ Map> serializableContextData = ContextManager.getSerializableContextData();
+ Assertions.assertTrue(serializableContextData.getOrDefault(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, Collections.emptyMap()).isEmpty());
}
@Test
void testXChannelRequestSerializableDataFromCxtManager() {
- RequestContextPropagation.initRequestContext(new SimpleIncomingContextData(Map.of(X_CHANNEL_REQUEST_ID, "12345")));
+ RequestContextPropagation.initRequestContext(new SimpleIncomingContextData(Map.of(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, "12345")));
Map> serializableContextData = ContextManager.getSerializableContextData();
- Assertions.assertTrue(serializableContextData.containsKey(X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
+ Assertions.assertTrue(serializableContextData.containsKey(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
}
@Test
diff --git a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/headerstracking/filters/context/AbstractContextTest.java b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/headerstracking/filters/context/AbstractContextTest.java
index 97a36748a..0e4f6bf25 100644
--- a/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/headerstracking/filters/context/AbstractContextTest.java
+++ b/core-context-propagation/framework-contexts/src/test/java/com/netcracker/cloud/headerstracking/filters/context/AbstractContextTest.java
@@ -3,8 +3,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import com.netcracker.cloud.context.propagation.core.RequestContextPropagation;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
import com.netcracker.cloud.framework.contexts.data.ContextDataRequest;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
import com.netcracker.cloud.context.propagation.core.ContextManager;
public abstract class AbstractContextTest {
diff --git a/core-context-propagation/pom.xml b/core-context-propagation/pom.xml
index 2de7d1905..8f25373f1 100644
--- a/core-context-propagation/pom.xml
+++ b/core-context-propagation/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud
context-propagation
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
pom
diff --git a/core-context-propagation/sample-context-tests/pom.xml b/core-context-propagation/sample-context-tests/pom.xml
index dab7415f7..392a3c6e9 100644
--- a/core-context-propagation/sample-context-tests/pom.xml
+++ b/core-context-propagation/sample-context-tests/pom.xml
@@ -4,7 +4,7 @@
com.netcracker.cloud
sample-context-tests
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
diff --git a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationSpringCommonTest.java b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationSpringCommonTest.java
index 50cfdc264..d94414a71 100644
--- a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationSpringCommonTest.java
+++ b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationSpringCommonTest.java
@@ -4,6 +4,8 @@
import org.junit.jupiter.api.Test;
import com.netcracker.cloud.context.propagation.spring.common.annotation.EnableSpringContextProvider;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPostAuthnContextProviderFilter;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
@@ -30,13 +32,13 @@ class RequestPropagationSpringCommonTest {
@BeforeEach
void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).addFilter(filter).build();
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
}
@Test
void testRequestPropagation() throws Exception {
mockMvc.perform(get("/spring/common/test/requestId"))
.andExpect(header().exists("X-Request-Id"))
- .andExpect(header().exists("X-Channel-Request-Id"));
+ .andExpect(header().exists(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
}
}
diff --git a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationTest.java b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationTest.java
index a9f9fb421..7166c58be 100644
--- a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationTest.java
+++ b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationTest.java
@@ -7,7 +7,7 @@
import static org.junit.jupiter.api.Assertions.assertNull;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPostAuthnContextProviderFilter;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPreAuthnContextProviderFilter;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -34,7 +34,6 @@
TestController.class, RequestPropagationTestConfig.class})
@TestPropertySource(properties = {
"headers.allowed=custom-header",
- "headers.blocked=",
"cloud-core.context-propagation.url=/test_url/v111/test"
})
class RequestPropagationTest {
@@ -64,7 +63,7 @@ class RequestPropagationTest {
@BeforeEach
void setUp() {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
mockMvc = MockMvcBuilders.webAppContextSetup(context).addFilters(preAuthnFilter, postAuthnFilter).build();
@@ -107,15 +106,14 @@ void testRequestPropagation() throws Exception {
}
@Test
- void testXRequestIdStillPropagatesWhenAddedToBlockedList() throws Exception {
- System.setProperty("headers.blocked", X_REQUEST_ID_NAME);
+ void testXRequestIdNotAffectedByExemptionConfig() throws Exception {
+ System.setProperty("context.propagation.headers.enable.optional", X_REQUEST_ID_NAME);
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/chain_request"))
.andExpect(header(HttpHeaders.ACCEPT_LANGUAGE, ACCEPT_LANGUAGE_VALUE))
- // X-Request-Id is non-blockable and must still be propagated.
.andExpect(header(X_REQUEST_ID_NAME, X_REQUEST_ID_VALUE))
.andExpect(header(CUSTOM_NAME, CUSTOM_VALUE))
.andRespond(withSuccess());
diff --git a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdAllowedTest.java b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdAllowedTest.java
index fa47551a4..7129201bc 100644
--- a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdAllowedTest.java
+++ b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdAllowedTest.java
@@ -8,7 +8,8 @@
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPostAuthnContextProviderFilter;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPreAuthnContextProviderFilter;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -33,7 +34,7 @@
TestController.class, RequestPropagationTestConfig.class})
@TestPropertySource(properties = {
"headers.allowed=custom-header",
- "headers.blocked=",
+ "context.propagation.headers.enable.optional=X-Channel-Request-Id",
"cloud-core.context-propagation.url=/test_url/v111/test"
})
class RequestPropagationXChannelRequestIdAllowedTest {
@@ -64,7 +65,7 @@ class RequestPropagationXChannelRequestIdAllowedTest {
@BeforeAll
static void beforeAll() {
System.setProperty("headers.allowed", "custom-header");
- System.setProperty("headers.blocked", "");
+ System.setProperty("context.propagation.headers.enable.optional", XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
}
@@ -72,7 +73,7 @@ static void beforeAll() {
@AfterAll
static void afterAll() {
System.clearProperty("headers.allowed");
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
}
diff --git a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdResponseTest.java b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdResponseTest.java
index d60295141..7de5dbbc0 100644
--- a/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdResponseTest.java
+++ b/core-context-propagation/sample-context-tests/src/test/java/com/netcracker/cloud/context/propagation/sample/requests/RequestPropagationXChannelRequestIdResponseTest.java
@@ -23,7 +23,7 @@
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPostAuthnContextProviderFilter;
import com.netcracker.cloud.context.propagation.spring.common.filter.SpringPreAuthnContextProviderFilter;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
@SpringBootTest
@ContextConfiguration(classes = {
@@ -31,7 +31,6 @@
@TestPropertySource(properties = {
"headers.allowed=custom-header",
"cloud-core.context-propagation.url=/test_url/v111/test"
- // headers.blocked is not set, X-Channel-Request-Id blocked for outgoing requests
})
class RequestPropagationXChannelRequestIdResponseTest {
@@ -55,14 +54,14 @@ class RequestPropagationXChannelRequestIdResponseTest {
@BeforeAll
static void beforeAll() {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
}
@AfterAll
static void afterAll() {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
}
@@ -75,8 +74,6 @@ void setUp() {
@Test
void testXChannelRequestIdReturnedInResponseEvenWhenBlockedForOutgoing() throws Exception {
- // X-Channel-Request-Id blocked for outgoing requests
- // but should be sent in response to client
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/chain_request"))
.andExpect(request -> assertNull(
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/pom.xml b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/pom.xml
index 3694ec174..2acc106de 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/pom.xml
@@ -3,7 +3,7 @@
spring-context-aggregator
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
@@ -56,6 +56,12 @@
spring-test
test
+
+ uk.org.webcompere
+ system-stubs-jupiter
+ 2.1.8
+ test
+
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/main/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfiguration.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/main/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfiguration.java
index 3166e2397..3e6f5a1b8 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/main/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfiguration.java
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/main/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfiguration.java
@@ -13,12 +13,14 @@
@Configuration
public class SpringContextProviderConfiguration {
+
@Bean
- public SpringPostAuthnContextProviderFilter springPostAuthnContextProviderFilter(){
+ public SpringPostAuthnContextProviderFilter springPostAuthnContextProviderFilter() {
return new SpringPostAuthnContextProviderFilter();
}
+
@Bean
- public SpringPreAuthnContextProviderFilter springPreAuthnContextProviderFilter(){
+ public SpringPreAuthnContextProviderFilter springPreAuthnContextProviderFilter() {
return new SpringPreAuthnContextProviderFilter();
}
@@ -29,14 +31,14 @@ public SpringPreAuthnContextProviderFilter springPreAuthnContextProviderFilter()
@Value("${headers.allowed:}")
private String allowedHeaders;
- @Value("${headers.blocked:}")
- private String blockedHeaders;
+ @Value("${context.propagation.headers.enable.optional:}")
+ private String enableOptional;
@PostConstruct
public void init() {
System.setProperty("headers.allowed", allowedHeaders);
- if (environment.containsProperty("headers.blocked")) {
- System.setProperty("headers.blocked", blockedHeaders);
+ if (environment.containsProperty("context.propagation.headers.enable.optional")) {
+ System.setProperty("context.propagation.headers.enable.optional", enableOptional);
}
}
}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/HeaderPropagationStateReset.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/HeaderPropagationStateReset.java
new file mode 100644
index 000000000..2f876745f
--- /dev/null
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/HeaderPropagationStateReset.java
@@ -0,0 +1,32 @@
+package com.netcracker.cloud.context.propagation.spring.common.configuration;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+/**
+ * JUnit5 extension that wipes the global JVM state touched by
+ * {@code SpringContextProviderConfiguration#init()} so that adjacent test classes in the
+ * same JVM do not leak {@code headers.*} system properties or the cached restricted list
+ * into each other.
+ */
+public class HeaderPropagationStateReset implements BeforeAllCallback, AfterAllCallback {
+
+ @Override
+ public void beforeAll(ExtensionContext ctx) {
+ reset();
+ }
+
+ @Override
+ public void afterAll(ExtensionContext ctx) {
+ reset();
+ }
+
+ private static void reset() {
+ System.clearProperty(HeaderPropagationConfiguration.ENABLE_OPTIONAL_PROPERTY);
+ System.clearProperty("headers.allowed");
+ HeaderPropagationConfiguration.resetCache();
+ }
+}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationEmptyTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationEmptyTest.java
new file mode 100644
index 000000000..1c4680d03
--- /dev/null
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationEmptyTest.java
@@ -0,0 +1,34 @@
+package com.netcracker.cloud.context.propagation.spring.common.configuration;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
+@ExtendWith({HeaderPropagationStateReset.class, SpringExtension.class})
+@ContextConfiguration(classes = SpringContextProviderConfiguration.class)
+@TestPropertySource(properties = {
+ "headers.allowed=custom-header",
+ "context.propagation.headers.enable.optional="
+})
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+class SpringContextProviderConfigurationEmptyTest {
+
+ @Test
+ void shouldSetEmptySystemPropertyAndStillApplyRestrictedList() {
+ assertEquals("", System.getProperty("context.propagation.headers.enable.optional"),
+ "Spring init() must propagate explicit empty value to the system property");
+
+ HeaderPropagationConfiguration.resetCache();
+ assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID),
+ "Restricted list must still apply when the enable.optional property is blank");
+ }
+}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationNotConfiguredTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationNotConfiguredTest.java
new file mode 100644
index 000000000..e88a5d315
--- /dev/null
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationNotConfiguredTest.java
@@ -0,0 +1,34 @@
+package com.netcracker.cloud.context.propagation.spring.common.configuration;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
+@ExtendWith({HeaderPropagationStateReset.class, SpringExtension.class})
+@ContextConfiguration(classes = SpringContextProviderConfiguration.class)
+@TestPropertySource(properties = {
+ // context.propagation.headers.enable.optional intentionally absent
+ "headers.allowed=custom-header"
+})
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+class SpringContextProviderConfigurationNotConfiguredTest {
+
+ @Test
+ void shouldNotTouchSystemPropertyAndKeepRestrictedList() {
+ assertNull(System.getProperty("context.propagation.headers.enable.optional"),
+ "context.propagation.headers.enable.optional must remain unset when no source configures it");
+
+ HeaderPropagationConfiguration.resetCache();
+ assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID),
+ "Restricted list must apply when no value is configured");
+ }
+}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationUnknownEntryTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationUnknownEntryTest.java
new file mode 100644
index 000000000..5392449a5
--- /dev/null
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationUnknownEntryTest.java
@@ -0,0 +1,41 @@
+package com.netcracker.cloud.context.propagation.spring.common.configuration;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject.X_CHANNEL_REQUEST_ID;
+
+/**
+ * Spring integration scenario: {@code context.propagation.headers.enable.optional} contains only
+ * header names that are not part of the framework's restricted list. The configuration has no
+ * effect — the restricted list applies unchanged.
+ */
+@ExtendWith({HeaderPropagationStateReset.class, SpringExtension.class})
+@ContextConfiguration(classes = SpringContextProviderConfiguration.class)
+@TestPropertySource(properties = {
+ "headers.allowed=custom-header",
+ "context.propagation.headers.enable.optional=Custom-Header, X-Some-Other-Header"
+})
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+class SpringContextProviderConfigurationUnknownEntryTest {
+
+ @Test
+ void shouldLeaveRestrictedListIntactWhenEntriesDontMatch() {
+ assertEquals("Custom-Header, X-Some-Other-Header",
+ System.getProperty("context.propagation.headers.enable.optional"));
+
+ HeaderPropagationConfiguration.resetCache();
+ assertTrue(HeaderPropagationConfiguration.isRestricted(X_CHANNEL_REQUEST_ID),
+ "Restricted list must remain intact when no entry matches it");
+ assertEquals(HeaderPropagationConfiguration.RESTRICTED_HEADERS,
+ HeaderPropagationConfiguration.restrictedHeaders());
+ }
+}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationWithValueTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationWithValueTest.java
new file mode 100644
index 000000000..7ca2d2a8a
--- /dev/null
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/configuration/SpringContextProviderConfigurationWithValueTest.java
@@ -0,0 +1,36 @@
+package com.netcracker.cloud.context.propagation.spring.common.configuration;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@ExtendWith({HeaderPropagationStateReset.class, SpringExtension.class})
+@ContextConfiguration(classes = SpringContextProviderConfiguration.class)
+@TestPropertySource(properties = {
+ "headers.allowed=custom-header",
+ "context.propagation.headers.enable.optional=X-Channel-Request-Id"
+})
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+class SpringContextProviderConfigurationWithValueTest {
+
+ @Test
+ void shouldExemptListedHeaderFromRestrictedList() {
+ assertEquals(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME, System.getProperty("context.propagation.headers.enable.optional"));
+
+ HeaderPropagationConfiguration.resetCache();
+ assertFalse(HeaderPropagationConfiguration.isRestricted(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME),
+ "Exempted header must not be blocked");
+ assertTrue(HeaderPropagationConfiguration.restrictedHeaders().isEmpty(),
+ "Any entry of the restricted list must be removed");
+ }
+}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/filter/SpringContextProviderFilterTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/filter/SpringContextProviderFilterTest.java
index bafe4cdcf..1efa7ee02 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/filter/SpringContextProviderFilterTest.java
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-common/src/test/java/com/netcracker/cloud/context/propagation/spring/common/filter/SpringContextProviderFilterTest.java
@@ -28,7 +28,6 @@
class SpringContextProviderFilterTest {
public static final String X_REQUEST_ID_CONTEXT_NAME = "X-Request-Id";
- public static final String X_CHANNEL_REQUEST_ID_CONTEXT_NAME = "X-Channel-Request-Id";
@BeforeEach
void init() {
@@ -39,7 +38,7 @@ void init() {
void testDoFilterInternal() throws ServletException, IOException {
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
when(httpServletRequest.getHeaderNames())
- .thenReturn(new EnumerationImpl<>(Arrays.asList(ACCEPT_LANGUAGE, X_REQUEST_ID_CONTEXT_NAME, X_CHANNEL_REQUEST_ID_CONTEXT_NAME).iterator()));
+ .thenReturn(new EnumerationImpl<>(Arrays.asList(ACCEPT_LANGUAGE, X_REQUEST_ID_CONTEXT_NAME, XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME).iterator()));
String acceptLanguageValue = "ru;en";
when(httpServletRequest.getHeaders(ACCEPT_LANGUAGE))
@@ -52,9 +51,9 @@ void testDoFilterInternal() throws ServletException, IOException {
.thenReturn(xRequestIdValue);
String xChannelRequestIdValue = "456";
- when(httpServletRequest.getHeaders(X_CHANNEL_REQUEST_ID_CONTEXT_NAME))
+ when(httpServletRequest.getHeaders(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME))
.thenReturn(new EnumerationImpl<>(Collections.singletonList(xChannelRequestIdValue).iterator()));
- when(httpServletRequest.getHeader(X_CHANNEL_REQUEST_ID_CONTEXT_NAME))
+ when(httpServletRequest.getHeader(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME))
.thenReturn(xChannelRequestIdValue);
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/pom.xml b/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/pom.xml
index 8d32f3923..0e3c4ec41 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/pom.xml
@@ -3,7 +3,7 @@
spring-context-aggregator
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/src/test/java/com/netcracker/cloud/context/propagation/spring/kafka/ContextPropagationTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/src/test/java/com/netcracker/cloud/context/propagation/spring/kafka/ContextPropagationTest.java
index afe9ff138..f841708fd 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/src/test/java/com/netcracker/cloud/context/propagation/spring/kafka/ContextPropagationTest.java
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-kafka/src/test/java/com/netcracker/cloud/context/propagation/spring/kafka/ContextPropagationTest.java
@@ -9,7 +9,8 @@
import org.junit.jupiter.api.Timeout;
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.context.propagation.spring.kafka.annotation.EnableKafkaContextPropagation;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
import com.netcracker.cloud.headerstracking.filters.context.AcceptLanguageContext;
import com.netcracker.cloud.headerstracking.filters.context.AllowedHeadersContext;
import com.netcracker.cloud.headerstracking.filters.context.ChannelRequestIdContext;
@@ -50,7 +51,6 @@ public class ContextPropagationTest {
private static final String TEST_LANG = "ZULU";
private static final String CUSTOM_HEADER = "X-Custom-Header-1";
private static final String CUSTOM_HEADER_VALUE = "case-insensitive-test-value";
- private static final String X_CHANNEL_REQUEST_ID_NAME = "X-Channel-Request-Id";
private static final String X_CHANNEL_REQUEST_ID_VALUE = "456";
private static final AtomicReference>> consumed = new AtomicReference<>();
private static final CountingInterceptor interceptor = new CountingInterceptor();
@@ -61,7 +61,7 @@ public class ContextPropagationTest {
@BeforeAll
static void setup() {
System.setProperty("headers.allowed", CUSTOM_HEADER.toLowerCase());
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
}
@@ -73,7 +73,7 @@ void beforeEach() {
@AfterEach
void afterEach() {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
}
@@ -93,15 +93,17 @@ void testContextPropagationBlocksXChannelRequestIdByDefault() throws Exception {
ContextManager.clearAll();
ConsumerRecord message = consumed.get().get(5, TimeUnit.SECONDS);
- assertNull(message.headers().lastHeader(X_CHANNEL_REQUEST_ID_NAME));
+ assertNull(message.headers().lastHeader(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
assertEquals(TEST_LANG, new String(message.headers().lastHeader(HttpHeaders.ACCEPT_LANGUAGE).value()));
assertEquals(CUSTOM_HEADER_VALUE, new String(message.headers().lastHeader(CUSTOM_HEADER).value()));
}
@Test
@Timeout(30)
- public void testContextPropagationAllowsXChannelRequestIdWhenHeadersBlockedEmpty() throws Exception {
- System.setProperty("headers.blocked", "");
+ public void testContextPropagationAllowsXChannelRequestIdWhenExempted() throws Exception {
+ System.setProperty("context.propagation.headers.enable.optional", XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME);
+ HeaderPropagationConfiguration.resetCache();
+
ChannelRequestIdContext.set(X_CHANNEL_REQUEST_ID_VALUE);
AcceptLanguageContext.set(TEST_LANG);
AllowedHeadersContext.set(Map.of(CUSTOM_HEADER, CUSTOM_HEADER_VALUE));
@@ -110,8 +112,8 @@ public void testContextPropagationAllowsXChannelRequestIdWhenHeadersBlockedEmpty
ContextManager.clearAll();
ConsumerRecord message = consumed.get().get(5, TimeUnit.SECONDS);
- assertNotNull(message.headers().lastHeader(X_CHANNEL_REQUEST_ID_NAME));
- assertEquals(X_CHANNEL_REQUEST_ID_VALUE, new String(message.headers().lastHeader(X_CHANNEL_REQUEST_ID_NAME).value()));
+ assertNotNull(message.headers().lastHeader(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME));
+ assertEquals(X_CHANNEL_REQUEST_ID_VALUE, new String(message.headers().lastHeader(XChannelRequestIdContextProvider.X_CHANNEL_REQUEST_ID_CONTEXT_NAME).value()));
}
@Component
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/pom.xml b/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/pom.xml
index 1ad895b92..184b03ef0 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/pom.xml
@@ -3,7 +3,7 @@
spring-context-aggregator
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/src/test/java/com/netcracker/cloud/context/propagation/spring/rabbit/PropagationTest.java b/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/src/test/java/com/netcracker/cloud/context/propagation/spring/rabbit/PropagationTest.java
index bc539c6e5..1e8fc23fc 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/src/test/java/com/netcracker/cloud/context/propagation/spring/rabbit/PropagationTest.java
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-rabbit/src/test/java/com/netcracker/cloud/context/propagation/spring/rabbit/PropagationTest.java
@@ -2,7 +2,7 @@
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.context.propagation.spring.rabbit.annotation.EnableRabbitContextPropagation;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
import com.netcracker.cloud.headerstracking.filters.context.AcceptLanguageContext;
import com.netcracker.cloud.headerstracking.filters.context.AllowedHeadersContext;
import com.netcracker.cloud.headerstracking.filters.context.ChannelRequestIdContext;
@@ -87,7 +87,7 @@ public static void setup() throws Exception {
channel.queueBind("orders", "orders", "invoice");
}
System.setProperty("headers.allowed", CUSTOM_HEADER.toLowerCase());
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
}
@AfterAll
@@ -103,7 +103,7 @@ void beforeEach() {
@AfterEach
void afterEach() {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
}
@@ -125,8 +125,10 @@ public void testXChannelRequestIdBlockedByDefault() throws InterruptedException
@Test
@Timeout(value = 20, unit = TimeUnit.SECONDS)
- public void testXChannelRequestIdAllowedWhenHeadersBlockedEmpty() throws InterruptedException {
- System.setProperty("headers.blocked", "");
+ public void testXChannelRequestIdAllowedWhenExempted() throws InterruptedException {
+ System.setProperty("context.propagation.headers.enable.optional", X_CHANNEL_REQUEST_ID_NAME);
+ HeaderPropagationConfiguration.resetCache();
+
AcceptLanguageContext.set("ZULU");
AllowedHeadersContext.set(Map.of(CUSTOM_HEADER, CUSTOM_HEADER_VALUE));
ChannelRequestIdContext.set(X_CHANNEL_REQUEST_ID_VALUE);
@@ -142,12 +144,15 @@ public void testXChannelRequestIdAllowedWhenHeadersBlockedEmpty() throws Interru
@Test
@Timeout(value = 20, unit = TimeUnit.SECONDS)
- public void testCustomHeaderBlockedWhenConfiguredByProperty() throws InterruptedException {
- System.setProperty("headers.blocked", ANOTHER_HEADER);
+ public void testUnknownExemptionDoesNotAffectRestrictedList() throws InterruptedException {
+ System.setProperty("context.propagation.headers.enable.optional", ANOTHER_HEADER);
+ HeaderPropagationConfiguration.resetCache();
+
AcceptLanguageContext.set("ZULU");
AllowedHeadersContext.set(Map.of(
CUSTOM_HEADER, CUSTOM_HEADER_VALUE,
ANOTHER_HEADER, ANOTHER_HEADER_VALUE));
+ ChannelRequestIdContext.set(X_CHANNEL_REQUEST_ID_VALUE);
template.convertAndSend("orders", "invoice", "rye wheat");
ContextManager.clearAll();
@@ -155,8 +160,10 @@ public void testCustomHeaderBlockedWhenConfiguredByProperty() throws Interrupted
fail("Message listener failed or message doesn't even arrived in 10 seconds");
}
- assertNull(getHeaderIgnoreCase(receivedHeaders.get(), ANOTHER_HEADER));
+ assertNull(getHeaderIgnoreCase(receivedHeaders.get(), X_CHANNEL_REQUEST_ID_NAME),
+ "Restricted list must remain intact when no entry matches it");
assertEquals(CUSTOM_HEADER_VALUE, getHeaderIgnoreCase(receivedHeaders.get(), CUSTOM_HEADER));
+ assertEquals(ANOTHER_HEADER_VALUE, getHeaderIgnoreCase(receivedHeaders.get(), ANOTHER_HEADER));
}
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-resttemplate/pom.xml b/core-context-propagation/spring-context-aggregator/context-propagation-spring-resttemplate/pom.xml
index 4a77740b3..a5ec3b8d2 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-resttemplate/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-resttemplate/pom.xml
@@ -3,7 +3,7 @@
spring-context-aggregator
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/core-context-propagation/spring-context-aggregator/context-propagation-spring-webclient/pom.xml b/core-context-propagation/spring-context-aggregator/context-propagation-spring-webclient/pom.xml
index e8c0c61fa..c73575f85 100644
--- a/core-context-propagation/spring-context-aggregator/context-propagation-spring-webclient/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/context-propagation-spring-webclient/pom.xml
@@ -3,7 +3,7 @@
spring-context-aggregator
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/core-context-propagation/spring-context-aggregator/pom.xml b/core-context-propagation/spring-context-aggregator/pom.xml
index 1aa6fe02b..6302ba383 100644
--- a/core-context-propagation/spring-context-aggregator/pom.xml
+++ b/core-context-propagation/spring-context-aggregator/pom.xml
@@ -3,7 +3,7 @@
context-propagation
com.netcracker.cloud
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
../pom.xml
4.0.0
diff --git a/core-microservice-dependencies/cloud-core-java-bom/pom.xml b/core-microservice-dependencies/cloud-core-java-bom/pom.xml
index 83561ccaa..d9d8bc048 100644
--- a/core-microservice-dependencies/cloud-core-java-bom/pom.xml
+++ b/core-microservice-dependencies/cloud-core-java-bom/pom.xml
@@ -25,7 +25,7 @@
7.2.0-SNAPSHOT
9.1.0-SNAPSHOT
7.1.0-SNAPSHOT
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
12.2.0-SNAPSHOT
4.2.0-SNAPSHOT
diff --git a/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-internal/pom.xml b/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-internal/pom.xml
index 8dba44196..8f486b647 100644
--- a/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-internal/pom.xml
+++ b/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-internal/pom.xml
@@ -13,7 +13,7 @@
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
9.1.0-SNAPSHOT
3.1.0-SNAPSHOT
diff --git a/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-parent/pom.xml b/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-parent/pom.xml
index c2cf72236..57ed35af9 100644
--- a/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-parent/pom.xml
+++ b/core-quarkus-extensions/cloud-core-quarkus-bom/cloud-core-quarkus-bom-parent/pom.xml
@@ -12,6 +12,6 @@
pom
- 9.1.0-SNAPSHOT
+ 9.1.1-SNAPSHOT
diff --git a/core-rest-libraries/rest-third-party/pom.xml b/core-rest-libraries/rest-third-party/pom.xml
index a4cac0399..b22dc5952 100644
--- a/core-rest-libraries/rest-third-party/pom.xml
+++ b/core-rest-libraries/rest-third-party/pom.xml
@@ -14,7 +14,7 @@
7.1.0-SNAPSHOT
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
4.2.0-SNAPSHOT
2.0.9
diff --git a/dbaas-client/dbaas-client-bom-parent/dbaas-client-bom-internal/pom.xml b/dbaas-client/dbaas-client-bom-parent/dbaas-client-bom-internal/pom.xml
index 5bb896700..ed559650e 100644
--- a/dbaas-client/dbaas-client-bom-parent/dbaas-client-bom-internal/pom.xml
+++ b/dbaas-client/dbaas-client-bom-parent/dbaas-client-bom-internal/pom.xml
@@ -26,7 +26,7 @@
7.2.0-SNAPSHOT
7.1.0-SNAPSHOT
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
3.1.0-SNAPSHOT
diff --git a/maas-client/kafka-context-propagation/src/test/java/com/netcracker/cloud/maas/client/context/kafka/KafkaContextPropagationTest.java b/maas-client/kafka-context-propagation/src/test/java/com/netcracker/cloud/maas/client/context/kafka/KafkaContextPropagationTest.java
index addb62f3b..caed936e2 100644
--- a/maas-client/kafka-context-propagation/src/test/java/com/netcracker/cloud/maas/client/context/kafka/KafkaContextPropagationTest.java
+++ b/maas-client/kafka-context-propagation/src/test/java/com/netcracker/cloud/maas/client/context/kafka/KafkaContextPropagationTest.java
@@ -6,7 +6,7 @@
import com.netcracker.cloud.framework.contexts.xversion.XVersionProvider;
import com.netcracker.cloud.headerstracking.filters.context.AcceptLanguageContext;
import com.netcracker.cloud.maas.client.context.kafka.KafkaContextPropagation.HeadersAdapter;
-import com.netcracker.cloud.framework.contexts.allowedheaders.HeaderPropagationConfiguration;
+import com.netcracker.cloud.framework.contexts.xchannelrequestid.HeaderPropagationConfiguration;
import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextObject;
import com.netcracker.cloud.framework.contexts.xchannelrequestid.XChannelRequestIdContextProvider;
@@ -103,8 +103,8 @@ void testDumpDoesNotContainXChannelRequestIdByDefault() {
}
@Test
- void testDumpContainsXChannelRequestIdWhenNotBlocked() {
- System.setProperty("headers.blocked", "");
+ void testDumpContainsXChannelRequestIdWhenExempted() {
+ System.setProperty("context.propagation.headers.enable.optional", X_CHANNEL_REQUEST_ID);
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
@@ -117,7 +117,7 @@ void testDumpContainsXChannelRequestIdWhenNotBlocked() {
assertEquals("ch-456", dumped.get(X_CHANNEL_REQUEST_ID));
} finally {
- System.clearProperty("headers.blocked");
+ System.clearProperty("context.propagation.headers.enable.optional");
HeaderPropagationConfiguration.resetCache();
ContextManager.reinitialize();
}
diff --git a/maas-client/pom.xml b/maas-client/pom.xml
index 7fd992438..c4dcd3527 100644
--- a/maas-client/pom.xml
+++ b/maas-client/pom.xml
@@ -19,7 +19,7 @@
21
21
UTF-8
- 8.2.0-SNAPSHOT
+ 8.2.1-SNAPSHOT
2.1.0-SNAPSHOT
4.2.0