You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/06/26 22:50:42 UTC
svn commit: r1497090 - in /cxf/trunk/rt:
rs/client/src/main/java/org/apache/cxf/jaxrs/client/
transports/http/src/main/java/org/apache/cxf/transport/http/
transports/http/src/test/java/org/apache/cxf/transport/http/
Author: sergeyb
Date: Wed Jun 26 20:50:41 2013
New Revision: 1497090
URL: http://svn.apache.org/r1497090
Log:
[CXF-5093] Initial try to update HTTPConduit and also RS client code to better deal with requests with no payloads
Modified:
cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
Modified: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1497090&r1=1497089&r2=1497090&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Wed Jun 26 20:50:41 2013
@@ -45,6 +45,7 @@ import javax.ws.rs.WebApplicationExcepti
import javax.ws.rs.client.ResponseProcessingException;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.Form;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
@@ -906,10 +907,10 @@ public abstract class AbstractClient imp
m.put(Message.CONTENT_TYPE, headers.getFirst(HttpHeaders.CONTENT_TYPE));
+ body = checkIfBodyEmpty(body);
+ setEmptyRequestPropertyIfNeeded(m, body);
+
m.setContent(List.class, getContentsList(body));
- if (body == null) {
- setEmptyRequestProperty(m, httpMethod);
- }
m.put(URITemplate.TEMPLATE_PARAMETERS, getState().getTemplates());
@@ -930,6 +931,23 @@ public abstract class AbstractClient imp
return m;
}
+ protected void setEmptyRequestPropertyIfNeeded(Message outMessage, Object body) {
+ if (body == null) {
+ outMessage.put("org.apache.cxf.empty.request", true);
+ }
+ }
+
+
+ protected Object checkIfBodyEmpty(Object body) {
+ if (body != null
+ && (body.getClass() == String.class && ((String)body).length() == 0
+ || body.getClass() == Form.class && ((Form)body).asMap().isEmpty()
+ || Map.class.isAssignableFrom(body.getClass()) && ((Map<?, ?>)body).isEmpty())) {
+ body = null;
+ }
+ return body;
+ }
+
protected Map<String, Object> getRequestContext(Message outMessage) {
Map<String, Object> invContext
= CastUtils.cast((Map<?, ?>)outMessage.get(Message.INVOCATION_CONTEXT));
@@ -984,12 +1002,6 @@ public abstract class AbstractClient imp
exchange.putAll(reqContext);
}
- protected void setEmptyRequestProperty(Message outMessage, String httpMethod) {
- if ("POST".equals(httpMethod)) {
- outMessage.put("org.apache.cxf.post.empty", true);
- }
- }
-
protected void setPlainOperationNameProperty(Message outMessage, String name) {
outMessage.getExchange().put("org.apache.cxf.resource.operation.name", name);
}
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=1497090&r1=1497089&r2=1497090&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 Wed Jun 26 20:50:41 2013
@@ -166,7 +166,8 @@ public abstract class HTTPConduit
private static final String HTTP_POST_METHOD = "POST";
private static final String HTTP_PUT_METHOD = "PUT";
-
+ private static final Set<String> KNOWN_HTTP_VERBS_WITH_NO_CONTENT =
+ new HashSet<String>(Arrays.asList(new String[]{"GET", "DELETE", "HEAD", "OPTIONS", "TRACE"}));
/**
* This constant is the Message(Map) key for a list of visited URLs that
* is used in redirect loop protection.
@@ -1264,21 +1265,16 @@ public abstract class HTTPConduit
// Trust is okay, set up for writing the request.
- // If this is a GET method we must not touch the output
- // stream as this automatically turns the request into a POST.
- // Nor it should be done in case of DELETE/HEAD/OPTIONS
- // - strangely, empty PUTs work ok
String method = getMethod();
- if (!"POST".equals(method)
- && !"PUT".equals(method)) {
+ if (KNOWN_HTTP_VERBS_WITH_NO_CONTENT.contains(method)) {
handleNoOutput();
return;
}
- if (outMessage.get("org.apache.cxf.post.empty") != null) {
+
+ if (outMessage.get("org.apache.cxf.empty.request") != null) {
handleNoOutput();
return;
}
-
setupWrappedStream();
}
Modified: cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java?rev=1497090&r1=1497089&r2=1497090&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java (original)
+++ cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java Wed Jun 26 20:50:41 2013
@@ -42,6 +42,7 @@ import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.io.AbstractThresholdOutputStream;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.transport.MessageObserver;
@@ -138,7 +139,7 @@ public class HTTPConduitURLEasyMockTest
public void testSend() throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
verifySentMessage(conduit, message, "POST");
finalVerify();
@@ -148,14 +149,20 @@ public class HTTPConduitURLEasyMockTest
public void testSendWithHeaders() throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
- message.put("Content-Type", "text/xml;charset=utf8");
+ Message message = createMessage();
setUpHeaders(message);
conduit.prepare(message);
verifySentMessage(conduit, message, true, "POST", false);
finalVerify();
}
+ private Message createMessage() {
+ Message message = new MessageImpl();
+ message.put("Content-Type", "text/xml;charset=utf8");
+ message.setContent(List.class, new MessageContentsList("<body/>"));
+ return message;
+ }
+
public void testSendWithHeadersCheckErrorStream() throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
@@ -171,7 +178,7 @@ public class HTTPConduitURLEasyMockTest
public void testSendHttpConnection() throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
verifySentMessage(conduit, message, "POST");
finalVerify();
@@ -181,7 +188,7 @@ public class HTTPConduitURLEasyMockTest
public void testSendHttpConnectionAutoRedirect() throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, true);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
verifySentMessage(conduit, message, "POST");
finalVerify();
@@ -216,7 +223,7 @@ public class HTTPConduitURLEasyMockTest
throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
message.put(Message.PROCESS_ONEWAY_RESPONSE, Boolean.TRUE);
verifySentMessage(conduit,
@@ -233,7 +240,7 @@ public class HTTPConduitURLEasyMockTest
throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
verifySentMessage(conduit,
message,
@@ -249,7 +256,7 @@ public class HTTPConduitURLEasyMockTest
throws Exception {
control = EasyMock.createNiceControl();
HTTPConduit conduit = setUpConduit(true, false);
- Message message = new MessageImpl();
+ Message message = createMessage();
conduit.prepare(message);
verifySentMessage(conduit,
message,