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/02 00:08:44 UTC
svn commit: r780851 - in /webservices/commons/trunk/modules/tcpmon/modules:
tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/
tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/
tcpmon-core/src/main/java/org/apach...
Author: veithen
Date: Mon Jun 1 22:08:44 2009
New Revision: 780851
URL: http://svn.apache.org/viewvc?rev=780851&view=rev
Log:
Added option to automatically replace URIs in request/response content.
Added:
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/UriReplaceContentFilterFactory.java (with props)
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ChainedContentFilterFactory.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/Dump.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/filter/http/HostRewriter.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-ui/src/main/java/org/apache/ws/commons/tcpmon/swing/AdminPane.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=780851&r1=780850&r2=780851&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 22:08:44 2009
@@ -24,7 +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 org.apache.ws.commons.tcpmon.core.filter.mime.ChainedContentFilterFactory;
import java.io.IOException;
import java.io.InputStream;
@@ -143,10 +143,14 @@
requestFilter.addHandler(new HttpProxyClientHandler(targetHost, targetPort));
outSocket = socketFactory.createSocket(HTTPProxyHost, HTTPProxyPort);
}
- ContentFilterFactory requestContentFilterFactory = config.getRequestContentFilterFactory();
- if (requestContentFilterFactory != null) {
- requestFilter.setContentFilterFactory(requestContentFilterFactory);
+ ChainedContentFilterFactory requestContentFilterFactory = new ChainedContentFilterFactory();
+ if (config.getRequestContentFilterFactory() != null) {
+ requestContentFilterFactory.add(config.getRequestContentFilterFactory());
}
+ if (config.isReplaceURIsInContent()) {
+ requestContentFilterFactory.add(new UriReplaceContentFilterFactory(hostRewriter, UriReplaceContentFilterFactory.REQUEST));
+ }
+ requestFilter.setContentFilterFactory(requestContentFilterFactory);
config.applyRequestFilters(requestPipeline);
requestPipeline.addFilter(requestTee);
@@ -162,18 +166,20 @@
Pipeline responsePipeline = new Pipeline();
HttpResponseFilter responseFilter = new HttpResponseFilter(false);
- ContentFilterFactory responseContentFilterFactory = config.getResponseContentFilterFactory();
- if (responseContentFilterFactory != null) {
- responseFilter.setContentFilterFactory(responseContentFilterFactory);
+ ChainedContentFilterFactory responseContentFilterFactory = new ChainedContentFilterFactory();
+ if (config.getResponseContentFilterFactory() != null) {
+ responseContentFilterFactory.add(config.getResponseContentFilterFactory());
+ }
+ if (config.isReplaceURIsInContent()) {
+ responseContentFilterFactory.add(new UriReplaceContentFilterFactory(hostRewriter, UriReplaceContentFilterFactory.RESPONSE));
}
+ responseFilter.setContentFilterFactory(responseContentFilterFactory);
if (hostRewriter != null) {
responseFilter.addHandler(hostRewriter);
}
responsePipeline.addFilter(responseFilter);
config.applyResponseFilters(responsePipeline);
- if (tmpOut1 != null) {
- responsePipeline.addFilter(new Tee(tmpOut1));
- }
+ responsePipeline.addFilter(new Tee(tmpOut1));
if (requestResponseListener != null) {
OutputStream responseOutputStream = requestResponseListener.getResponseOutputStream();
if (responseOutputStream != null) {
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Dump.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/Dump.java?rev=780851&r1=780850&r2=780851&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Dump.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/Dump.java Mon Jun 1 22:08:44 2009
@@ -19,10 +19,16 @@
import java.io.OutputStream;
public class Dump implements InterceptorListener, RequestResponseListener {
- private final OutputStream out;
+ private final OutputStream requestOut;
+ private final OutputStream responseOut;
+ public Dump(OutputStream requestOut, OutputStream responseOut) {
+ this.requestOut = requestOut;
+ this.responseOut = responseOut;
+ }
+
public Dump(OutputStream out) {
- this.out = out;
+ this(out, out);
}
public RequestResponseListener createRequestResponseListener(String fromHost) {
@@ -36,11 +42,11 @@
}
public OutputStream getRequestOutputStream() {
- return out;
+ return requestOut;
}
public OutputStream getResponseOutputStream() {
- return out;
+ return responseOut;
}
public void onError(Throwable ex) {
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=780851&r1=780850&r2=780851&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 22:08:44 2009
@@ -42,12 +42,14 @@
final StreamFilterFactory[] responseFilters;
private final ContentFilterFactory requestContentFilterFactory;
private final ContentFilterFactory responseContentFilterFactory;
+ private final boolean replaceURIsInContent;
InterceptorConfiguration(ServerSocketFactory serverSocketFactory, int listenPort,
SocketFactory socketFactory, String targetHost, int targetPort, boolean proxy,
String httpProxyHost, int httpProxyPort, StreamFilterFactory[] requestFilters,
StreamFilterFactory[] responseFilters, ContentFilterFactory
- requestContentFilterFactory, ContentFilterFactory responseContentFilterFactory) {
+ requestContentFilterFactory, ContentFilterFactory responseContentFilterFactory,
+ boolean replaceURIsInContent) {
this.serverSocketFactory = serverSocketFactory;
this.listenPort = listenPort;
this.socketFactory = socketFactory;
@@ -60,6 +62,7 @@
this.responseFilters = responseFilters;
this.requestContentFilterFactory = requestContentFilterFactory;
this.responseContentFilterFactory = responseContentFilterFactory;
+ this.replaceURIsInContent = replaceURIsInContent;
}
public ServerSocketFactory getServerSocketFactory() {
@@ -119,4 +122,8 @@
public ContentFilterFactory getResponseContentFilterFactory() {
return responseContentFilterFactory;
}
+
+ public boolean isReplaceURIsInContent() {
+ return replaceURIsInContent;
+ }
}
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=780851&r1=780850&r2=780851&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 22:08:44 2009
@@ -45,6 +45,7 @@
private final List/*<StreamFilterFactory>*/ responseFilters = new ArrayList();
private ContentFilterFactory requestContentFilterFactory;
private ContentFilterFactory responseContentFilterFactory;
+ private boolean replaceURIsInContent;
public InterceptorConfigurationBuilder() {
}
@@ -62,6 +63,7 @@
responseFilters.addAll(Arrays.asList(config.responseFilters));
requestContentFilterFactory = config.getRequestContentFilterFactory();
responseContentFilterFactory = config.getResponseContentFilterFactory();
+ replaceURIsInContent = config.isReplaceURIsInContent();
}
public void setServerSocketFactory(ServerSocketFactory serverSocketFactory) {
@@ -139,6 +141,10 @@
this.responseContentFilterFactory = responseContentFilterFactory;
}
+ public void setReplaceURIsInContent(boolean replaceURIsInContent) {
+ this.replaceURIsInContent = replaceURIsInContent;
+ }
+
public InterceptorConfiguration build() {
if (serverSocketFactory == null) {
serverSocketFactory = ServerSocketFactory.getDefault();
@@ -149,11 +155,12 @@
if (proxy) {
targetHost = null;
targetPort = -1;
+ replaceURIsInContent = false;
}
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()]),
- requestContentFilterFactory, responseContentFilterFactory);
+ requestContentFilterFactory, responseContentFilterFactory, replaceURIsInContent);
}
}
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/UriReplaceContentFilterFactory.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/UriReplaceContentFilterFactory.java?rev=780851&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/UriReplaceContentFilterFactory.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/UriReplaceContentFilterFactory.java Mon Jun 1 22:08:44 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 javax.activation.MimeType;
+
+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.http.HostRewriter;
+import org.apache.ws.commons.tcpmon.core.filter.mime.MultipartAwareContentFilterFactory;
+
+public class UriReplaceContentFilterFactory extends MultipartAwareContentFilterFactory {
+ public static final int REQUEST = 0;
+ public static final int RESPONSE = 1;
+
+ private final HostRewriter hostRewriter;
+ private final int direction;
+
+ public UriReplaceContentFilterFactory(HostRewriter hostRewriter, int direction) {
+ this.hostRewriter = hostRewriter;
+ this.direction = direction;
+ }
+
+ protected StreamFilter[] getContentFilterChainForMimePart(MimeType contentType) {
+ if (contentType.getPrimaryType().equalsIgnoreCase("text")
+ || contentType.getSubType().toLowerCase().indexOf("xml") != -1) {
+ String orgBaseUri = hostRewriter.getOrgBaseUri();
+ String targetBaseUri = hostRewriter.getTargetBaseUri();
+ String charset = contentType.getParameter("charset");
+ if (orgBaseUri != null && targetBaseUri != null && charset != null) {
+ String fromBaseUri;
+ String toBaseUri;
+ if (direction == REQUEST) {
+ fromBaseUri = orgBaseUri;
+ toBaseUri = targetBaseUri;
+ } else {
+ fromBaseUri = targetBaseUri;
+ toBaseUri = orgBaseUri;
+ }
+ try {
+ return new StreamFilter[] { new ReplaceFilter(fromBaseUri, toBaseUri, charset) };
+ } catch (UnsupportedEncodingException ex) {
+ return null;
+ }
+ }
+ }
+ return null;
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/engine/UriReplaceContentFilterFactory.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/HostRewriter.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/HostRewriter.java?rev=780851&r1=780850&r2=780851&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HostRewriter.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HostRewriter.java Mon Jun 1 22:08:44 2009
@@ -40,6 +40,14 @@
targetBaseUri = buffer.toString();
}
+ public String getTargetBaseUri() {
+ return targetBaseUri;
+ }
+
+ public String getOrgBaseUri() {
+ return orgBaseUri;
+ }
+
private void rewriteUriHeaders(Headers headers, String[] names, String fromBaseUri, String toBaseUri) {
for (int i=0; i<names.length; i++) {
String name = names[i];
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=780851&r1=780850&r2=780851&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 22:08:44 2009
@@ -102,6 +102,8 @@
protected abstract void completed();
private void processHeaders(HeaderParser headerParser, Stream stream) {
+ processHeaders(headers);
+
boolean hasEntity = false;
boolean discardHeaders = false;
StreamFilter transferDecoder = null;
@@ -131,8 +133,6 @@
}
}
- processHeaders(headers);
-
if (discardHeaders && contentFilterChain != null) {
headerParser.discard();
} else {
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ChainedContentFilterFactory.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/mime/ChainedContentFilterFactory.java?rev=780851&view=auto
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ChainedContentFilterFactory.java (added)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ChainedContentFilterFactory.java Mon Jun 1 22:08:44 2009
@@ -0,0 +1,49 @@
+/*
+ * 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.mime;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.ws.commons.tcpmon.core.filter.StreamFilter;
+
+public class ChainedContentFilterFactory implements ContentFilterFactory {
+ private final List/*<ContentFilterFactory>*/ factories = new ArrayList(5);
+
+ public void add(ContentFilterFactory factory) {
+ factories.add(factory);
+ }
+
+ public StreamFilter[] getContentFilterChain(String contentType) {
+ if (factories.isEmpty()) {
+ return null;
+ } else if (factories.size() == 1) {
+ return ((ContentFilterFactory)factories.get(0)).getContentFilterChain(contentType);
+ } else {
+ List filters = new ArrayList(5);
+ for (Iterator it = factories.iterator(); it.hasNext(); ) {
+ StreamFilter[] f = ((ContentFilterFactory)it.next()).getContentFilterChain(contentType);
+ if (f != null) {
+ filters.addAll(Arrays.asList(f));
+ }
+ }
+ return filters.isEmpty() ? null : (StreamFilter[])filters.toArray(new StreamFilter[filters.size()]);
+ }
+ }
+}
Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ChainedContentFilterFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-ui/src/main/java/org/apache/ws/commons/tcpmon/swing/AdminPane.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-ui/src/main/java/org/apache/ws/commons/tcpmon/swing/AdminPane.java?rev=780851&r1=780850&r2=780851&view=diff
==============================================================================
--- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-ui/src/main/java/org/apache/ws/commons/tcpmon/swing/AdminPane.java (original)
+++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-ui/src/main/java/org/apache/ws/commons/tcpmon/swing/AdminPane.java Mon Jun 1 22:08:44 2009
@@ -119,6 +119,8 @@
// private final JCheckBox incomingSSLBox;
private final JCheckBox outgoingSSLBox;
+
+ final JCheckBox replaceURIsInContentBox;
/**
* Constructor AdminPage
@@ -183,6 +185,7 @@
tportLabel.setForeground(state
? Color.black
: Color.gray);
+ replaceURIsInContentBox.setEnabled(state);
}
}
});
@@ -220,6 +223,7 @@
proxyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (proxy.equals(event.getActionCommand())) {
+ // TODO: duplicate code here!!
boolean state = proxyButton.isSelected();
tport.setEnabled(!state);
host.setEnabled(!state);
@@ -229,6 +233,7 @@
tportLabel.setForeground(state
? Color.gray
: Color.black);
+ replaceURIsInContentBox.setEnabled(!state);
}
}
});
@@ -370,6 +375,11 @@
// opts.add(incomingSSLBox = new JCheckBox("Use SSL for incoming connections"), c); // TODO: i18n
opts.add(outgoingSSLBox = new JCheckBox("Use SSL for outgoing connections"), c); // TODO: i18n
+ // Replace URIs options
+ c.anchor = GridBagConstraints.WEST;
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ opts.add(replaceURIsInContentBox = new JCheckBox("Replace URIs in request/response content"), c); // TODO: i18n
+
// Spacer
// ////////////////////////////////////////////////////////////////
mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c);
@@ -448,6 +458,8 @@
}
}
+ configBuilder.setReplaceURIsInContent(replaceURIsInContentBox.isSelected());
+
return configBuilder.build();
}