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(); }