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 2009/11/05 17:31:11 UTC

svn commit: r833075 - in /cxf/trunk/rt/bindings/soap/src: main/java/org/apache/cxf/binding/soap/interceptor/ test/java/org/apache/cxf/binding/soap/ test/resources/org/apache/cxf/binding/soap/

Author: dkulp
Date: Thu Nov  5 16:30:39 2009
New Revision: 833075

URL: http://svn.apache.org/viewvc?rev=833075&view=rev
Log:
[CXF-1536] If schemavalidation is enabled, also check to make sure the
soap body/envelope are properly closed so the structure of the soap
message is correct as well.

Added:
    cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml   (with props)
Modified:
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
    cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ReadHeaderInterceptorTest.java
    cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java

Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java?rev=833075&r1=833074&r2=833075&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java Thu Nov  5 16:30:39 2009
@@ -50,12 +50,41 @@
 import org.apache.cxf.headers.HeaderManager;
 import org.apache.cxf.headers.HeaderProcessor;
 import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.phase.Phase;
 import org.apache.cxf.staxutils.PartialXMLStreamReader;
 import org.apache.cxf.staxutils.StaxUtils;
 
 
 public class ReadHeadersInterceptor extends AbstractSoapInterceptor {
+    /**
+     * 
+     */
+    public static class CheckClosingTagsInterceptor extends AbstractSoapInterceptor {
+        public CheckClosingTagsInterceptor() {
+            super(Phase.POST_LOGICAL);
+        }
+        
+        /** {@inheritDoc}*/
+        public void handleMessage(SoapMessage message) throws Fault {
+            XMLStreamReader xmlReader = message.getContent(XMLStreamReader.class);
+            if (xmlReader != null) {
+                try {
+                    while (xmlReader.hasNext()) {
+                        if (xmlReader.next() == XMLStreamReader.END_DOCUMENT) {
+                            return;
+                        }
+                    }
+                } catch (XMLStreamException e) {
+                    throw new SoapFault(e.getMessage(), e, 
+                                        message.getVersion().getSender());
+                }
+            }
+        }
+
+    }
+
     private static final Logger LOG = LogUtils.getL7dLogger(ReadHeadersInterceptor.class);
 
     private Bus bus;
@@ -183,6 +212,11 @@
                         hel = DOMUtils.getNextElement(hel);
                     }
                 }
+                if (MessageUtils.getContextualBoolean(message, 
+                                                      SoapMessage.SCHEMA_VALIDATION_ENABLED,
+                                                      false)) {
+                    message.getInterceptorChain().add(new CheckClosingTagsInterceptor());
+                }
             }
         } catch (XMLStreamException e) {
             throw new SoapFault(new Message("XML_STREAM_EXC", LOG), e, message.getVersion().getSender());

Modified: cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ReadHeaderInterceptorTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ReadHeaderInterceptorTest.java?rev=833075&r1=833074&r2=833075&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ReadHeaderInterceptorTest.java (original)
+++ cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/ReadHeaderInterceptorTest.java Thu Nov  5 16:30:39 2009
@@ -41,6 +41,9 @@
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.interceptor.StaxInInterceptor;
 import org.apache.cxf.message.Attachment;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.staxutils.StaxUtils;
+
 import org.junit.Before;
 import org.junit.Test;
 
@@ -79,6 +82,17 @@
     }
 
     @Test
+    public void testNoClosingEnvTage() throws Exception {
+        soapMessage = TestUtil.createEmptySoapMessage(Soap12.getInstance(), chain);
+        InputStream in = getClass().getResourceAsStream("test-no-endenv.xml");
+        assertNotNull(in);
+        soapMessage.put(Message.SCHEMA_VALIDATION_ENABLED, Boolean.TRUE);
+        soapMessage.setContent(XMLStreamReader.class, StaxUtils.createXMLStreamReader(in));
+
+        soapMessage.getInterceptorChain().doIntercept(soapMessage);
+        assertNotNull(soapMessage.getContent(Exception.class));
+    }
+    @Test
     public void testHandleHeader() {
         try {
             prepareSoapMessage("test-soap-header.xml");

Modified: cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java?rev=833075&r1=833074&r2=833075&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java (original)
+++ cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java Thu Nov  5 16:30:39 2009
@@ -69,7 +69,8 @@
         phases.add(phase2);
         phases.add(phase3);
         phases.add(phase4);
-        phases.add(new Phase(Phase.INVOKE, 5));
+        phases.add(new Phase(Phase.POST_LOGICAL, 5));
+        phases.add(new Phase(Phase.INVOKE, 6));
         chain = new PhaseInterceptorChain(phases);
 
         soapMessage = TestUtil.createEmptySoapMessage(Soap11.getInstance(), chain);

Added: cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml?rev=833075&view=auto
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml (added)
+++ cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml Thu Nov  5 16:30:39 2009
@@ -0,0 +1,42 @@
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership. The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+    
+    http://www.apache.org/licenses/LICENSE-2.0
+    
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
+    <env:Body>
+        <!-- boyd test for processing comment here -->
+        <p:itinerary xmlns:p="http://travelcompany.example.org/reservation/travel">
+            <p:departure>
+                <p:departing>New York</p:departing>
+                <p:arriving>Los Angeles</p:arriving>
+                <p:departureDate>2001-12-14</p:departureDate>
+                <p:departureTime>late afternoon</p:departureTime>
+                <p:seatPreference>aisle</p:seatPreference>
+            </p:departure>
+            <p:return>
+                <p:departing>Los Angeles</p:departing>
+                <p:arriving>New York</p:arriving>
+                <p:departureDate>2001-12-20</p:departureDate>
+                <p:departureTime>mid-morning</p:departureTime>
+                <p:seatPreference />
+            </p:return>
+        </p:itinerary>
+        <q:lodging xmlns:q="http://travelcompany.example.org/reservation/hotels">
+            <q:preference>none</q:preference>
+        </q:lodging>
+    </env:Body>
+

Propchange: cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: cxf/trunk/rt/bindings/soap/src/test/resources/org/apache/cxf/binding/soap/test-no-endenv.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml