You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by eg...@apache.org on 2006/11/07 15:33:44 UTC

svn commit: r472125 - in /incubator/cxf/trunk: rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ rt/transports/http/src/main/java/org/apache/cxf/transport/http/ systests/src/test/java/org/apache/cxf/systest/ws/rm/

Author: eglynn
Date: Tue Nov  7 06:33:42 2006
New Revision: 472125

URL: http://svn.apache.org/viewvc?view=rev&rev=472125
Log:
Fixes for:
- HTTPConduit incorrectly discarding partial responses to oneway requests
- SOAPOutInterceptor starting <SOAP:Body> element before it ends the
  <SOAP:Header> element in certain circumstances

Modified:
    incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
    incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/SequenceTest.java

Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java?view=diff&rev=472125&r1=472124&r2=472125
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java Tue Nov  7 06:33:42 2006
@@ -77,8 +77,11 @@
                     StaxUtils.writeElement(eleHeaders, xtw, true, false);
                 }
             }
-            handleHeaderPart(preexistingHeaders, message);
-       
+            boolean endedHeader = handleHeaderPart(preexistingHeaders, message);
+            if (preexistingHeaders && !endedHeader) {
+                xtw.writeEndElement();
+            }
+
             xtw.writeStartElement(soapVersion.getPrefix(), 
                                   soapVersion.getBody().getLocalPart(),
                                   soapVersion.getNamespace());
@@ -105,33 +108,34 @@
         }
     }
     
-    private void handleHeaderPart(boolean preexistingHeaders, SoapMessage message) {
+    private boolean handleHeaderPart(boolean preexistingHeaders, SoapMessage message) {
         //add MessagePart to soapHeader if necessary
+        boolean endedHeader = false;
         Exchange exchange = message.getExchange();
         BindingOperationInfo bop = (BindingOperationInfo)exchange.get(BindingOperationInfo.class
                                                                             .getName());
         if (bop == null) {
-            return;
+            return endedHeader;
         }
         XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);        
         boolean startedHeader = false;
         List<MessagePartInfo> parts = new ArrayList<MessagePartInfo>();
         BindingMessageInfo bmi = isRequestor(message) ? bop.getInput() : bop.getOutput();
         if (bmi == null) {
-            return;
+            return endedHeader;
         } else {
             parts = bmi.getMessageInfo().getMessageParts();
         } 
         if (parts.size() > 0) {
             List<?> objs = message.getContent(List.class);
             if (objs == null) {
-                return;
+                return endedHeader;
             }            
             Object[] args = objs.toArray();
             SoapVersion soapVersion = message.getVersion();
             List<SoapHeaderInfo> headers = bmi.getExtensors(SoapHeaderInfo.class);
             if (headers == null) {
-                return;
+                return endedHeader;
             }
             for (SoapHeaderInfo header : headers) {
                 Object arg = args[header.getSequence()];
@@ -161,6 +165,7 @@
             if (startedHeader || preexistingHeaders) {
                 try {
                     xtw.writeEndElement();
+                    endedHeader = true;
                 } catch (XMLStreamException e) {
                     throw new SoapFault(
                         new org.apache.cxf.common.i18n.Message("XML_WRITE_EXC", BUNDLE), 
@@ -168,6 +173,7 @@
                 }
             }
         }
+        return endedHeader;
     }       
     
     protected boolean isRequestor(Message message) {

Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?view=diff&rev=472125&r1=472124&r2=472125
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Tue Nov  7 06:33:42 2006
@@ -449,18 +449,22 @@
 
         private void handleResponse() throws IOException {
             Exchange exchange = outMessage.getExchange();
-            if (exchange != null && exchange.isOneWay()) {
+            int responseCode = getResponseCode(connection);
+            if (exchange != null
+                && exchange.isOneWay()
+                && responseCode != HttpURLConnection.HTTP_ACCEPTED) {
                 //oneway operation
                 connection.getInputStream().close();
                 return;
             }
+            
             Message inMessage = new MessageImpl();
             if (exchange != null) {
                 exchange.setInMessage(inMessage);
             }
             InputStream in = null;
             inMessage.put(Message.PROTOCOL_HEADERS, connection.getHeaderFields());
-            inMessage.put(Message.RESPONSE_CODE, getResponseCode(connection));
+            inMessage.put(Message.RESPONSE_CODE, responseCode);
             if (connection instanceof HttpURLConnection) {
                 HttpURLConnection hc = (HttpURLConnection)connection;
                 in = hc.getErrorStream();

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/SequenceTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/SequenceTest.java?view=diff&rev=472125&r1=472124&r2=472125
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/SequenceTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/SequenceTest.java Tue Nov  7 06:33:42 2006
@@ -102,8 +102,11 @@
         }
         setupGreeter("org/apache/cxf/systest/ws/rm/anonymous.xml");
 
+        System.out.println("*** calling once");
         greeter.greetMeOneWay("once");
+        System.out.println("*** calling twice");
         greeter.greetMeOneWay("twice");
+        System.out.println("*** calling thrice");
         greeter.greetMeOneWay("thrice");
 
         // three application messages plus createSequence
@@ -115,13 +118,13 @@
         mf.verifyActions(expectedActions, true);
         mf.verifyMessageNumbers(new String[] {null, "1", "2", "3"}, true);
 
-        // createSequenceResponse plus ? partial responses
-        // partial responses not sent!
-        mf.verifyMessages(1, false);
-        expectedActions = new String[] {RMConstants.getCreateSequenceResponseAction()};
+        // createSequenceResponse plus 3 partial responses
+        
+        mf.verifyMessages(4, false);
+        expectedActions = new String[] {RMConstants.getCreateSequenceResponseAction(), null, null, null};
         mf.verifyActions(expectedActions, false);
-        mf.verifyMessageNumbers(new String[] {null}, false);
-        mf.verifyAcknowledgements(new boolean[] {false}, false);
+        mf.verifyMessageNumbers(new String[] {null, null, null, null}, false);
+        mf.verifyAcknowledgements(new boolean[] {false, false, false, false}, false);
     }
 
     // --- test utilities ---