You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ni...@apache.org on 2007/03/16 05:27:23 UTC
svn commit: r518860 [2/2] - in /incubator/cxf/trunk/rt/transports/http: ./
src/main/java/org/apache/cxf/transport/http/
src/main/java/org/apache/cxf/transport/https/
src/main/java/org/apache/cxf/transport/servlet/
src/test/java/org/apache/cxf/transport...
Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletDestination.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletDestination.java?view=diff&rev=518860&r1=518859&r2=518860
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletDestination.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletDestination.java Thu Mar 15 21:27:21 2007
@@ -20,22 +20,38 @@
package org.apache.cxf.transport.servlet;
import java.io.IOException;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cxf.Bus;
+import org.apache.cxf.helpers.HttpHeaderHelper;
+import org.apache.cxf.io.AbstractWrappedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.AbstractDestination;
+import org.apache.cxf.transport.Conduit;
import org.apache.cxf.transport.ConduitInitiator;
import org.apache.cxf.transport.MessageObserver;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class ServletDestination extends AbstractHTTPDestination {
+
+ public static final String HTTP_REQUEST =
+ "HTTP_SERVLET_REQUEST";
+ public static final String HTTP_RESPONSE =
+ "HTTP_SERVLET_RESPONSE";
static final Logger LOG = Logger.getLogger(ServletDestination.class.getName());
@@ -65,9 +81,48 @@
protected Logger getLogger() {
return LOG;
}
-
+
+ /**
+ * @param inMessage the incoming message
+ * @return the inbuilt backchannel
+ */
+ protected Conduit getInbuiltBackChannel(Message inMessage) {
+ HttpServletResponse response = (HttpServletResponse)inMessage.get(HTTP_RESPONSE);
+ return new BackChannelConduit(response);
+ }
-
+
+
+ /**
+ * Copy the request headers into the message.
+ *
+ * @param message the current message
+ * @param headers the current set of headers
+ */
+ protected void copyRequestHeaders(Message message, Map<String, List<String>> headers) {
+ HttpServletRequest req = (HttpServletRequest)message.get(HTTP_REQUEST);
+ for (Enumeration e = req.getHeaderNames(); e.hasMoreElements();) {
+ String fname = (String)e.nextElement();
+
+ List<String> values;
+ if (headers.containsKey(fname)) {
+ values = headers.get(fname);
+ } else {
+ values = new ArrayList<String>();
+ headers.put(HttpHeaderHelper.getHeaderKey(fname), values);
+ }
+ for (Enumeration e2 = req.getHeaders(fname); e2.hasMoreElements();) {
+ String val = (String)e2.nextElement();
+ values.add(val);
+ }
+ }
+ }
+ /**
+ * Copy the response headers into the response.
+ *
+ * @param message the current message
+ * @param headers the current set of headers
+ */
protected void copyResponseHeaders(Message message, HttpServletResponse response) {
String ct = (String) message.get(Message.CONTENT_TYPE);
String enc = (String) message.get(Message.ENCODING);
@@ -80,7 +135,9 @@
} else if (enc != null) {
response.setContentType("text/xml; charset=" + enc);
}
- }
+
+ }
+
protected void doMessage(MessageImpl inMessage) throws IOException {
@@ -98,7 +155,104 @@
}
}
- }
+ }
+
+ protected class BackChannelConduit
+ extends AbstractDestination.AbstractBackChannelConduit {
+
+ protected HttpServletResponse response;
+
+ BackChannelConduit(HttpServletResponse resp) {
+ response = resp;
+ }
+
+ /**
+ * Send an outbound message, assumed to contain all the name-value
+ * mappings of the corresponding input message (if any).
+ *
+ * @param message the message to be sent.
+ */
+ public void send(Message message) throws IOException {
+ message.put(HTTP_RESPONSE, response);
+ message.setContent(OutputStream.class,
+ new WrappedOutputStream(message, response));
+ }
+ }
+
+ private class WrappedOutputStream extends AbstractWrappedOutputStream {
+
+ protected HttpServletResponse response;
+
+ WrappedOutputStream(Message m, HttpServletResponse resp) {
+ super(m);
+ response = resp;
+ }
+
+ /**
+ * Perform any actions required on stream flush (freeze headers,
+ * reset output stream ... etc.)
+ */
+ protected void doFlush() throws IOException {
+ OutputStream responseStream = flushHeaders(outMessage);
+ if (null != responseStream && !alreadyFlushed()) {
+ resetOut(responseStream, true);
+ }
+ }
+
+ /**
+ * Perform any actions required on stream closure (handle response etc.)
+ */
+ protected void doClose() {
+ commitResponse();
+ }
+
+ protected void onWrite() throws IOException {
+ }
+
+ private void commitResponse() {
+ try {
+ response.flushBuffer();
+ } catch (IOException e) {
+ LOG.severe(e.getMessage());
+ }
+ }
+ }
+
+ protected OutputStream flushHeaders(Message outMessage) throws IOException {
+ updateResponseHeaders(outMessage);
+ Object responseObj = outMessage.get(HTTP_RESPONSE);
+ OutputStream responseStream = null;
+ if (responseObj instanceof HttpServletResponse) {
+ HttpServletResponse response = (HttpServletResponse)responseObj;
+
+ Integer i = (Integer)outMessage.get(Message.RESPONSE_CODE);
+ if (i != null) {
+ int status = i.intValue();
+ response.setStatus(status);
+ } else {
+ response.setStatus(HttpURLConnection.HTTP_OK);
+ }
+
+ copyResponseHeaders(outMessage, response);
+ responseStream = response.getOutputStream();
+
+ if (isOneWay(outMessage)) {
+ response.flushBuffer();
+ }
+ } else {
+ LOG.log(Level.WARNING, "UNEXPECTED_RESPONSE_TYPE_MSG", responseObj.getClass());
+ throw new IOException("UNEXPECTED_RESPONSE_TYPE_MSG" + responseObj.getClass());
+ }
+
+ if (isOneWay(outMessage)) {
+ outMessage.remove(HTTP_RESPONSE);
+ }
+ return responseStream;
+ }
+
+ protected boolean isOneWay(Message message) {
+ return message.getExchange() != null && message.getExchange().isOneWay();
+ }
public MessageObserver getMessageObserver() {
return this.incomingObserver;
Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitTest.java?view=diff&rev=518860&r1=518859&r2=518860
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitTest.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitTest.java Thu Mar 15 21:27:21 2007
@@ -33,9 +33,6 @@
import java.util.List;
import java.util.Map;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletOutputStream;
-
import junit.framework.TestCase;
import org.apache.cxf.bus.CXFBusImpl;
@@ -66,8 +63,8 @@
private Proxy proxy;
private Message inMessage;
private MessageObserver observer;
- private ServletOutputStream os;
- private ServletInputStream is;
+ private OutputStream os;
+ private InputStream is;
private IMocksControl control;
public void setUp() throws Exception {
@@ -142,8 +139,7 @@
contentTypes.add("text/xml");
contentTypes.add("charset=utf8");
headers.put("content-type", contentTypes);
- message.put(Message.PROTOCOL_HEADERS, headers);
-
+ message.put(Message.PROTOCOL_HEADERS, headers);
AuthorizationPolicy authPolicy = new AuthorizationPolicy();
authPolicy.setUserName("BJ");
@@ -203,9 +199,9 @@
((HttpURLConnection)connection).setChunkedStreamingMode(2048);
EasyMock.expectLastCall();
}
- }
+ }
}
-
+
CXFBusImpl bus = new CXFBusImpl();
URL decoupledURL = null;
if (decoupled) {
@@ -226,14 +222,13 @@
}
control.replay();
-
+
HTTPConduit conduit = new HTTPConduit(bus,
endpointInfo,
null,
connectionFactory);
conduit.retrieveConnectionFactory();
-
if (send) {
conduit.getClient().setConnectionTimeout(303030);
conduit.getClient().setReceiveTimeout(404040);
@@ -244,14 +239,14 @@
}
}
}
-
+
if (decoupled) {
conduit.getClient().setDecoupledEndpoint(decoupledURL.toString());
assertNotNull("expected back channel", conduit.getBackChannel());
} else {
assertNull("unexpected back channel", conduit.getBackChannel());
}
-
+
observer = new MessageObserver() {
public void onMessage(Message m) {
inMessage = m;
@@ -289,7 +284,7 @@
}
- os = EasyMock.createMock(ServletOutputStream.class);
+ os = EasyMock.createMock(OutputStream.class);
connection.getOutputStream();
EasyMock.expectLastCall().andReturn(os);
os.write(PAYLOAD.getBytes(), 0, PAYLOAD.length());
@@ -303,9 +298,9 @@
EasyMock.expectLastCall();
verifyHandleResponse(decoupled);
-
+
control.replay();
-
+
wrappedOS.flush();
wrappedOS.flush();
wrappedOS.close();
@@ -375,7 +370,7 @@
String responseString = Integer.toString(responseCode);
EasyMock.expectLastCall().andReturn(responseString).times(2);
}
- is = EasyMock.createMock(ServletInputStream.class);
+ is = EasyMock.createMock(InputStream.class);
connection.getInputStream();
EasyMock.expectLastCall().andReturn(is);
}
@@ -395,10 +390,10 @@
inMessage.get(DECOUPLED_CHANNEL_MESSAGE));
assertEquals("unexpected HTTP_REQUEST set",
false,
- inMessage.containsKey(AbstractHTTPDestination.HTTP_REQUEST));
+ inMessage.containsKey(HTTPConduit.HTTP_REQUEST));
assertEquals("unexpected HTTP_RESPONSE set",
false,
- inMessage.containsKey(AbstractHTTPDestination.HTTP_RESPONSE));
+ inMessage.containsKey(HTTPConduit.HTTP_RESPONSE));
assertEquals("unexpected Message.ASYNC_POST_RESPONSE_DISPATCH set",
false,
inMessage.containsKey(Message.ASYNC_POST_RESPONSE_DISPATCH));
Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyContextInspectorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyContextInspectorTest.java?view=diff&rev=518860&r1=518859&r2=518860
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyContextInspectorTest.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyContextInspectorTest.java Thu Mar 15 21:27:21 2007
@@ -23,17 +23,17 @@
import org.easymock.classextension.EasyMock;
import org.easymock.classextension.IMocksControl;
-import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.http.HttpContext;
public class JettyContextInspectorTest extends TestCase {
private static final String CONTEXT_PATH = "/foo/bar";
- private ContextHandler context;
+ private HttpContext context;
private IMocksControl control;
public void setUp() throws Exception {
control = EasyMock.createNiceControl();
- context = control.createMock(ContextHandler.class);
+ context = control.createMock(HttpContext.class);
context.getContextPath();
EasyMock.expectLastCall().andReturn(CONTEXT_PATH);
control.replay();
Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyHTTPDestinationTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyHTTPDestinationTest.java?view=diff&rev=518860&r1=518859&r2=518860
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyHTTPDestinationTest.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/JettyHTTPDestinationTest.java Thu Mar 15 21:27:21 2007
@@ -21,16 +21,15 @@
import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletOutputStream;
-
import junit.framework.TestCase;
import org.apache.cxf.Bus;
@@ -38,25 +37,23 @@
import org.apache.cxf.common.util.Base64Utility;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
-import org.apache.cxf.configuration.security.SSLServerPolicy;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.io.AbstractCachedOutputStream;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.security.transport.TLSSessionInfo;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.transport.Conduit;
import org.apache.cxf.transport.ConduitInitiator;
import org.apache.cxf.transport.MessageObserver;
+import org.apache.cxf.transports.http.QueryHandler;
+import org.apache.cxf.transports.http.QueryHandlerRegistry;
import org.apache.cxf.transports.http.configuration.HTTPServerPolicy;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.wsdl.EndpointReferenceUtils;
import org.easymock.classextension.EasyMock;
-import org.mortbay.jetty.HttpFields;
-import org.mortbay.jetty.Request;
-import org.mortbay.jetty.Response;
-import org.mortbay.jetty.handler.AbstractHandler;
+import org.easymock.classextension.IMocksControl;
+import org.mortbay.http.handler.AbstractHttpHandler;
public class JettyHTTPDestinationTest extends TestCase {
protected static final String AUTH_HEADER = "Authorization";
@@ -80,21 +77,26 @@
private ServerEngine engine;
private HTTPServerPolicy policy;
private JettyHTTPDestination destination;
- private Request request;
- private Response response;
+ private TestHttpRequest request;
+ private TestHttpResponse response;
private Message inMessage;
private Message outMessage;
private MessageObserver observer;
- private ServletInputStream is;
- private ServletOutputStream os;
-
+ private InputStream is;
+ private OutputStream os;
+ private IMocksControl control;
+ private WSDLQueryHandler wsdlQueryHandler;
+ private QueryHandlerRegistry queryHandlerRegistry;
+ private List<QueryHandler> queryHandlerList;
public void setUp() throws Exception {
- //control = EasyMock.createNiceControl();
+ control = EasyMock.createNiceControl();
}
public void tearDown() {
+ //control.verify();
+ control = null;
bus = null;
conduitInitiator = null;
decoupledBackChannel = null;
@@ -124,25 +126,35 @@
}
public void testDoServiceRedirectURL() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
setUpDoService(true);
- destination.doService(request, response);
+ destination.doService(request, response);
+
+ assertEquals("unexpected sendRedirect calls",
+ 1,
+ response.getSendRedirectCallCount());
+ assertEquals("unexpected commit calls",
+ 1,
+ response.getCommitCallCount());
+ assertEquals("unexpected setHandled calls",
+ 1,
+ request.getHandledCallCount());
}
public void testDoService() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
setUpDoService(false);
destination.doService(request, response);
verifyDoService();
}
public void testDoServiceWithHttpGET() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
setUpDoService(false,
false,
false,
"GET",
- "?customerId=abc&cutomerAdd=def", 200);
+ "?customerId=abc&cutomerAdd=def");
destination.doService(request, response);
assertNotNull("unexpected null message", inMessage);
@@ -151,15 +163,29 @@
"GET");
assertEquals("unexpected path",
inMessage.get(Message.PATH_INFO),
- "/bar/foo");
+ "bar/foo");
assertEquals("unexpected query",
inMessage.get(Message.QUERY_STRING),
"?customerId=abc&cutomerAdd=def");
}
+
+ public void testDoServiceWithHttpGETandQueryWSDL() throws Exception {
+ destination = setUpDestination(false, true);
+ setUpDoService(false,
+ false,
+ false,
+ "GET",
+ "?wsdl");
+
+ destination.doService(request, response);
+ assertNotNull("unexpected null response", response);
+ assertEquals("text/xml", response.getContentType());
+
+ }
public void testGetAnonBackChannel() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
setUpDoService(false);
destination.doService(request, response);
setUpInMessage();
@@ -174,7 +200,7 @@
}
public void testGetBackChannelSend() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
setUpDoService(false, true);
destination.doService(request, response);
setUpInMessage();
@@ -186,8 +212,8 @@
}
public void testGetBackChannelSendFault() throws Exception {
- destination = setUpDestination(false);
- setUpDoService(false, true, 500);
+ destination = setUpDestination(false, false);
+ setUpDoService(false, true);
destination.doService(request, response);
setUpInMessage();
Conduit backChannel =
@@ -198,8 +224,8 @@
}
public void testGetBackChannelSendOneway() throws Exception {
- destination = setUpDestination(false);
- setUpDoService(false, true, 500);
+ destination = setUpDestination(false, false);
+ setUpDoService(false, true);
destination.doService(request, response);
setUpInMessage();
Conduit backChannel =
@@ -210,9 +236,9 @@
}
public void testGetBackChannelSendDecoupled() throws Exception {
- destination = setUpDestination(false);
+ destination = setUpDestination(false, false);
replyTo = getEPR(NOWHERE + "response/foo");
- setUpDoService(false, true, true, 202);
+ setUpDoService(false, true, true);
destination.doService(request, response);
setUpInMessage();
@@ -236,56 +262,56 @@
public void testServerPolicyInServiceModel()
throws Exception {
- policy = new HTTPServerPolicy();
address = getEPR("bar/foo");
bus = new CXFBusImpl();
- conduitInitiator = EasyMock.createMock(ConduitInitiator.class);
+ conduitInitiator = control.createMock(ConduitInitiator.class);
+ engine = control.createMock(ServerEngine.class);
endpointInfo = new EndpointInfo();
endpointInfo.setAddress(NOWHERE + "bar/foo");
- endpointInfo.addExtensor(policy);
- endpointInfo.addExtensor(new SSLServerPolicy());
-
- engine = EasyMock.createMock(ServerEngine.class);
- EasyMock.replay();
+
+ HTTPServerPolicy customPolicy = new HTTPServerPolicy();
+ endpointInfo.addExtensor(customPolicy);
- AbstractHTTPDestination dest = new JettyHTTPDestination(bus,
+ control.replay();
+
+ JettyHTTPDestination dest = new JettyHTTPDestination(bus,
conduitInitiator,
endpointInfo,
engine);
- assertEquals(policy, dest.getServer());
+ assertEquals(customPolicy, dest.getServer());
}
-
+
private JettyHTTPDestination setUpDestination()
throws Exception {
- return setUpDestination(false);
+ return setUpDestination(false, false);
};
- private JettyHTTPDestination setUpDestination(boolean contextMatchOnStem)
- throws Exception {
-
- policy = new HTTPServerPolicy();
+ private JettyHTTPDestination setUpDestination(boolean contextMatchOnStem, boolean mockedBus)
+ throws Exception {
address = getEPR("bar/foo");
- bus = new CXFBusImpl();
- conduitInitiator = EasyMock.createMock(ConduitInitiator.class);
+ if (!mockedBus) {
+ bus = new CXFBusImpl();
+ } else {
+ bus = control.createMock(Bus.class);
+ }
- engine = EasyMock.createMock(ServerEngine.class);
+ conduitInitiator = control.createMock(ConduitInitiator.class);
+ engine = control.createMock(ServerEngine.class);
endpointInfo = new EndpointInfo();
endpointInfo.setAddress(NOWHERE + "bar/foo");
- endpointInfo.addExtensor(policy);
- endpointInfo.getExtensor(SSLServerPolicy.class);
- endpointInfo.addExtensor(new SSLServerPolicy());
-
+
engine.addServant(EasyMock.eq(new URL(NOWHERE + "bar/foo")),
- EasyMock.isA(AbstractHandler.class));
- EasyMock.expectLastCall();
- EasyMock.replay(engine);
+ EasyMock.isA(AbstractHttpHandler.class));
+
+ control.replay();
JettyHTTPDestination dest = new JettyHTTPDestination(bus,
conduitInitiator,
endpointInfo,
engine);
- dest.retrieveEngine();
+ dest.retrieveEngine();
+ policy = dest.getServer();
observer = new MessageObserver() {
public void onMessage(Message m) {
inMessage = m;
@@ -296,10 +322,11 @@
}
private void setUpRemoveServant() throws Exception {
- EasyMock.reset(engine);
+ control.verify();
+ control.reset();
engine.removeServant(EasyMock.eq(new URL(NOWHERE + "bar/foo")));
EasyMock.expectLastCall();
- EasyMock.replay(engine);
+ control.replay();
}
private void setUpDoService(boolean setRedirectURL) throws Exception {
@@ -311,97 +338,67 @@
setUpDoService(setRedirectURL,
sendResponse,
false);
- }
-
- private void setUpDoService(boolean setRedirectURL,
- boolean sendResponse, int status) throws Exception {
- String method = "POST";
- String query = "?name";
- setUpDoService(setRedirectURL, sendResponse, false, method, query, status);
- }
-
- private void setUpDoService(boolean setRedirectURL,
- boolean sendResponse, boolean decoupled, int status) throws Exception {
- String method = "POST";
- String query = "?name";
- setUpDoService(setRedirectURL, sendResponse, decoupled, method, query, status);
- }
+ }
private void setUpDoService(boolean setRedirectURL,
boolean sendResponse,
boolean decoupled) throws Exception {
String method = "POST";
String query = "?name";
- setUpDoService(setRedirectURL, sendResponse, decoupled, method, query, 200);
+ setUpDoService(setRedirectURL, sendResponse, decoupled, method, query);
}
-
+
private void setUpDoService(boolean setRedirectURL,
boolean sendResponse,
boolean decoupled,
String method,
- String query,
- int status) throws Exception {
- is = EasyMock.createMock(ServletInputStream.class);
- os = EasyMock.createMock(ServletOutputStream.class);
- request = EasyMock.createMock(Request.class);
- response = EasyMock.createMock(Response.class);
-
- request.getMethod();
- EasyMock.expectLastCall().andReturn(method);
+ String query) throws Exception {
+
+ control.verify();
+ control.reset();
+
+ is = EasyMock.createMock(InputStream.class);
+ os = EasyMock.createMock(OutputStream.class);
- if ("GET".equals(method)) {
- request.getQueryString();
- EasyMock.expectLastCall().andReturn(query);
- }
+ // EasyMock does not seem able to properly mock calls to HttpRequest
+ // or HttpResponse - expectations set seem to be ignored.
+ // Hence we use hand-crafted sub-classes instead of mocks.
+ //
+ //request = EasyMock.createMock(HttpRequest.class);
+ //response = EasyMock.createMock(HttpResponse.class);
+ request = new TestHttpRequest(method, is, "bar/foo", query);
+ response = new TestHttpResponse(os);
if (setRedirectURL) {
policy.setRedirectURL(NOWHERE + "foo/bar");
- response.sendRedirect(EasyMock.eq(NOWHERE + "foo/bar"));
- EasyMock.expectLastCall();
- response.flushBuffer();
- EasyMock.expectLastCall();
- request.setHandled(true);
- EasyMock.expectLastCall();
- } else { // method is POST
- EasyMock.expect(request.getMethod()).andReturn(method);
- EasyMock.expect(request.getInputStream()).andReturn(is);
- EasyMock.expect(request.getContextPath()).andReturn("/bar");
- EasyMock.expect(request.getPathInfo()).andReturn("/foo");
- EasyMock.expect(request.getQueryString()).andReturn(query);
- EasyMock.expect(request.getContentType()).andReturn("text/xml charset=utf8");
-
- HttpFields httpFields = new HttpFields();
- httpFields.add("content-type", "text/xml");
- httpFields.add("content-type", "charset=utf8");
- httpFields.put(JettyHTTPDestinationTest.AUTH_HEADER, JettyHTTPDestinationTest.BASIC_AUTH);
-
- EasyMock.expect(request.getHeaderNames()).andReturn(httpFields.getFieldNames());
- request.getHeaders("content-type");
- EasyMock.expectLastCall().andReturn(httpFields.getValues("content-type"));
- request.getHeaders(JettyHTTPDestinationTest.AUTH_HEADER);
- EasyMock.expectLastCall().andReturn(httpFields.getValues(JettyHTTPDestinationTest.AUTH_HEADER));
-
- EasyMock.expect(request.getInputStream()).andReturn(is);
- request.setHandled(true);
- EasyMock.expectLastCall();
- response.flushBuffer();
- EasyMock.expectLastCall();
- if (sendResponse) {
- response.setStatus(status);
- EasyMock.expectLastCall();
- response.setContentType("text/xml charset=utf8");
- EasyMock.expectLastCall();
- response.addHeader(EasyMock.isA(String.class), EasyMock.isA(String.class));
- EasyMock.expectLastCall().anyTimes();
- response.getOutputStream();
- EasyMock.expectLastCall().andReturn(os);
- response.getStatus();
- EasyMock.expectLastCall().andReturn(status).anyTimes();
- response.flushBuffer();
- EasyMock.expectLastCall();
+ //response.sendRedirect(EasyMock.eq(NOWHERE + "foo/bar"));
+ //EasyMock.expectLastCall();
+ //response.commit();
+ //EasyMock.expectLastCall();
+ //request.setHandled(true);
+ //EasyMock.expectLastCall();
+ } else {
+ //request.getMethod();
+ //EasyMock.expectLastCall().andReturn("POST").times(2);
+ //request.getInputStream();
+ //EasyMock.expectLastCall().andReturn(is);
+ //request.getPath();
+ //EasyMock.expectLastCall().andReturn("bar/foo");
+ //request.getQuery();
+ //EasyMock.expectLastCall().andReturn(QUERY);
+ //request.setHandled(true);
+ //EasyMock.expectLastCall();
+ //response.commit();
+ //EasyMock.expectLastCall();
+ //if (sendResponse) {
+ // response.getOutputStream();
+ // EasyMock.expectLastCall().andReturn(os);
+ // response.commit();
+ // EasyMock.expectLastCall();
+ //}
+ if ("GET".equals(method) && "?wsdl".equals(query)) {
+ verifyGetWSDLQuery();
}
- request.getAttribute("javax.net.ssl.session");
- EasyMock.expectLastCall().andReturn(null);
}
if (decoupled) {
@@ -409,15 +406,11 @@
conduitInitiator.getConduit(EasyMock.isA(EndpointInfo.class),
EasyMock.eq(replyTo));
EasyMock.expectLastCall().andReturn(decoupledBackChannel);
- decoupledBackChannel.setMessageObserver(EasyMock.isA(MessageObserver.class));
- EasyMock.expectLastCall();
- decoupledBackChannel.send(EasyMock.isA(Message.class));
+ decoupledBackChannel.send(EasyMock.eq(outMessage));
EasyMock.expectLastCall();
- EasyMock.replay(conduitInitiator);
- EasyMock.replay(decoupledBackChannel);
}
- EasyMock.replay(response);
- EasyMock.replay(request);
+
+ control.replay();
}
private void setUpInMessage() {
@@ -443,6 +436,23 @@
challenges.add(CUSTOM_CHALLENGE);
responseHeaders.put(CHALLENGE_HEADER, challenges);
}
+
+ private void verifyGetWSDLQuery() throws Exception {
+ wsdlQueryHandler = control.createMock(WSDLQueryHandler.class);
+ queryHandlerRegistry = control.createMock(QueryHandlerRegistry.class);
+ queryHandlerList = new ArrayList<QueryHandler>();
+ queryHandlerList.add(wsdlQueryHandler);
+ bus.getExtension(QueryHandlerRegistry.class);
+ EasyMock.expectLastCall().andReturn(queryHandlerRegistry);
+ queryHandlerRegistry.getHandlers();
+ EasyMock.expectLastCall().andReturn(queryHandlerList);
+ wsdlQueryHandler.isRecognizedQuery("http://localhost/bar/foo?wsdl", endpointInfo);
+ EasyMock.expectLastCall().andReturn(true);
+ wsdlQueryHandler.getResponseContentType("http://localhost/bar/foo?wsdl");
+ EasyMock.expectLastCall().andReturn("text/xml");
+ wsdlQueryHandler.writeResponse("http://localhost/bar/foo?wsdl", endpointInfo, os);
+ EasyMock.expectLastCall().once();
+ }
private void verifyDoService() throws Exception {
assertNotNull("unexpected null message", inMessage);
@@ -457,22 +467,38 @@
"POST");
assertEquals("unexpected path",
inMessage.get(Message.PATH_INFO),
- "/bar/foo");
+ "bar/foo");
assertEquals("unexpected query",
inMessage.get(Message.QUERY_STRING),
"?name");
- assertNull("unexpected query",
- inMessage.get(TLSSessionInfo.class));
- verifyRequestHeaders();
+ verifyRequestHeaders();
-
+
+ assertEquals("unexpected getMethod calls",
+ 1,
+ request.getMethodCallCount());
+ assertEquals("unexpected getInputStream calls",
+ 1,
+ request.getInputStreamCallCount());
+ assertEquals("unexpected getPath calls",
+ 1,
+ request.getPathCallCount());
+ assertEquals("unexpected getQuery calls",
+ 1,
+ request.getQueryCallCount());
+ assertEquals("unexpected setHandled calls",
+ 1,
+ request.getHandledCallCount());
}
private void verifyRequestHeaders() throws Exception {
Map<String, List<String>> requestHeaders =
CastUtils.cast((Map<?, ?>)inMessage.get(Message.PROTOCOL_HEADERS));
assertNotNull("expected request headers",
- requestHeaders);
+ requestHeaders);
+ assertEquals("expected getFieldNames",
+ 1,
+ request.getFieldNamesCallCount());
List<String> values = requestHeaders.get("content-type");
assertNotNull("expected field", values);
assertEquals("unexpected values", 2, values.size());
@@ -499,10 +525,10 @@
CastUtils.cast((Map<?, ?>)outMsg.get(Message.PROTOCOL_HEADERS));
assertNotNull("expected response headers",
responseHeaders);
- /*assertEquals("expected addField",
+ assertEquals("expected addField",
3,
response.getAddFieldCallCount());
- Enumeration e = response.getHeaders(CHALLENGE_HEADER);
+ Enumeration e = response.getFieldValues(CHALLENGE_HEADER);
List<String> challenges = new ArrayList<String>();
while (e.hasMoreElements()) {
challenges.add((String)e.nextElement());
@@ -512,7 +538,7 @@
assertTrue("expected challenge",
challenges.contains(DIGEST_CHALLENGE));
assertTrue("expected challenge",
- challenges.contains(CUSTOM_CHALLENGE));*/
+ challenges.contains(CUSTOM_CHALLENGE));
}
private void verifyBackChannelSend(Conduit backChannel,
@@ -532,7 +558,10 @@
OutputStream responseOS = outMsg.getContent(OutputStream.class);
assertNotNull("expected output stream", responseOS);
assertTrue("unexpected output stream type",
- responseOS instanceof AbstractCachedOutputStream);
+ responseOS instanceof AbstractCachedOutputStream);
+ assertEquals("expected commit",
+ 1,
+ response.getCommitCallCount());
outMsg.put(Message.RESPONSE_CODE, status);
responseOS.write(PAYLOAD.getBytes());
@@ -542,28 +571,44 @@
OutputStream underlyingOS =
((AbstractCachedOutputStream)responseOS).getOut();
assertTrue("unexpected underlying output stream type",
- underlyingOS instanceof ByteArrayOutputStream);
+ underlyingOS instanceof ByteArrayOutputStream);
+ assertEquals("expected getOutputStream",
+ 0,
+ response.getOutputStreamCallCount());
outMsg.getExchange().setOneWay(oneway);
responseOS.flush();
-
+ assertEquals("expected setStatus",
+ 1,
+ response.getStatusCallCount());
assertEquals("unexpected status",
status,
response.getStatus());
-
+ if (status == 500) {
+ assertEquals("unexpected status message",
+ "Internal Server Error",
+ response.getReason());
+ }
verifyResponseHeaders(outMsg);
-
+ assertEquals("expected getOutputStream",
+ 1,
+ response.getOutputStreamCallCount());
underlyingOS = ((AbstractCachedOutputStream)responseOS).getOut();
assertFalse("unexpected underlying output stream type: "
+ underlyingOS.getClass(),
underlyingOS instanceof ByteArrayOutputStream);
-
+ assertEquals("expected commit",
+ oneway ? 2 : 1,
+ response.getCommitCallCount());
if (oneway) {
assertNull("unexpected HTTP response",
outMsg.get(JettyHTTPDestination.HTTP_RESPONSE));
} else {
assertNotNull("expected HTTP response",
outMsg.get(JettyHTTPDestination.HTTP_RESPONSE));
- responseOS.close();
+ responseOS.close();
+ assertEquals("expected commit",
+ 2,
+ response.getCommitCallCount());
}
}
Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/https/HttpsURLConnectionFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/https/HttpsURLConnectionFactoryTest.java?view=diff&rev=518860&r1=518859&r2=518860
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/https/HttpsURLConnectionFactoryTest.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/https/HttpsURLConnectionFactoryTest.java Thu Mar 15 21:27:21 2007
@@ -27,6 +27,8 @@
import junit.framework.TestCase;
+import org.apache.cxf.configuration.security.FiltersType;
+import org.apache.cxf.configuration.security.ObjectFactory;
import org.apache.cxf.configuration.security.SSLClientPolicy;
@@ -35,6 +37,11 @@
protected static final String DROP_BACK_SRC_DIR =
"../../../../../../../"
+ "src/test/java/org/apache/cxf/transport/https/";
+
+ private static final String[] EXPORT_CIPHERS =
+ {"SSL_RSA_WITH_NULL_MD5", "SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_WITH_DES_CBC_SHA"};
+ private static final String[] NON_EXPORT_CIPHERS =
+ {"SSL_RSA_WITH_RC4_128_MD5", "SSL_RSA_WITH_3DES_EDE_CBC_SHA"};
private TestHttpsURLConnection connection;
@@ -124,7 +131,7 @@
*/
public void testSetAllData() throws Exception {
-
+
String keyStoreStr = getPath("resources/defaultkeystore");
SSLClientPolicy sslClientPolicy = new SSLClientPolicy();
sslClientPolicy.setKeystore(keyStoreStr);
@@ -141,7 +148,13 @@
sslClientPolicy.setCertValidator("Anything");
sslClientPolicy.setProxyHost("Anything");
sslClientPolicy.setProxyPort(new Long(1234));
-
+ for (int i = 0; i < EXPORT_CIPHERS.length; i++) {
+ sslClientPolicy.getCiphersuites().add(EXPORT_CIPHERS[i]);
+ }
+ for (int i = 0; i < NON_EXPORT_CIPHERS.length; i++) {
+ sslClientPolicy.getCiphersuites().add(NON_EXPORT_CIPHERS[i]);
+ }
+
String trustStoreStr = getPath("resources/defaulttruststore");
sslClientPolicy.setTrustStore(trustStoreStr);
TestLogHandler handler = new TestLogHandler();
@@ -182,8 +195,16 @@
+ "algorithm has not been set in configuration "
+ "so the default value PKIX will be used."));
- assertTrue("Ciphersuites is being being read from somewhere unknown", handler
- .checkLogContainsString("The cipher suite has not been set, default values " + "will be used."));
+ assertFalse("Ciphersuites config not picked up", handler
+ .checkLogContainsString("The cipher suites have not been configured, "
+ + "default values will be used."));
+ assertFalse("Unexpected included ciphersuite filter",
+ handler.checkLogContainsString("suite is included by the filter."));
+ assertFalse("Unexpected excluded ciphersuite fuilter",
+ handler.checkLogContainsString("suite is excluded by the filter."));
+ assertFalse("Unexpected ciphersuite filtering",
+ handler.checkLogContainsString("The enabled cipher suites have been filtered down to"));
+
assertTrue("Truststore type not being read", handler
.checkLogContainsString("The key store type has been set in " + "configuration to JKS"));
@@ -197,6 +218,100 @@
.checkLogContainsString("Unsupported SSLClientPolicy property : MaxChainLength"));
assertTrue("CertValidator caching set but no warning about not supported", handler
.checkLogContainsString("Unsupported SSLClientPolicy property : CertValidator"));
+ }
+
+ public void testDefaultedCipherSuiteFilters() throws Exception {
+
+ String keyStoreStr = getPath("resources/defaultkeystore");
+ SSLClientPolicy sslClientPolicy = new SSLClientPolicy();
+ sslClientPolicy.setKeystore(keyStoreStr);
+ sslClientPolicy.setKeystoreType("JKS");
+
+ sslClientPolicy.setKeyPassword("defaultkeypass");
+ sslClientPolicy.setKeystorePassword("defaultkeypass");
+ sslClientPolicy.setTrustStoreType("JKS");
+ sslClientPolicy.setSecureSocketProtocol("TLSv1");
+
+ String trustStoreStr = getPath("resources/defaulttruststore");
+ sslClientPolicy.setTrustStore(trustStoreStr);
+ TestLogHandler handler = new TestLogHandler();
+ HttpsURLConnectionFactory factory = createFactory(sslClientPolicy,
+ "https://dummyurl",
+ handler);
+
+ factory.decorate(connection);
+
+ assertTrue("Ciphersuites is being being read from somewhere unknown",
+ handler.checkLogContainsString("The cipher suites have not been configured,"
+ + " falling back to cipher suite filters."));
+ assertTrue("Expected defaulted ciphersuite filters",
+ handler.checkLogContainsString("The cipher suite filters have not been configured,"
+ + " falling back to default filters."));
+ for (int i = 0; i < EXPORT_CIPHERS.length; i++) {
+ assertTrue("Expected included ciphersuite not included: " + EXPORT_CIPHERS[i],
+ handler.checkLogContainsString(EXPORT_CIPHERS[i]
+ + " cipher suite is included by the filter."));
+ }
+ for (int i = 0; i < NON_EXPORT_CIPHERS.length; i++) {
+ assertTrue("Expected excluded ciphersuite not included: " + NON_EXPORT_CIPHERS[i],
+ handler.checkLogContainsString(NON_EXPORT_CIPHERS[i]
+ + " cipher suite is excluded by the filter."));
+ }
+ assertTrue("Expected excluded ciphersuite not included",
+ handler.checkLogContainsString("The enabled cipher suites have been filtered down to"));
+
+ }
+
+ public void testNonDefaultedCipherSuiteFilters() throws Exception {
+
+ String keyStoreStr = getPath("resources/defaultkeystore");
+ SSLClientPolicy sslClientPolicy = new SSLClientPolicy();
+ sslClientPolicy.setKeystore(keyStoreStr);
+ sslClientPolicy.setKeystoreType("JKS");
+
+ sslClientPolicy.setKeyPassword("defaultkeypass");
+ sslClientPolicy.setKeystorePassword("defaultkeypass");
+ sslClientPolicy.setTrustStoreType("JKS");
+ sslClientPolicy.setSecureSocketProtocol("TLSv1");
+
+ // reverse default sense of include/exlcude
+ FiltersType filters = new ObjectFactory().createFiltersType();
+ for (int i = 0; i < NON_EXPORT_CIPHERS.length; i++) {
+ filters.getInclude().add(NON_EXPORT_CIPHERS[i]);
+ }
+ for (int i = 0; i < EXPORT_CIPHERS.length; i++) {
+ filters.getExclude().add(EXPORT_CIPHERS[i]);
+ }
+ sslClientPolicy.setCiphersuiteFilters(filters);
+
+ String trustStoreStr = getPath("resources/defaulttruststore");
+ sslClientPolicy.setTrustStore(trustStoreStr);
+ TestLogHandler handler = new TestLogHandler();
+ HttpsURLConnectionFactory factory = createFactory(sslClientPolicy,
+ "https://dummyurl",
+ handler);
+
+ factory.decorate(connection);
+
+ assertTrue("Ciphersuites is being being read from somewhere unknown",
+ handler.checkLogContainsString("The cipher suites have not been configured,"
+ + " falling back to cipher suite filters."));
+ assertFalse("Unexpected defaulted ciphersuite filters",
+ handler.checkLogContainsString("The cipher suite filters have not been configured,"
+ + " falling back to default filters."));
+ for (int i = 0; i < NON_EXPORT_CIPHERS.length; i++) {
+ assertTrue("Expected included ciphersuite not included: " + NON_EXPORT_CIPHERS[i],
+ handler.checkLogContainsString(NON_EXPORT_CIPHERS[i]
+ + " cipher suite is included by the filter."));
+ }
+ for (int i = 0; i < EXPORT_CIPHERS.length; i++) {
+ assertTrue("Expected excluded ciphersuite not included: " + EXPORT_CIPHERS[i],
+ handler.checkLogContainsString(EXPORT_CIPHERS[i]
+ + " cipher suite is excluded by the filter."));
+ }
+ assertTrue("Expected excluded ciphersuite not included",
+ handler.checkLogContainsString("The enabled cipher suites have been filtered down to"));
+
}
public void testAllValidDataJKS() throws Exception {