Skip to content

Commit b6500fe

Browse files
committed
SOAP call not rejected when interceptor fails
When a ClientInterceptor returns false for handleRequest, the actual SOAP call should not proceed. Issue: SWS-892
1 parent 3f15500 commit b6500fe

File tree

2 files changed

+9
-13
lines changed

2 files changed

+9
-13
lines changed

spring-ws-core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,16 +590,19 @@ protected <T> T doSendAndReceive(MessageContext messageContext,
590590
requestCallback.doWithMessage(messageContext.getRequest());
591591
}
592592
// Apply handleRequest of registered interceptors
593+
boolean intercepted = false;
593594
if (interceptors != null) {
594595
for (int i = 0; i < interceptors.length; i++) {
595596
interceptorIndex = i;
596597
if (!interceptors[i].handleRequest(messageContext)) {
598+
intercepted = true;
597599
break;
598600
}
599601
}
600602
}
601-
// if an interceptor has set a response, we don't send/receive
602-
if (!messageContext.hasResponse()) {
603+
// no send/receive if an interceptor has set a response or if the chain
604+
// has been interrupted
605+
if (!messageContext.hasResponse() && !intercepted) {
603606
sendRequest(connection, messageContext.getRequest());
604607
if (hasError(connection, messageContext.getRequest())) {
605608
triggerAfterCompletion(interceptorIndex, messageContext, null);
@@ -622,6 +625,7 @@ protected <T> T doSendAndReceive(MessageContext messageContext,
622625
}
623626
}
624627
else {
628+
triggerAfterCompletion(interceptorIndex, messageContext, null);
625629
return null;
626630
}
627631
}
@@ -793,8 +797,8 @@ private void triggerHandleFault(int interceptorIndex, MessageContext messageCont
793797
* invoke afterCompletion for all interceptors whose handleRequest invocation has
794798
* successfully completed and returned true, in addition to the last interceptor who
795799
* returned {@code false}.
796-
* @param mappedEndpoint the mapped EndpointInvocationChain
797800
* @param interceptorIndex index of last interceptor that successfully completed
801+
* @param messageContext the message context
798802
* @param ex Exception thrown on handler execution, or {@code null} if none
799803
* @see ClientInterceptor#afterCompletion
800804
*/

spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTest.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -407,32 +407,24 @@ public void testInterceptors() throws Exception {
407407
}
408408

409409
@Test
410-
public void testInterceptorsIntercepted() throws Exception {
410+
public void testInterceptorsInterceptedNoResponse() throws Exception {
411411
MessageContext messageContext = new DefaultMessageContext(messageFactory);
412412

413413
ClientInterceptor interceptorMock1 = createStrictMock("interceptor1", ClientInterceptor.class);
414414
ClientInterceptor interceptorMock2 = createStrictMock("interceptor2", ClientInterceptor.class);
415415
template.setInterceptors(new ClientInterceptor[]{interceptorMock1, interceptorMock2});
416416
expect(interceptorMock1.handleRequest(isA(MessageContext.class))).andReturn(false);
417-
expect(interceptorMock1.handleResponse(isA(MessageContext.class))).andReturn(true);
418417
interceptorMock1.afterCompletion(isA(MessageContext.class), (Exception)isNull());
419418

420419
WebServiceMessageCallback requestCallback = createMock(WebServiceMessageCallback.class);
421420
requestCallback.doWithMessage(messageContext.getRequest());
422421

423422
WebServiceMessageExtractor extractorMock = createMock(WebServiceMessageExtractor.class);
424-
Object extracted = new Object();
425-
expect(extractorMock.extractData(isA(WebServiceMessage.class))).andReturn(extracted);
426-
427-
connectionMock.send(isA(WebServiceMessage.class));
428-
expect(connectionMock.hasError()).andReturn(false);
429-
expect(connectionMock.receive(messageFactory)).andReturn(new MockWebServiceMessage("<response/>"));
430-
expect(connectionMock.hasFault()).andReturn(false);
431423

432424
replay(connectionMock, interceptorMock1, interceptorMock2, requestCallback, extractorMock);
433425

434426
Object result = template.doSendAndReceive(messageContext, connectionMock, requestCallback, extractorMock);
435-
assertEquals("Invalid response", extracted, result);
427+
assertNull(result);
436428

437429
verify(connectionMock, interceptorMock1, interceptorMock2, requestCallback, extractorMock);
438430
}

0 commit comments

Comments
 (0)