From 869cbd3e71a04233b216b0d1b1c762bf3aca781c Mon Sep 17 00:00:00 2001 From: Goutam Adwant <8672451+goutamadwant@users.noreply.github.com> Date: Fri, 3 Jul 2026 06:50:59 -0700 Subject: [PATCH] Allow anonymous WS-Addressing replies without MessageID Signed-off-by: Goutam Adwant <8672451+goutamadwant@users.noreply.github.com> --- .../soap/addressing/version/Addressing10.java | 7 ++- .../server/AddressingInterceptor10Tests.java | 48 +++++++++++++++++++ .../10/request-anonymous-no-message-id.xml | 15 ++++++ .../10/request-no-reply-to-no-message-id.xml | 11 +++++ .../10/request-none-no-message-id.xml | 15 ++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java index 9063e0f11..8fb7b6bf0 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java @@ -52,13 +52,18 @@ public boolean hasRequiredProperties(MessageAddressingProperties map) { if (map.getAction() == null) { return false; } - if (map.getReplyTo() != null || map.getFaultTo() != null) { + if (requiresMessageId(map.getReplyTo()) || requiresMessageId(map.getFaultTo())) { return map.getMessageId() != null; } return true; } + private boolean requiresMessageId(@Nullable EndpointReference endpointReference) { + return endpointReference != null && !hasAnonymousAddress(endpointReference) + && !hasNoneAddress(endpointReference); + } + @Override public boolean isToHeaderRequired() { return false; diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java index 9b43bc88e..0004207bf 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java @@ -65,4 +65,52 @@ void testNoTo() throws Exception { verify(this.strategyMock); } + @Test + void testAnonymousReplyToWithoutMessageId() throws Exception { + + SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-anonymous-no-message-id.xml"); + MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory)); + expect(this.strategyMock.isDuplicate(null)).andReturn(false); + replay(this.strategyMock); + + boolean result = this.interceptor.handleRequest(context, null); + + assertThat(result).isTrue(); + assertThat(context.hasResponse()).isFalse(); + + verify(this.strategyMock); + } + + @Test + void testNoReplyToWithoutMessageId() throws Exception { + + SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-no-reply-to-no-message-id.xml"); + MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory)); + expect(this.strategyMock.isDuplicate(null)).andReturn(false); + replay(this.strategyMock); + + boolean result = this.interceptor.handleRequest(context, null); + + assertThat(result).isTrue(); + assertThat(context.hasResponse()).isFalse(); + + verify(this.strategyMock); + } + + @Test + void testNoneReplyToWithoutMessageId() throws Exception { + + SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-none-no-message-id.xml"); + MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory)); + expect(this.strategyMock.isDuplicate(null)).andReturn(false); + replay(this.strategyMock); + + boolean result = this.interceptor.handleRequest(context, null); + + assertThat(result).isTrue(); + assertThat(context.hasResponse()).isFalse(); + + verify(this.strategyMock); + } + } diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml new file mode 100644 index 000000000..843590c79 --- /dev/null +++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml @@ -0,0 +1,15 @@ + + + + http://www.w3.org/2005/08/addressing/anonymous + + mailto:fabrikam@example.com + http://example.com/fabrikam/mail/Delete + + + + 42 + + + diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml new file mode 100644 index 000000000..910f648ab --- /dev/null +++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml @@ -0,0 +1,11 @@ + + + http://example.com/fabrikam/mail/Delete + + + + 42 + + + diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml new file mode 100644 index 000000000..d8b41ca46 --- /dev/null +++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml @@ -0,0 +1,15 @@ + + + + http://www.w3.org/2005/08/addressing/none + + mailto:fabrikam@example.com + http://example.com/fabrikam/mail/Delete + + + + 42 + + +