You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/02/19 21:27:14 UTC

svn commit: r1447900 - /cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java

Author: dkulp
Date: Tue Feb 19 20:27:14 2013
New Revision: 1447900

URL: http://svn.apache.org/r1447900
Log:
Merged revisions 1447874 via  git cherry-pick from
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1447874 | dkulp | 2013-02-19 14:16:44 -0500 (Tue, 19 Feb 2013) | 2 lines

  Fix a problem where the wrong fault was returned.

........

Modified:
    cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java

Modified: cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java?rev=1447900&r1=1447899&r2=1447900&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java (original)
+++ cxf/branches/2.7.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java Tue Feb 19 20:27:14 2013
@@ -95,6 +95,18 @@ public class MustUnderstandInterceptor e
             checkUltimateReceiverHeaders(ultimateReceiverHeaders, mustUnderstandQNames, soapMessage);
         }
     }
+    @Override
+    public void handleFault(SoapMessage msg) {
+        Set<QName> unknowns = CastUtils.cast((Set<?>)msg.get(MustUnderstandInterceptor.UNKNOWNS));
+        if (msg.getExchange().getBindingOperationInfo() == null 
+            && unknowns != null && !unknowns.isEmpty()) {
+            //per jaxws spec, if there are must understands that we didn't understand, but couldn't map
+            //to an operation either, we need to throw the mustunderstand fault, not the one related to
+            //an unknown operation
+            msg.setContent(Exception.class, new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, unknowns),
+                                                          msg.getVersion().getMustUnderstand()));
+        }
+    }
 
     private void checkUltimateReceiverHeaders(Set<Header> ultimateReceiverHeaders,
                                               Set<QName> mustUnderstandQNames, 
@@ -236,6 +248,7 @@ public class MustUnderstandInterceptor e
             
             
             if (!notFound.isEmpty()) {
+                soapMessage.remove(UNKNOWNS);
                 throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notFound),
                                 soapVersion.getMustUnderstand());
             }            
@@ -263,11 +276,10 @@ public class MustUnderstandInterceptor e
                 Set<QName> paramHeaders = HeaderUtil.getHeaderQNameInOperationParam(message);
                 unknowns.removeAll(paramHeaders);
                 
+                message.remove(MustUnderstandInterceptor.UNKNOWNS);
                 if (!unknowns.isEmpty()) {
                     throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, unknowns),
                                         message.getVersion().getMustUnderstand());
-                } else {
-                    message.remove(MustUnderstandInterceptor.UNKNOWNS);
                 }
             }
         }