You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2009/06/01 20:36:12 UTC
svn commit: r780772 - in
/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src:
main/java/org/apache/ws/commons/tcpmon/core/engine/
main/java/org/apache/ws/commons/tcpmon/core/filter/
main/java/org/apache/ws/commons/tcpmon/core/filter/http/...
Author: veithen
Date: Mon Jun 1 18:36:11 2009
New Revision: 780772
URL: http://svn.apache.org/viewvc?rev=780772&view=rev
Log:
We can now do on-the-fly request and response rewriting.
Added:
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java (with props)
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java (with props)
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java (with props)
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java (with props)
Modified:
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Connection.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfiguration.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfigurationBuilder.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/SocketRR.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTestBase.java
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Connection.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Connection.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Connection.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Connection.java Mon Jun 1 18:36:11 2009
@@ -24,6 +24,7 @@
import org.apache.ws.commons.tcpmon.core.filter.http.HttpProxyServerHandler;
import org.apache.ws.commons.tcpmon.core.filter.http.HttpRequestFilter;
import org.apache.ws.commons.tcpmon.core.filter.http.HttpResponseFilter;
+import org.apache.ws.commons.tcpmon.core.filter.mime.ContentFilterFactory;
import java.io.IOException;
import java.io.InputStream;
@@ -139,6 +140,10 @@
requestFilter.addHandler(new HttpProxyClientHandler(targetHost, targetPort));
outSocket = socketFactory.createSocket(HTTPProxyHost, HTTPProxyPort);
}
+ ContentFilterFactory requestContentFilterFactory = config.getRequestContentFilterFactory();
+ if (requestContentFilterFactory != null) {
+ requestFilter.setContentFilterFactory(requestContentFilterFactory);
+ }
config.applyRequestFilters(requestPipeline);
requestPipeline.addFilter(requestTee);
@@ -154,6 +159,10 @@
Pipeline responsePipeline = new Pipeline();
HttpResponseFilter responseFilter = new HttpResponseFilter(false);
+ ContentFilterFactory responseContentFilterFactory = config.getResponseContentFilterFactory();
+ if (responseContentFilterFactory != null) {
+ responseFilter.setContentFilterFactory(responseContentFilterFactory);
+ }
responsePipeline.addFilter(responseFilter);
config.applyResponseFilters(responsePipeline);
if (tmpOut1 != null) {
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfiguration.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfiguration.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfiguration.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfiguration.java Mon Jun 1 18:36:11 2009
@@ -21,6 +21,7 @@
import org.apache.ws.commons.tcpmon.core.filter.Pipeline;
import org.apache.ws.commons.tcpmon.core.filter.StreamFilterFactory;
+import org.apache.ws.commons.tcpmon.core.filter.mime.ContentFilterFactory;
/**
* Holds the configuration for an {@link Interceptor} instance.
@@ -38,11 +39,14 @@
private final int httpProxyPort;
final StreamFilterFactory[] requestFilters;
final StreamFilterFactory[] responseFilters;
+ private final ContentFilterFactory requestContentFilterFactory;
+ private final ContentFilterFactory responseContentFilterFactory;
InterceptorConfiguration(ServerSocketFactory serverSocketFactory, int listenPort,
SocketFactory socketFactory, String targetHost, int targetPort, boolean proxy,
String httpProxyHost, int httpProxyPort, StreamFilterFactory[] requestFilters,
- StreamFilterFactory[] responseFilters) {
+ StreamFilterFactory[] responseFilters, ContentFilterFactory
+ requestContentFilterFactory, ContentFilterFactory responseContentFilterFactory) {
this.serverSocketFactory = serverSocketFactory;
this.listenPort = listenPort;
this.socketFactory = socketFactory;
@@ -53,6 +57,8 @@
this.httpProxyPort = httpProxyPort;
this.requestFilters = requestFilters;
this.responseFilters = responseFilters;
+ this.requestContentFilterFactory = requestContentFilterFactory;
+ this.responseContentFilterFactory = responseContentFilterFactory;
}
public ServerSocketFactory getServerSocketFactory() {
@@ -100,4 +106,12 @@
public void applyResponseFilters(Pipeline pipeline) {
applyFilters(pipeline, responseFilters);
}
+
+ public ContentFilterFactory getRequestContentFilterFactory() {
+ return requestContentFilterFactory;
+ }
+
+ public ContentFilterFactory getResponseContentFilterFactory() {
+ return responseContentFilterFactory;
+ }
}
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfigurationBuilder.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfigurationBuilder.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorConfigurationBuilder.java Mon Jun 1 18:36:11 2009
@@ -27,6 +27,7 @@
import javax.net.ssl.TrustManager;
import org.apache.ws.commons.tcpmon.core.filter.StreamFilterFactory;
+import org.apache.ws.commons.tcpmon.core.filter.mime.ContentFilterFactory;
/**
* Creates {@link InterceptorConfiguration} instances.
@@ -42,6 +43,8 @@
private int httpProxyPort;
private final List/*<StreamFilterFactory>*/ requestFilters = new ArrayList();
private final List/*<StreamFilterFactory>*/ responseFilters = new ArrayList();
+ private ContentFilterFactory requestContentFilterFactory;
+ private ContentFilterFactory responseContentFilterFactory;
public InterceptorConfigurationBuilder() {
}
@@ -57,6 +60,8 @@
httpProxyPort = config.getHttpProxyPort();
requestFilters.addAll(Arrays.asList(config.requestFilters));
responseFilters.addAll(Arrays.asList(config.responseFilters));
+ requestContentFilterFactory = config.getRequestContentFilterFactory();
+ responseContentFilterFactory = config.getResponseContentFilterFactory();
}
public void setServerSocketFactory(ServerSocketFactory serverSocketFactory) {
@@ -126,6 +131,14 @@
responseFilters.add(filter);
}
+ public void setRequestContentFilterFactory(ContentFilterFactory requestContentFilterFactory) {
+ this.requestContentFilterFactory = requestContentFilterFactory;
+ }
+
+ public void setResponseContentFilterFactory(ContentFilterFactory responseContentFilterFactory) {
+ this.responseContentFilterFactory = responseContentFilterFactory;
+ }
+
public InterceptorConfiguration build() {
if (serverSocketFactory == null) {
serverSocketFactory = ServerSocketFactory.getDefault();
@@ -140,6 +153,7 @@
return new InterceptorConfiguration(serverSocketFactory, listenPort, socketFactory,
targetHost, targetPort, proxy, httpProxyHost, httpProxyPort,
(StreamFilterFactory[])requestFilters.toArray(new StreamFilterFactory[requestFilters.size()]),
- (StreamFilterFactory[])responseFilters.toArray(new StreamFilterFactory[responseFilters.size()]));
+ (StreamFilterFactory[])responseFilters.toArray(new StreamFilterFactory[responseFilters.size()]),
+ requestContentFilterFactory, responseContentFilterFactory);
}
}
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/SocketRR.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/SocketRR.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/SocketRR.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/SocketRR.java Mon Jun 1 18:36:11 2009
@@ -124,6 +124,7 @@
// This is a very naive way to support keep-alive: just close the connection after
// the request or response
if (httpFilter.isComplete()) {
+ pipeline.close();
c = -1;
}
elapsed = System.currentTimeMillis() - start;
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java Mon Jun 1 18:36:11 2009
@@ -383,6 +383,10 @@
return read;
}
+ public void close() {
+ first.invoke(allocateBuffer(), 0, 0, true, false);
+ }
+
public OutputStream getOutputStream() {
return new OutputStreamImpl();
}
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java?rev=780772&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java Mon Jun 1 18:36:11 2009
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.ws.commons.tcpmon.core.filter.http;
+
+import org.apache.ws.commons.tcpmon.core.filter.Stream;
+import org.apache.ws.commons.tcpmon.core.filter.StreamFilter;
+import org.apache.ws.commons.tcpmon.core.filter.StreamUtil;
+
+public class ChunkedEncoder implements StreamFilter {
+ public void invoke(Stream stream) {
+ int av = stream.available();
+ if (av > 0 || stream.isEndOfStream()) {
+ stream.skipAll();
+ StreamUtil.insertAsciiString(stream, "\r\n");
+ StreamUtil.insertAsciiString(stream, Integer.toString(av, 16));
+ StreamUtil.insertAsciiString(stream, "\r\n");
+ }
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/ChunkedEncoder.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java Mon Jun 1 18:36:11 2009
@@ -41,17 +41,12 @@
private int state = STATE_FIRST_LINE;
private final Headers headers = new Headers();
private ContentFilterFactory contentFilterFactory;
- private StreamFilter transferDecoder;
- private StreamFilter[] contentFilterChain;
public HttpFilter(boolean decodeTransferEncoding) {
this.decodeTransferEncoding = decodeTransferEncoding;
}
public void setContentFilterFactory(ContentFilterFactory contentFilterFactory) {
- if (!decodeTransferEncoding) {
- throw new UnsupportedOperationException();
- }
this.contentFilterFactory = contentFilterFactory;
}
@@ -88,27 +83,12 @@
headerParser.discard();
}
if (headerParser.noMoreHeaders()) {
- processHeaders();
- for (Iterator it = headers.iterator(); it.hasNext(); ) {
- Header header = (Header)it.next();
- headerParser.insert(header.getName(), header.getValue());
- }
- headerParser.skip();
+ processHeaders(headerParser, stream);
state = STATE_CONTENT;
- if (transferDecoder != null) {
- stream.pushFilter(decodeTransferEncoding
- ? transferDecoder
- : new ReadOnlyFilterWrapper(transferDecoder));
- }
- if (contentFilterChain != null) {
- for (int i=contentFilterChain.length-1; i>=0; i--) {
- stream.pushFilter(contentFilterChain[i]);
- }
- }
- break;
} else {
return;
}
+ break;
}
default:
stream.skipAll();
@@ -119,16 +99,24 @@
protected abstract String processFirstLine(String firstList);
protected abstract void completed();
- private void processHeaders() {
+ private void processHeaders(HeaderParser headerParser, Stream stream) {
+ boolean discardHeaders = false;
+ StreamFilter transferDecoder = null;
+ StreamFilter transferEncoder = null;
+ StreamFilter[] contentFilterChain = null;
for (Iterator it = headers.iterator(); it.hasNext(); ) {
Header header = (Header)it.next();
String name = header.getName();
String value = header.getValue();
if (name.equalsIgnoreCase("Content-Length")) {
transferDecoder = new IdentityDecoder(Integer.parseInt(value), this);
+ transferEncoder = new IdentityEncoder(headers);
+ discardHeaders = true;
} else if (name.equalsIgnoreCase("Transfer-Encoding")) {
if (value.equals("chunked")) {
transferDecoder = new ChunkedDecoder(this);
+ transferEncoder = new ChunkedEncoder();
+ discardHeaders = false;
}
} else if (name.equalsIgnoreCase("Content-Type")) {
if (contentFilterFactory != null) {
@@ -136,9 +124,34 @@
}
}
}
+
for (Iterator it = handlers.iterator(); it.hasNext(); ) {
((HeaderHandler)it.next()).handleHeaders(headers);
}
+
+ if (discardHeaders && contentFilterChain != null) {
+ headerParser.discard();
+ } else {
+ for (Iterator it = headers.iterator(); it.hasNext(); ) {
+ Header header = (Header)it.next();
+ headerParser.insert(header.getName(), header.getValue());
+ }
+ headerParser.skip();
+ }
+
+ if (contentFilterChain != null) {
+ if (transferEncoder != null && !decodeTransferEncoding) {
+ stream.pushFilter(transferEncoder);
+ }
+ for (int i=contentFilterChain.length-1; i>=0; i--) {
+ stream.pushFilter(contentFilterChain[i]);
+ }
+ }
+ if (transferDecoder != null) {
+ stream.pushFilter(decodeTransferEncoding || contentFilterChain != null
+ ? transferDecoder
+ : new ReadOnlyFilterWrapper(transferDecoder));
+ }
}
public void onComplete() {
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java?rev=780772&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java Mon Jun 1 18:36:11 2009
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.ws.commons.tcpmon.core.filter.http;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.apache.ws.commons.tcpmon.core.filter.HeaderParser;
+import org.apache.ws.commons.tcpmon.core.filter.Stream;
+import org.apache.ws.commons.tcpmon.core.filter.StreamException;
+import org.apache.ws.commons.tcpmon.core.filter.StreamFilter;
+import org.apache.ws.commons.tcpmon.core.filter.StreamUtil;
+
+public class IdentityEncoder implements StreamFilter {
+ private final Headers headers;
+ private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+ public IdentityEncoder(Headers headers) {
+ this.headers = headers;
+ }
+
+ public void invoke(Stream stream) {
+ try {
+ stream.readAll(buffer);
+ } catch (IOException ex) {
+ throw new StreamException(ex);
+ }
+ stream.discard(stream.available()); // TODO: we should have a discardAll method
+ if (stream.isEndOfStream()) {
+ byte[] data = buffer.toByteArray();
+ headers.set("Content-Length", String.valueOf(data.length));
+ HeaderParser p = new HeaderParser(stream);
+ for (Iterator it = headers.iterator(); it.hasNext(); ) {
+ Header header = (Header)it.next();
+ p.insert(header.getName(), header.getValue());
+ }
+ StreamUtil.insertAsciiString(stream, "\r\n");
+ stream.insert(data, 0, data.length);
+ }
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/IdentityEncoder.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java?rev=780772&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java Mon Jun 1 18:36:11 2009
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.ws.commons.tcpmon.core.engine;
+
+import java.io.UnsupportedEncodingException;
+
+import junit.framework.TestCase;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.ws.commons.tcpmon.core.filter.ReplaceFilter;
+import org.apache.ws.commons.tcpmon.core.filter.StreamFilter;
+import org.apache.ws.commons.tcpmon.core.filter.mime.ContentFilterFactory;
+import org.mortbay.jetty.Server;
+
+public class InterceptorTest extends TestCase {
+ public void testWithContentFilter() throws Exception {
+ Server server = TestUtil.createServer(5555);
+ server.start();
+
+ InterceptorConfigurationBuilder configBuilder = new InterceptorConfigurationBuilder();
+ configBuilder.setTargetHost("localhost");
+ configBuilder.setTargetPort(5555);
+ configBuilder.setListenPort(8000);
+ configBuilder.setRequestContentFilterFactory(new ContentFilterFactory() {
+ public StreamFilter[] getContentFilterChain(String contentType) {
+ try {
+ return new StreamFilter[] { new ReplaceFilter("pattern", "replacement", "ascii") };
+ } catch (UnsupportedEncodingException ex) {
+ return null;
+ }
+ }
+ });
+
+ InterceptorConfiguration config = configBuilder.build();
+
+ Interceptor interceptor = new Interceptor(config, new Dump(System.out));
+
+ HttpClient client = TestUtil.createClient(config);
+ HttpPost request = new HttpPost(TestUtil.getBaseUri(config, server) + "/echo");
+ request.setEntity(new StringEntity("test-pattern-test"));
+ HttpResponse response = client.execute(request);
+ assertEquals("test-replacement-test", TestUtil.getResponseAsString(response));
+
+ interceptor.halt();
+
+ server.stop();
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTestBase.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTestBase.java?rev=780772&r1=780771&r2=780772&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTestBase.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/InterceptorTestBase.java Mon Jun 1 18:36:11 2009
@@ -16,22 +16,13 @@
package org.apache.ws.commons.tcpmon.core.engine;
-import java.io.InputStream;
-
import junit.framework.TestCase;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.params.CoreProtocolPNames;
-import org.mortbay.http.HttpContext;
-import org.mortbay.http.SocketListener;
import org.mortbay.jetty.Server;
public abstract class InterceptorTestBase extends TestCase {
@@ -47,12 +38,7 @@
protected void setUp() throws Exception {
// Set up server
- server = new Server();
- SocketListener listener = new SocketListener();
- listener.setPort(SERVER_PORT);
- server.addListener(listener);
- HttpContext context = new HttpContext(server, "/*");
- context.addHandler(new TestHttpHandler());
+ server = TestUtil.createServer(SERVER_PORT);
server.start();
// Set up interceptor
@@ -64,15 +50,8 @@
// Set up client
- client = new DefaultHttpClient();
- if (config.isProxy()) {
- baseUri = "http://localhost:" + SERVER_PORT;
- client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost("localhost", INTERCEPTOR_PORT, "http"));
- } else {
- baseUri = "http://localhost:" + INTERCEPTOR_PORT;
- }
- // We don't handle 100 continue yet
- client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
+ client = TestUtil.createClient(config);
+ baseUri = TestUtil.getBaseUri(config, server);
}
protected void tearDown() throws Exception {
@@ -82,20 +61,11 @@
protected abstract InterceptorConfiguration buildInterceptorConfiguration();
- private static String getResponseAsString(HttpResponse response) throws Exception {
- InputStream in = response.getEntity().getContent();
- try {
- return IOUtils.toString(in, "UTF-8");
- } finally {
- in.close();
- }
- }
-
public void testGet() throws Exception {
HttpGet request = new HttpGet(baseUri + "/test");
HttpResponse response = client.execute(request);
assertEquals(200, response.getStatusLine().getStatusCode());
- assertEquals("test", getResponseAsString(response));
+ assertEquals("test", TestUtil.getResponseAsString(response));
}
public void testPost() throws Exception {
@@ -103,16 +73,16 @@
request.setEntity(new StringEntity("test"));
HttpResponse response = client.execute(request);
assertEquals(200, response.getStatusLine().getStatusCode());
- assertEquals("test", getResponseAsString(response));
+ assertEquals("test", TestUtil.getResponseAsString(response));
}
public void testGetWithKeepAlive() throws Exception {
HttpGet request = new HttpGet(baseUri + "/test");
HttpResponse response = client.execute(request);
assertEquals(200, response.getStatusLine().getStatusCode());
- assertEquals("test", getResponseAsString(response));
+ assertEquals("test", TestUtil.getResponseAsString(response));
response = client.execute(request);
assertEquals(200, response.getStatusLine().getStatusCode());
- assertEquals("test", getResponseAsString(response));
+ assertEquals("test", TestUtil.getResponseAsString(response));
}
}
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java?rev=780772&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java Mon Jun 1 18:36:11 2009
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.ws.commons.tcpmon.core.engine;
+
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.conn.params.ConnRoutePNames;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.CoreProtocolPNames;
+import org.mortbay.http.HttpContext;
+import org.mortbay.http.SocketListener;
+import org.mortbay.jetty.Server;
+
+public class TestUtil {
+ private TestUtil() {}
+
+ public static Server createServer(int port) {
+ Server server = new Server();
+ SocketListener listener = new SocketListener();
+ listener.setPort(port);
+ server.addListener(listener);
+ HttpContext context = new HttpContext(server, "/*");
+ context.addHandler(new TestHttpHandler());
+ return server;
+ }
+
+ public static HttpClient createClient(InterceptorConfiguration config) {
+ HttpClient client = new DefaultHttpClient();
+ if (config.isProxy()) {
+ client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost("localhost", config.getListenPort(), "http"));
+ }
+ // We don't handle 100 continue yet
+ client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
+ return client;
+ }
+
+ public static String getBaseUri(InterceptorConfiguration config, Server server) {
+ int serverPort = server.getListeners()[0].getPort();
+ if (config.isProxy()) {
+ return "http://localhost:" + serverPort;
+ } else {
+ if (config.getTargetPort() != serverPort) {
+ throw new IllegalArgumentException();
+ }
+ return "http://localhost:" + config.getListenPort();
+ }
+ }
+
+ public static String getResponseAsString(HttpResponse response) throws Exception {
+ InputStream in = response.getEntity().getContent();
+ try {
+ return IOUtils.toString(in, "UTF-8");
+ } finally {
+ in.close();
+ }
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/engine/TestUtil.java
------------------------------------------------------------------------------
svn:eol-style = native