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