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