INT-1919 added support for treating '*' as literal value via 'pattern-match' boolean attribute on header-filter with default value 'true'
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -1669,6 +1669,17 @@ endpoint itself is a Polling Consumer for a channel with a queue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
<xsd:attribute name="pattern-match" type="xsd:boolean" default="true">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
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
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:element name="transformer">
|
||||
|
||||
@@ -14,5 +14,11 @@
|
||||
|
||||
|
||||
<header-filter input-channel="inputC" header-names="ba*, *oo"/>
|
||||
|
||||
|
||||
<header-filter input-channel="inputD" header-names="bar*, *oo"/>
|
||||
|
||||
|
||||
<header-filter input-channel="inputE" pattern-match="false" header-names="bar*, foo"/>
|
||||
|
||||
</beans:beans>
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user