You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2011/01/16 09:15:19 UTC

svn commit: r1059511 - in /cxf/trunk: rt/transports/http/src/main/java/org/apache/cxf/transport/http/ systests/transports/ systests/transports/src/test/java/org/apache/cxf/systest/http/auth/

Author: cschneider
Date: Sun Jan 16 08:15:18 2011
New Revision: 1059511

URL: http://svn.apache.org/viewvc?rev=1059511&view=rev
Log:
CXF-3249 Better handling of HTTP 401 responses and other HTTP error codes

Added:
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPException.java
Modified:
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
    cxf/trunk/systests/transports/   (props changed)
    cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/http/auth/DigestAuthTest.java

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?rev=1059511&r1=1059510&r2=1059511&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Sun Jan 16 08:15:18 2011
@@ -21,6 +21,7 @@ package org.apache.cxf.transport.http;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -1493,11 +1494,13 @@ public class HTTPConduit 
             
             logResponseInfo(responseCode);
             
-            if (responseCode == HttpURLConnection.HTTP_NOT_FOUND
-                && !MessageUtils.isTrue(outMessage.getContextualProperty(
-                    "org.apache.cxf.http.no_io_exceptions"))) {
-                throw new IOException("HTTP response '" + responseCode + ": " 
-                    + connection.getResponseMessage() + "'");
+            // This property should be set in case the exceptions should not be handled here
+            // For example jax rs uses this
+            boolean noExceptions = MessageUtils.isTrue(outMessage.getContextualProperty(
+                "org.apache.cxf.http.no_io_exceptions"));
+            if (responseCode >= 400 && responseCode != 500 && !noExceptions) {
+                throw new HTTPException(responseCode, connection.getResponseMessage(), 
+                                        connection.getURL());
             }
 
             InputStream in = null;
@@ -1550,8 +1553,10 @@ public class HTTPConduit 
                     in = connection.getInputStream();
                 }
             }
-            // if (in == null) : it's perfectly ok for non-soap http services
-            // have no response body : those interceptors which do need it will check anyway        
+            if (in == null) {
+                // Create an empty stream to avoid NullPointerExceptions
+                in = new ByteArrayInputStream(new byte[] {});
+            }
             inMessage.setContent(InputStream.class, in);
             
             

Added: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPException.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPException.java?rev=1059511&view=auto
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPException.java (added)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPException.java Sun Jan 16 08:15:18 2011
@@ -0,0 +1,49 @@
+/**
+ * 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.
+ */
+package org.apache.cxf.transport.http;
+
+import java.io.IOException;
+import java.net.URL;
+
+public class HTTPException extends IOException {
+    private int responseCode;
+    private String responseMessage;
+    private URL url;
+    
+    public HTTPException(int responseCode, String responseMessage, URL url) {
+        super("HTTP response '" + responseCode + ": " 
+              + responseMessage + "' when communicating with " + url.toString());
+        this.responseCode = responseCode;
+        this.responseMessage = responseMessage;
+        this.url = url;
+    }
+
+    public int getResponseCode() {
+        return responseCode;
+    }
+
+    public String getResponseMessage() {
+        return responseMessage;
+    }
+
+    public URL getUrl() {
+        return url;
+    }
+ 
+}

Propchange: cxf/trunk/systests/transports/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sun Jan 16 08:15:18 2011
@@ -8,3 +8,5 @@ eclipse-classes
 .project
 .wtpmodules
 
+
+activemq-data

Modified: cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/http/auth/DigestAuthTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/http/auth/DigestAuthTest.java?rev=1059511&r1=1059510&r2=1059511&view=diff
==============================================================================
--- cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/http/auth/DigestAuthTest.java (original)
+++ cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/http/auth/DigestAuthTest.java Sun Jan 16 08:15:18 2011
@@ -23,13 +23,13 @@ package org.apache.cxf.systest.http.auth
 import java.net.URL;
 
 import javax.xml.namespace.QName;
-import javax.xml.ws.soap.SOAPFaultException;
 
 import org.apache.cxf.configuration.security.AuthorizationPolicy;
 import org.apache.cxf.endpoint.Client;
 import org.apache.cxf.frontend.ClientProxy;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
 import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.HTTPException;
 import org.apache.hello_world.Greeter;
 import org.apache.hello_world.services.SOAPService;
 
@@ -97,13 +97,11 @@ public class DigestAuthTest extends Abst
         try {
             String answer = mortimer.sayHi();
             Assert.fail("Unexpected reply (" + answer + "). Should throw exception");
-        } catch (SOAPFaultException e) {
-            // TODO do we really expect Can't find input stream here. I rather would expect
-            // authorization failed with some infos
+        } catch (Exception e) {
             Throwable cause = e.getCause();
-            Assert.assertEquals(RuntimeException.class, cause.getClass());
-            RuntimeException rte = (RuntimeException)cause;
-            Assert.assertTrue(rte.getMessage().startsWith("Can't find input stream"));
+            Assert.assertEquals(HTTPException.class, cause.getClass());
+            HTTPException he = (HTTPException)cause;
+            Assert.assertEquals(401, he.getResponseCode());
         }
     }