From b2cfb7f89f7cf270a20af338cb49b7cf7057f773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Andr=C3=A9?= <92062874+matheusandre1@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:06:58 -0300 Subject: [PATCH] feat: Add HttpPipeline configuration (#1841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matheus André (cherry picked from commit 0f343364e9476bdea7040e5abdf8d6db81b28767) --- .../io/dapr/testcontainers/Configuration.java | 38 ++++++++- .../io/dapr/testcontainers/HttpPipeline.java | 40 +++++++++ .../converter/ConfigurationYamlConverter.java | 11 +++ .../ConfigurationYamlConverterTest.java | 83 +++++++++++++++++++ 4 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 testcontainers-dapr/src/main/java/io/dapr/testcontainers/HttpPipeline.java diff --git a/testcontainers-dapr/src/main/java/io/dapr/testcontainers/Configuration.java b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/Configuration.java index 70cffe9f07..d2383f2821 100644 --- a/testcontainers-dapr/src/main/java/io/dapr/testcontainers/Configuration.java +++ b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/Configuration.java @@ -26,8 +26,7 @@ public class Configuration { private final NameResolutionConfigurationSettings nameResolution; private final ComponentsConfigurationSettings components; private final SecretsConfigurationSettings secrets; - - // @TODO: add middleware httpPipeline https://github.com/dapr/java-sdk/issues/1283 + private final HttpPipeline httpPipeline; /** * Creates a new configuration. @@ -175,6 +174,36 @@ public Configuration( NameResolutionConfigurationSettings nameResolution, ComponentsConfigurationSettings components, SecretsConfigurationSettings secrets + ) { + this(name, tracing, appHttpPipeline, mtls, logging, metrics, nameResolution, components, secrets, null); + } + + /** + * Creates a new configuration. + * + * @param name Configuration name. + * @param tracing TracingConfigParameters tracing configuration + * parameters. + * @param appHttpPipeline AppHttpPipeline middleware configuration. + * @param mtls MtlsConfigurationSettings mTLS configuration. + * @param logging LoggingConfigurationSettings logging configuration. + * @param metrics MetricsConfigurationSettings metrics configuration. + * @param nameResolution NameResolutionConfigurationSettings name resolution configuration. + * @param components ComponentsConfigurationSettings disallowed component types configuration. + * @param secrets SecretsConfigurationSettings secret store access configuration. + * @param httpPipeline HttpPipeline middleware configuration for incoming requests. + */ + public Configuration( + String name, + TracingConfigurationSettings tracing, + AppHttpPipeline appHttpPipeline, + MtlsConfigurationSettings mtls, + LoggingConfigurationSettings logging, + MetricsConfigurationSettings metrics, + NameResolutionConfigurationSettings nameResolution, + ComponentsConfigurationSettings components, + SecretsConfigurationSettings secrets, + HttpPipeline httpPipeline ) { this.name = name; this.tracing = tracing; @@ -185,6 +214,7 @@ public Configuration( this.nameResolution = nameResolution; this.components = components; this.secrets = secrets; + this.httpPipeline = httpPipeline; } public String getName() { @@ -222,4 +252,8 @@ public ComponentsConfigurationSettings getComponents() { public SecretsConfigurationSettings getSecrets() { return secrets; } + + public HttpPipeline getHttpPipeline() { + return httpPipeline; + } } diff --git a/testcontainers-dapr/src/main/java/io/dapr/testcontainers/HttpPipeline.java b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/HttpPipeline.java new file mode 100644 index 0000000000..6c148858da --- /dev/null +++ b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/HttpPipeline.java @@ -0,0 +1,40 @@ +/* + * Copyright 2026 The Dapr Authors + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.dapr.testcontainers; + +import java.util.Collections; +import java.util.List; + +/** + * Represents the middleware HTTP pipeline applied to incoming requests to the Dapr sidecar. + */ +public class HttpPipeline implements ConfigurationSettings { + private List handlers; + + /** + * Creates an HttpPipeline. + * + * @param handlers List of handlers for the HttpPipeline + */ + public HttpPipeline(List handlers) { + if (handlers != null) { + this.handlers = Collections.unmodifiableList(handlers); + } + } + + public List getHandlers() { + return handlers; + } + +} diff --git a/testcontainers-dapr/src/main/java/io/dapr/testcontainers/converter/ConfigurationYamlConverter.java b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/converter/ConfigurationYamlConverter.java index cad94f0944..2e33064b7a 100644 --- a/testcontainers-dapr/src/main/java/io/dapr/testcontainers/converter/ConfigurationYamlConverter.java +++ b/testcontainers-dapr/src/main/java/io/dapr/testcontainers/converter/ConfigurationYamlConverter.java @@ -18,6 +18,7 @@ import io.dapr.testcontainers.ComponentsConfigurationSettings; import io.dapr.testcontainers.Configuration; import io.dapr.testcontainers.HttpMetricsConfigurationSettings; +import io.dapr.testcontainers.HttpPipeline; import io.dapr.testcontainers.ListEntry; import io.dapr.testcontainers.LoggingConfigurationSettings; import io.dapr.testcontainers.MetricsConfigurationSettings; @@ -91,6 +92,16 @@ public String convert(Configuration configuration) { } + HttpPipeline httpPipeline = configuration.getHttpPipeline(); + if (httpPipeline != null) { + + Map httpPipelineMap = new LinkedHashMap<>(); + List handlers = httpPipeline.getHandlers(); + httpPipelineMap.put("handlers", handlers); + configurationSpec.put("httpPipeline", httpPipelineMap); + + } + AppHttpPipeline appHttpPipeline = configuration.getAppHttpPipeline(); if (appHttpPipeline != null) { diff --git a/testcontainers-dapr/src/test/java/io/dapr/testcontainers/converter/ConfigurationYamlConverterTest.java b/testcontainers-dapr/src/test/java/io/dapr/testcontainers/converter/ConfigurationYamlConverterTest.java index a3b1ca442c..801bb1752a 100644 --- a/testcontainers-dapr/src/test/java/io/dapr/testcontainers/converter/ConfigurationYamlConverterTest.java +++ b/testcontainers-dapr/src/test/java/io/dapr/testcontainers/converter/ConfigurationYamlConverterTest.java @@ -19,6 +19,7 @@ import io.dapr.testcontainers.Configuration; import io.dapr.testcontainers.DaprContainer; import io.dapr.testcontainers.HttpMetricsConfigurationSettings; +import io.dapr.testcontainers.HttpPipeline; import io.dapr.testcontainers.ListEntry; import io.dapr.testcontainers.LoggingConfigurationSettings; import io.dapr.testcontainers.MetricsConfigurationSettings; @@ -994,4 +995,86 @@ public void testConfigurationWithDisallowedComponentsAndSecretsToYaml() { assertEquals(expectedConfigurationYaml, configurationYaml); } + + @Test + public void testConfigurationWithHttpPipelineToYaml() { + HttpPipeline httpPipeline = new HttpPipeline(List.of( + new ListEntry("uppercase", "middleware.http.uppercase"), + new ListEntry("ratelimit", "middleware.http.ratelimit"))); + + Configuration configuration = + new Configuration("my-config", null, null, null, null, null, null, null, null, httpPipeline); + assertEquals(2, configuration.getHttpPipeline().getHandlers().size()); + + String configurationYaml = converter.convert(configuration); + String expectedConfigurationYaml = + "apiVersion: dapr.io/v1alpha1\n" + + "kind: Configuration\n" + + "metadata:\n" + + " name: my-config\n" + + "spec:\n" + + " httpPipeline:\n" + + " handlers:\n" + + " - name: uppercase\n" + + " type: middleware.http.uppercase\n" + + " - name: ratelimit\n" + + " type: middleware.http.ratelimit\n"; + + assertEquals(expectedConfigurationYaml, configurationYaml); + } + + @Test + public void testConfigurationWithHttpPipelineAndAppHttpPipelineToYaml() { + HttpPipeline httpPipeline = new HttpPipeline(List.of(new ListEntry("uppercase", "middleware.http.uppercase"))); + AppHttpPipeline appHttpPipeline = + new AppHttpPipeline(List.of(new ListEntry("alias", "middleware.http.routeralias"))); + + Configuration configuration = + new Configuration("my-config", null, appHttpPipeline, null, null, null, null, null, null, httpPipeline); + + String configurationYaml = converter.convert(configuration); + String expectedConfigurationYaml = + "apiVersion: dapr.io/v1alpha1\n" + + "kind: Configuration\n" + + "metadata:\n" + + " name: my-config\n" + + "spec:\n" + + " httpPipeline:\n" + + " handlers:\n" + + " - name: uppercase\n" + + " type: middleware.http.uppercase\n" + + " appHttpPipeline:\n" + + " handlers:\n" + + " - name: alias\n" + + " type: middleware.http.routeralias\n"; + + assertEquals(expectedConfigurationYaml, configurationYaml); + } + + @Test + public void testConfigurationWithNullHttpPipelineHandlersToYaml() { + HttpPipeline httpPipeline = new HttpPipeline(null); + assertNull(httpPipeline.getHandlers()); + + Configuration configuration = + new Configuration("my-config", null, null, null, null, null, null, null, null, httpPipeline); + + String configurationYaml = converter.convert(configuration); + String expectedConfigurationYaml = + "apiVersion: dapr.io/v1alpha1\n" + + "kind: Configuration\n" + + "metadata:\n" + + " name: my-config\n" + + "spec:\n" + + " httpPipeline:\n" + + " handlers: null\n"; + + assertEquals(expectedConfigurationYaml, configurationYaml); + } + + @Test + public void testConfigurationWithoutHttpPipelineHasNullGetter() { + Configuration configuration = new Configuration("my-config", null, null); + assertNull(configuration.getHttpPipeline()); + } }