diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java
index d8398a48d7..18816ed321 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java
@@ -42,6 +42,8 @@ public class HeaderFilterParser extends AbstractTransformerParser {
parserContext.getReaderContext().error("The 'header-names' attribute must not be empty.",
parserContext.extractSource(element));
}
+ String pattern = element.getAttribute("pattern-match");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "pattern-match");
builder.addConstructorArgValue(headerNames);
}
diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java
index a34e6991b6..d73a5d6a75 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java
@@ -30,6 +30,8 @@ import org.springframework.util.Assert;
public class HeaderFilter implements Transformer {
private final String[] headersToRemove;
+
+ private volatile boolean patternMatch;
public HeaderFilter(String... headersToRemove) {
@@ -37,10 +39,20 @@ public class HeaderFilter implements Transformer {
this.headersToRemove = headersToRemove;
}
+ public void setPatternMatch(boolean patternMatch) {
+ this.patternMatch = patternMatch;
+ }
public Message> transform(Message> message) {
MessageBuilder> builder = MessageBuilder.fromMessage(message);
- builder.removeHeaders(headersToRemove);
+ if (this.patternMatch){
+ builder.removeHeaders(headersToRemove);
+ }
+ else {
+ for (String headerToRemove : headersToRemove) {
+ builder.removeHeader(headerToRemove);
+ }
+ }
return builder.build();
}
diff --git a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
index 2a8ac6b877..2975db1e1e 100644
--- a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
+++ b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
@@ -1669,6 +1669,17 @@ endpoint itself is a Polling Consumer for a channel with a queue.
+
+
+
+ Boolean flag that specifies whether values provided in 'header-names' should be treated as
+ match patterns or literal values. For example header-names='foo*' would mean remove all
+ headers that begin with 'foo' including the header named 'foo*'. However if you want to
+ treat '*' as literal value setting this flag to FALSE will not perform pattern match and
+ the only header that will be removed is that has an exact match
+
+
+
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml
index d23e4c4f3a..4676bacb5c 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml
+++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml
@@ -14,5 +14,11 @@
+
+
+
+
+
+
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java
index 62ed6f4db1..d06ddb6550 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java
@@ -47,6 +47,12 @@ public class HeaderFilterParserTests {
@Autowired
private MessageChannel inputC;
+
+ @Autowired
+ private MessageChannel inputD;
+
+ @Autowired
+ private MessageChannel inputE;
@Test
public void verifyHeadersRemoved() {
@@ -113,5 +119,49 @@ public class HeaderFilterParserTests {
assertNull(result.getHeaders().get("goo"));
assertNotNull(result.getHeaders().get("e"));
}
+
+ @Test
+ public void verifyHeadersRemovedWhereHeaderNameContainsWildCard() {
+ QueueChannel replyChannel = new QueueChannel();
+ Message> message = MessageBuilder.withPayload("test")
+ .setReplyChannel(replyChannel)
+ .setHeader("bar*", 1)
+ .setHeader("bart", 2)
+ .setHeader("foo", 3)
+ .setHeader("goo", 4)
+ .setHeader("e", 5)
+ .build();
+ inputD.send(message);
+ Message> result = replyChannel.receive(0);
+ assertNotNull(result);
+ assertEquals("test", result.getPayload());
+ assertNull(result.getHeaders().get("bar*"));
+ assertNull(result.getHeaders().get("bart"));
+ assertNull(result.getHeaders().get("foo"));
+ assertNull(result.getHeaders().get("goo"));
+ assertNotNull(result.getHeaders().get("e"));
+ }
+
+ @Test
+ public void verifyHeadersRemovedWhereHeaderNameIsLiteral() {
+ QueueChannel replyChannel = new QueueChannel();
+ Message> message = MessageBuilder.withPayload("test")
+ .setReplyChannel(replyChannel)
+ .setHeader("bar*", 1)
+ .setHeader("bart", 2)
+ .setHeader("foo", 3)
+ .setHeader("goo", 4)
+ .setHeader("e", 5)
+ .build();
+ inputE.send(message);
+ Message> result = replyChannel.receive(0);
+ assertNotNull(result);
+ assertEquals("test", result.getPayload());
+ assertNull(result.getHeaders().get("bar*"));
+ assertNotNull(result.getHeaders().get("bart"));
+ assertNull(result.getHeaders().get("foo"));
+ assertNotNull(result.getHeaders().get("goo"));
+ assertNotNull(result.getHeaders().get("e"));
+ }
}