Author: sebb
Date: Sun Mar 18 16:26:42 2007
New Revision: 519733

URL: http://svn.apache.org/viewvc?view=rev&rev=519733
Log:
Bug 41880 - Add content-type filtering to HTTP Proxy Server

Removed:
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/HttpClientSSLProtocolSocketFactory.java
Modified:
    jakarta/jmeter/branches/rel-2-2/bin/jmeter.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
    
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/proxy/TestProxyControl.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml

Modified: jakarta/jmeter/branches/rel-2-2/bin/jmeter.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/jmeter.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/jmeter.properties (original)
+++ jakarta/jmeter/branches/rel-2-2/bin/jmeter.properties Sun Mar 18 16:26:42 
2007
@@ -302,6 +302,11 @@
 # Apache HTTPClient:
 #jmeter.httpsampler=HTTPSampler2
 
+# Default content-type include filter to use
+#proxy.content_type_include=text/html|text/plain|text/xml
+# Default content-type exclude filter to use
+#proxy.content_type_exclude=image/.*|text/css|application/.*
+
 #---------------------------------------------------------------------------
 # JMeter Proxy configuration
 #---------------------------------------------------------------------------

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
 Sun Mar 18 16:26:42 2007
@@ -272,6 +272,7 @@
 invalid_mail=Error occurred sending the e-mail
 invalid_mail_address=One or more invalid e-mail addresses detected
 invalid_mail_server=Problem contacting the e-mail server (see JMeter log file)
+invalid_variables=Invalid variables
 iteration_counter_arg_1=TRUE, for each user to have own counter, FALSE for a 
global counter
 iterator_num=Loop Count\:
 jar_file=Jar Files
@@ -481,8 +482,8 @@
 path_extension_choice=Path Extension (use ";" as separator)
 path_extension_dont_use_equals=Do not use equals in path extension (Intershop 
Enfinity compatibility)
 path_extension_dont_use_questionmark=Do not use questionmark in path extension 
(Intershop Enfinity compatibility)
-patterns_to_exclude=Patterns to Exclude
-patterns_to_include=Patterns to Include
+patterns_to_exclude=URL Patterns to Exclude
+patterns_to_include=URL Patterns to Include
 pkcs12_desc=PKCS 12 Key (*.p12)
 port=Port\:
 property_as_field_label={0}\:
@@ -503,13 +504,18 @@
 provider_url=Provider URL
 proxy_assertions=Add Assertions
 proxy_cl_error=If specifying a proxy server, host and port must be given
+proxy_content_type_exclude=Exclude\:
+proxy_content_type_filter=Content-type filter
+proxy_content_type_include=Include\:
 proxy_headers=Capture HTTP Headers
 proxy_httpsspoofing=Attempt https Spoofing
 proxy_regex=Regex matching
+proxy_sampler_settings=HTTP Sampler settings
+proxy_sampler_type=Type\:
 proxy_separators=Add Separators
 proxy_target=Target Controller\:
+proxy_test_plan_content=Test plan content
 proxy_title=HTTP Proxy Server
-proxy_usekeepalive=Set Keep-Alive
 ramp_up=Ramp-Up Period (in seconds)\:
 random_control_title=Random Controller
 random_order_control_title=Random Order Controller

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
 Sun Mar 18 16:26:42 2007
@@ -115,8 +115,8 @@
 paste=Einf\u00FCgen
 paste_insert=Als Eintrag einf\u00FCgen
 path_extension_choice=Path Erweiterung (benutze ";" als Trennzeichen)
-patterns_to_exclude=Muster zum ausschliessen
-patterns_to_include=Muster zum einschliessen
+patterns_to_exclude=URL Muster zum ausschliessen
+patterns_to_include=URL Muster zum einschliessen
 protocol=Protokol\:
 proxy_cl_error=Wenn Sie einen Proxy Server spezifizieren, m\u00FCssen Sie den 
Host und Port angeben
 random_control_title=Zufalls Kontroller

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
 Sun Mar 18 16:26:42 2007
@@ -394,8 +394,8 @@
 path_extension_choice=Extensi\u00F3n de Path (utilice ";" como separador)
 path_extension_dont_use_equals=No utilice el signo igual en la extensi\u00F3n 
del path (compatibilidad con Intershop Enfinity)
 path_extension_dont_use_questionmark=No utilice el signo interrogaci\u00F3n en 
la extensi\u00F3n del path (compatibilidad con Intershop Enfinity)
-patterns_to_exclude=Patrones a Excluir
-patterns_to_include=Patrones a Incluir
+patterns_to_exclude=URL Patrones a Excluir
+patterns_to_include=URL Patrones a Incluir
 pkcs12_desc=Clave PKCS (*.p12)
 port=Puerto\:
 property_default_param=Valor por defecto
@@ -417,7 +417,6 @@
 proxy_separators=A\u00F1adir Separadores
 proxy_target=Controlador Objetivo\:
 proxy_title=Servidor Proxy HTTP
-proxy_usekeepalive=Establecer Keep-Alive
 ramp_up=Periodo de Subida (en segundos)\:
 random_control_title=Controlador Random
 random_order_control_title=Controlador Random Order

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
 Sun Mar 18 16:26:42 2007
@@ -299,8 +299,8 @@
 path=Chemin\:
 path_extension_choice=Extension Chamin (utiliser ";" comme separateur)
 path_extension_dont_use_equals=Ne pas utiliser \u00E9gale dans l'extension de 
chemin (Intershop Enfinity compatibility)
-patterns_to_exclude=Motifs \u00E0 Exclure
-patterns_to_include=Motifs \u00E0 Inclure
+patterns_to_exclude=URL Motifs \u00E0 Exclure
+patterns_to_include=URL Motifs \u00E0 Inclure
 property_default_param=Valeur par d\u00E9faut
 property_edit=Editer
 property_editor.value_is_invalid_message=Le texte que vous venez d'entrer n'a 
pas une valeur valide pour cette propri\u00E9t\u00E9.\nLa propri\u00E9t\u00E9 
va revenir \u00E0 sa valeur pr\u00E9c\u00E9dente.

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
 Sun Mar 18 16:26:42 2007
@@ -302,7 +302,6 @@
 proxy_separators=\u30BB\u30D1\u30EC\u30FC\u30BF\u306E\u8FFD\u52A0
 
proxy_target=\u5BFE\u8C61\u3068\u306A\u308B\u30B3\u30F3\u30C8\u30ED\u30FC\u30E9\:
 proxy_title=HTTP \u30D7\u30ED\u30AD\u30B7\u30B5\u30FC\u30D0
-proxy_usekeepalive=Keep-Alive\u3092\u8A2D\u5B9A
 ramp_up=Ramp-Up \u671F\u9593 (\u79D2)\:
 random_control_title=\u4E71\u6570\u30B3\u30F3\u30C8\u30ED\u30FC\u30E9
 
random_order_control_title=\u30E9\u30F3\u30C0\u30E0\u9806\u5E8F\u30B3\u30F3\u30C8\u30ED\u30FC\u30E9

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
 Sun Mar 18 16:26:42 2007
@@ -87,8 +87,8 @@
 paramtable=Send parametre med foresp\u00F8rselen\:
 password=Passord
 path=Sti\:
-patterns_to_exclude=M\u00F8nster \u00E5 ekskludere
-patterns_to_include=M\u00F8nster \u00E5 inkludere
+patterns_to_exclude=URL M\u00F8nster \u00E5 ekskludere
+patterns_to_include=URL M\u00F8nster \u00E5 inkludere
 protocol=Protokoll\:
 proxy_title=HTTP proxy server
 ramp_up=Oppstartsperiode (i sekunder)\:

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
 Sun Mar 18 16:26:42 2007
@@ -417,7 +417,6 @@
 proxy_separators=\u589E\u52A0\u5206\u9694
 proxy_target=\u76EE\u6A19\u63A7\u5236\u5668
 proxy_title=HTTP \u4EE3\u7406\u4F3A\u670D\u5668
-proxy_usekeepalive=\u4FDD\u6301\u9023\u7DDA
 ramp_up=\u555F\u52D5\u5EF6\u9072(\u79D2)
 random_control_title=\u96A8\u6A5F\u63A7\u5236\u5668
 random_order_control_title=\u96A8\u6A5F\u9806\u5E8F\u63A7\u5236\u5668

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
 Sun Mar 18 16:26:42 2007
@@ -54,6 +54,7 @@
 import org.apache.jmeter.testelement.property.IntegerProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
 import org.apache.jmeter.testelement.property.PropertyIterator;
+import org.apache.jmeter.testelement.property.StringProperty;
 import org.apache.jmeter.threads.ThreadGroup;
 import org.apache.jmeter.timers.Timer;
 import org.apache.jmeter.util.JMeterUtils;
@@ -112,6 +113,10 @@
 
        public static final String HTTPS_SPOOF = "ProxyControlGui.https_spoof";
 
+       public static final String CONTENT_TYPE_EXCLUDE = 
"ProxyControlGui.content_type_exclude"; // $NON-NLS-1$
+
+       public static final String CONTENT_TYPE_INCLUDE = 
"ProxyControlGui.content_type_include"; // $NON-NLS-1$
+       
        public static final int GROUPING_NO_GROUPS = 0;
 
        public static final int GROUPING_ADD_SEPARATORS = 1;
@@ -231,6 +236,14 @@
                setProperty(new BooleanProperty(HTTPS_SPOOF, b));
        }
        
+       public void setContentTypeExclude(String contentTypeExclude) {
+               setProperty(new StringProperty(CONTENT_TYPE_EXCLUDE, 
contentTypeExclude));
+       }
+
+       public void setContentTypeInclude(String contentTypeInclude) {
+               setProperty(new StringProperty(CONTENT_TYPE_INCLUDE, 
contentTypeInclude));
+       }
+
        public String getClassLabel() {
                return JMeterUtils.getResString("proxy_title"); // $NON-NLS-1$
        }
@@ -287,7 +300,14 @@
                return getPropertyAsBoolean(HTTPS_SPOOF, false);
        }
        
-       
+       public String getContentTypeExclude() {
+               return getPropertyAsString(CONTENT_TYPE_EXCLUDE);
+       }
+
+       public String getContentTypeInclude() {
+               return getPropertyAsString(CONTENT_TYPE_INCLUDE);
+       }
+
 
        public Class getGuiClass() {
                return 
org.apache.jmeter.protocol.http.proxy.gui.ProxyControlGui.class;
@@ -347,7 +367,7 @@
         * server's response while recording. A future consideration.
         */
        public void deliverSampler(HTTPSamplerBase sampler, TestElement[] 
subConfigs, SampleResult result) {
-               if (filterUrl(sampler)) {
+               if (filterContentType(result) && filterUrl(sampler)) {
                        JMeterTreeNode myTarget = findTargetControllerNode();
                        Collection defaultConfigurations = 
findApplicableElements(myTarget, ConfigTestElement.class, false);
                        Collection userDefinedVariables = 
findApplicableElements(myTarget, Arguments.class, true);
@@ -363,6 +383,11 @@
 
                        notifySampleListeners(new SampleEvent(result, 
sampler.getName()));
                }
+               else {
+                       if(log.isDebugEnabled()) {
+                               log.debug("Sample excluded based on url or 
content-type: " + result.getUrlAsString() + " - " + result.getContentType());
+                       }
+               }
        }
 
        public void stopProxy() {
@@ -400,6 +425,74 @@
                }
 
                return true;
+       }
+
+    // Package protected to allow test case access
+    /**
+     * Filter the response based on the content type.
+     * If no include nor exclude filter is specified, the result will be 
included
+     * 
+     * @param result the sample result to check
+     */
+    boolean filterContentType(SampleResult result) {
+       String includeExp = getContentTypeInclude(); 
+       String excludeExp = getContentTypeExclude();
+       // If no expressions are specified, we let the sample pass
+       if((includeExp == null || includeExp.length() == 0) &&
+                       (excludeExp == null || excludeExp.length() == 0)
+                       )
+       {
+               return true;
+       }
+       
+       // Check that we have a content type
+       String sampleContentType = result.getContentType();     
+       if(sampleContentType == null || sampleContentType.length() == 0) {
+               if(log.isDebugEnabled()) {
+                       log.debug("No Content-type found for : " + 
result.getUrlAsString());
+               }
+               
+               return true;
+       }
+
+       if(log.isDebugEnabled()) {
+               log.debug("Content-type to filter : " + sampleContentType);
+       }
+       // Check if the include pattern is mathed
+       if(includeExp != null && includeExp.length() > 0) {
+               if(log.isDebugEnabled()) {
+                       log.debug("Include expression : " + includeExp);
+               }               
+               
+               Pattern pattern = null;
+               try {
+                       pattern = 
JMeterUtils.getPatternCache().getPattern(includeExp, 
Perl5Compiler.READ_ONLY_MASK | Perl5Compiler.SINGLELINE_MASK);
+                       
if(!JMeterUtils.getMatcher().contains(sampleContentType, pattern)) {
+                               return false;
+                       }
+               } catch (MalformedCachePatternException e) {
+                       log.warn("Skipped invalid content include pattern: " + 
includeExp, e);
+               }
+       }
+
+       // Check if the exclude pattern is mathed
+       if(excludeExp != null && excludeExp.length() > 0) {
+               if(log.isDebugEnabled()) {
+                       log.debug("Exclude expression : " + excludeExp);
+               }
+
+               Pattern pattern = null;
+               try {
+                       pattern = 
JMeterUtils.getPatternCache().getPattern(excludeExp, 
Perl5Compiler.READ_ONLY_MASK | Perl5Compiler.SINGLELINE_MASK);
+                       if(JMeterUtils.getMatcher().contains(sampleContentType, 
pattern)) {
+                               return false;
+                       }
+               } catch (MalformedCachePatternException e) {
+                       log.warn("Skipped invalid content exclude pattern: " + 
includeExp, e);
+               }
+       }
+
+       return true;
        }
 
        /*

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
 Sun Mar 18 16:26:42 2007
@@ -57,6 +57,7 @@
 import org.apache.jmeter.gui.util.HorizontalPanel;
 import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.gui.util.PowerTableModel;
+import org.apache.jmeter.gui.util.VerticalPanel;
 import org.apache.jmeter.protocol.http.proxy.ProxyControl;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
@@ -66,9 +67,6 @@
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 
-/**
- * @version $Revision$ updated on $Date$
- */
 public class ProxyControlGui extends LogicControllerGui implements 
JMeterGUIComponent, ActionListener, ItemListener,
                KeyListener, FocusListener, UnsharedComponent {
        private static transient Logger log = 
LoggingManager.getLoggerForClass();
@@ -112,12 +110,12 @@
         * Set/clear the Redirect automatically box on the samplers (default is 
false)
         */
        private JCheckBox samplerRedirectAutomatically;
+
        /**
         * Set/clear the Follow-redirects box on the samplers (default is true)
         */
        private JCheckBox samplerFollowRedirects;
 
-
        /**
         * Set/clear the Download images box on the samplers (default is false)
         */
@@ -128,6 +126,16 @@
         * even if it is really https.
         */
        private JCheckBox httpsSpoof;
+
+       /**
+        * Regular expression to include results based on content type
+        */
+       private JTextField contentTypeInclude;
+
+       /**
+        * Regular expression to exclude results based on content type
+        */
+       private JTextField contentTypeExclude;
        
        /**
         * List of available target controllers
@@ -146,27 +154,27 @@
 
        private PowerTableModel includeModel;
 
-       private static final String CHANGE_TARGET = "change_target";
+       private static final String CHANGE_TARGET = "change_target"; // 
$NON-NLS-1$
 
        private JButton stop, start, restart;
 
-       private static final String STOP = "stop";
+       private static final String STOP = "stop"; // $NON-NLS-1$
 
-       private static final String START = "start";
+       private static final String START = "start"; // $NON-NLS-1$
 
-       private static final String RESTART = "restart";
+       private static final String RESTART = "restart"; // $NON-NLS-1$
 
-       private static final String ADD_INCLUDE = "add_include";
+       private static final String ADD_INCLUDE = "add_include"; // $NON-NLS-1$
 
-       private static final String ADD_EXCLUDE = "add_exclude";
+       private static final String ADD_EXCLUDE = "add_exclude"; // $NON-NLS-1$
 
-       private static final String DELETE_INCLUDE = "delete_include";
+       private static final String DELETE_INCLUDE = "delete_include"; // 
$NON-NLS-1$
 
-       private static final String DELETE_EXCLUDE = "delete_exclude";
+       private static final String DELETE_EXCLUDE = "delete_exclude"; // 
$NON-NLS-1$
 
-       private static final String INCLUDE_COL = 
JMeterUtils.getResString("patterns_to_include");
+       private static final String INCLUDE_COL = 
JMeterUtils.getResString("patterns_to_include"); // $NON-NLS-1$
 
-       private static final String EXCLUDE_COL = 
JMeterUtils.getResString("patterns_to_exclude");
+       private static final String EXCLUDE_COL = 
JMeterUtils.getResString("patterns_to_exclude"); // $NON-NLS-1$
 
        public ProxyControlGui() {
                super();
@@ -207,7 +215,9 @@
                        model.setUseKeepAlive(useKeepAlive.isSelected());
                        
model.setSamplerDownloadImages(samplerDownloadImages.isSelected());
                        model.setRegexMatch(regexMatch.isSelected());
-                       model.setHttpsSpoof(httpsSpoof.isSelected());           
        
+                       model.setHttpsSpoof(httpsSpoof.isSelected());
+                       
model.setContentTypeInclude(contentTypeInclude.getText());
+                       
model.setContentTypeExclude(contentTypeExclude.getText());
                        TreeNodeWrapper nw = (TreeNodeWrapper) 
targetNodes.getSelectedItem();
                        if (nw == null) {
                                model.setTarget(null);
@@ -237,7 +247,7 @@
        }
 
        public String getLabelResource() {
-               return "proxy_title";
+               return "proxy_title"; // $NON-NLS-1$
        }
 
        public Collection getMenuCategories() {
@@ -259,6 +269,8 @@
                
samplerDownloadImages.setSelected(model.getSamplerDownloadImages());
                regexMatch.setSelected(model.getRegexMatch());
                httpsSpoof.setSelected(model.getHttpsSpoof());
+               contentTypeInclude.setText(model.getContentTypeInclude());
+               contentTypeExclude.setText(model.getContentTypeExclude());
 
                reinitializeTargetCombo();// Set up list of potential targets 
and
                                                                        // 
enable listener
@@ -324,7 +336,9 @@
                                || command.equals(ProxyControl.USE_KEEPALIVE)
                                || 
command.equals(ProxyControl.SAMPLER_DOWNLOAD_IMAGES) 
                                || command.equals(ProxyControl.REGEX_MATCH)
-                               || command.equals(ProxyControl.HTTPS_SPOOF)) {
+                               || command.equals(ProxyControl.HTTPS_SPOOF)
+                               || 
command.equals(ProxyControl.CONTENT_TYPE_INCLUDE)
+                               || 
command.equals(ProxyControl.CONTENT_TYPE_EXCLUDE)) {
                        enableRestart();
                } else if (command.equals(ADD_EXCLUDE)) {
                        excludeModel.addNewRow();
@@ -361,7 +375,9 @@
                        stop.setEnabled(true);
                        restart.setEnabled(false);
                } catch (InvalidVariableException e) {
-                       JOptionPane.showMessageDialog(this, 
JMeterUtils.getResString("invalid_variables"), "Error",
+                       JOptionPane.showMessageDialog(this, 
+                                       
JMeterUtils.getResString("invalid_variables"), // $NON-NLS-1$
+                                       "Error",
                                        JOptionPane.ERROR_MESSAGE);
                }
        }
@@ -415,7 +431,7 @@
                                        // the user closes the error dialog, 
the text would change
                                        // from "5t" to "1". A litle confusing. 
If anything, it
                                        // should display just "5". Future 
enhancement...
-                                       portField.setText("");
+                                       portField.setText(""); // $NON-NLS-1$
                                }
                        }
                        enableRestart();
@@ -437,10 +453,8 @@
                myBox.add(Box.createVerticalStrut(5));
                myBox.add(createHTTPSamplerPanel());
                myBox.add(Box.createVerticalStrut(5));
-               myBox.add(createTargetPanel());
-               myBox.add(Box.createVerticalStrut(5));
-               myBox.add(createGroupingPanel());
-               myBox.add(Box.createVerticalStrut(5));
+               myBox.add(createContentTypePanel());
+               myBox.add(Box.createVerticalStrut(5));                          
                mainPanel.add(myBox, BorderLayout.NORTH);
 
                Box includeExcludePanel = Box.createVerticalBox();
@@ -454,17 +468,17 @@
        }
 
        private JPanel createControls() {
-               start = new JButton(JMeterUtils.getResString("start"));
+               start = new JButton(JMeterUtils.getResString("start")); // 
$NON-NLS-1$
                start.addActionListener(this);
                start.setActionCommand(START);
                start.setEnabled(true);
 
-               stop = new JButton(JMeterUtils.getResString("stop"));
+               stop = new JButton(JMeterUtils.getResString("stop")); // 
$NON-NLS-1$
                stop.addActionListener(this);
                stop.setActionCommand(STOP);
                stop.setEnabled(false);
 
-               restart = new JButton(JMeterUtils.getResString("restart"));
+               restart = new JButton(JMeterUtils.getResString("restart")); // 
$NON-NLS-1$
                restart.addActionListener(this);
                restart.setActionCommand(RESTART);
                restart.setEnabled(false);
@@ -481,10 +495,10 @@
                portField.setName(ProxyControl.PORT);
                portField.addKeyListener(this);
 
-               JLabel label = new JLabel(JMeterUtils.getResString("port"));
+               JLabel label = new JLabel(JMeterUtils.getResString("port")); // 
$NON-NLS-1$
                label.setLabelFor(portField);
 
-               httpsSpoof = new 
JCheckBox(JMeterUtils.getResString("proxy_httpsspoofing"));
+               httpsSpoof = new 
JCheckBox(JMeterUtils.getResString("proxy_httpsspoofing")); // $NON-NLS-1$
                httpsSpoof.setName(ProxyControl.HTTPS_SPOOF);
                httpsSpoof.setSelected(false);
                httpsSpoof.addActionListener(this);
@@ -501,77 +515,80 @@
        }
 
        private JPanel createTestPlanContentPanel() {
-               JLabel label = new JLabel("Test plan content:");
-
-               httpHeaders = new 
JCheckBox(JMeterUtils.getResString("proxy_headers"));
+               httpHeaders = new 
JCheckBox(JMeterUtils.getResString("proxy_headers")); // $NON-NLS-1$
                httpHeaders.setName(ProxyControl.CAPTURE_HTTP_HEADERS);
                httpHeaders.setSelected(true); // maintain original default
                httpHeaders.addActionListener(this);
                httpHeaders.setActionCommand(ProxyControl.CAPTURE_HTTP_HEADERS);
 
-               addAssertions = new 
JCheckBox(JMeterUtils.getResString("proxy_assertions"));
+               addAssertions = new 
JCheckBox(JMeterUtils.getResString("proxy_assertions")); // $NON-NLS-1$
                addAssertions.setName(ProxyControl.ADD_ASSERTIONS);
                addAssertions.setSelected(false);
                addAssertions.addActionListener(this);
                addAssertions.setActionCommand(ProxyControl.ADD_ASSERTIONS);
 
-               regexMatch = new 
JCheckBox(JMeterUtils.getResString("proxy_regex"));
+               regexMatch = new 
JCheckBox(JMeterUtils.getResString("proxy_regex")); // $NON-NLS-1$
                regexMatch.setName(ProxyControl.REGEX_MATCH);
                regexMatch.setSelected(false);
                regexMatch.addActionListener(this);
                regexMatch.setActionCommand(ProxyControl.REGEX_MATCH);
 
-               HorizontalPanel panel = new HorizontalPanel();
-               panel.add(label);
-
-               panel.add(httpHeaders);
-               panel.add(addAssertions);
-               panel.add(regexMatch);
+               VerticalPanel mainPanel = new VerticalPanel();
+               
mainPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+                               
JMeterUtils.getResString("proxy_test_plan_content"))); // $NON-NLS-1$
+
+               HorizontalPanel nodeCreationPanel = new HorizontalPanel();
+               nodeCreationPanel.add(httpHeaders);
+               nodeCreationPanel.add(addAssertions);
+               nodeCreationPanel.add(regexMatch);
+               
+               mainPanel.add(createTargetPanel());
+               mainPanel.add(createGroupingPanel());
+               mainPanel.add(nodeCreationPanel);
 
-               return panel;
+               return mainPanel;
        }
 
        private JPanel createHTTPSamplerPanel() {
-               JLabel label = new JLabel("HTTP Sampler settings:");
-               
                DefaultComboBoxModel m = new DefaultComboBoxModel();
                // Note: position of these elements in the menu *must* match the
                // corresponding ProxyControl.SAMPLER_TYPE_* values.
-               m.addElement(JMeterUtils.getResString("web_testing_title"));
-               m.addElement(JMeterUtils.getResString("web_testing2_title"));
+               m.addElement(JMeterUtils.getResString("web_testing_title")); // 
$NON-NLS-1$
+               m.addElement(JMeterUtils.getResString("web_testing2_title")); 
// $NON-NLS-1$
                samplerTypeName = new JComboBox(m);
                samplerTypeName.setName(ProxyControl.SAMPLER_TYPE_NAME);
                samplerTypeName.setSelectedIndex(0);
                samplerTypeName.addItemListener(this);
-               JLabel label2 = new JLabel("Type:");
+               JLabel label2 = new 
JLabel(JMeterUtils.getResString("proxy_sampler_type")); // $NON-NLS-1$
                label2.setLabelFor(samplerTypeName);
 
-               samplerRedirectAutomatically = new JCheckBox("Redirect 
automatically");
+               samplerRedirectAutomatically = new 
JCheckBox(JMeterUtils.getResString("follow_redirects_auto")); // $NON-NLS-1$
                
samplerRedirectAutomatically.setName(ProxyControl.SAMPLER_REDIRECT_AUTOMATICALLY);
                samplerRedirectAutomatically.setSelected(false);
                samplerRedirectAutomatically.addActionListener(this);
                
samplerRedirectAutomatically.setActionCommand(ProxyControl.SAMPLER_REDIRECT_AUTOMATICALLY);
                
-               samplerFollowRedirects = new JCheckBox("Follow redirects");
+               samplerFollowRedirects = new 
JCheckBox(JMeterUtils.getResString("follow_redirects")); // $NON-NLS-1$
                
samplerFollowRedirects.setName(ProxyControl.SAMPLER_FOLLOW_REDIRECTS);
                samplerFollowRedirects.setSelected(true);
                samplerFollowRedirects.addActionListener(this);
                
samplerFollowRedirects.setActionCommand(ProxyControl.SAMPLER_FOLLOW_REDIRECTS);
                
-               useKeepAlive = new 
JCheckBox(JMeterUtils.getResString("proxy_usekeepalive"));
+               useKeepAlive = new 
JCheckBox(JMeterUtils.getResString("use_keepalive")); // $NON-NLS-1$
                useKeepAlive.setName(ProxyControl.USE_KEEPALIVE);
                useKeepAlive.setSelected(true);
                useKeepAlive.addActionListener(this);
                useKeepAlive.setActionCommand(ProxyControl.USE_KEEPALIVE);
 
-               samplerDownloadImages = new JCheckBox("Download images");
+               samplerDownloadImages = new 
JCheckBox(JMeterUtils.getResString("web_testing_retrieve_images")); // 
$NON-NLS-1$
                
samplerDownloadImages.setName(ProxyControl.SAMPLER_DOWNLOAD_IMAGES);
                samplerDownloadImages.setSelected(false);
                samplerDownloadImages.addActionListener(this);
                
samplerDownloadImages.setActionCommand(ProxyControl.SAMPLER_DOWNLOAD_IMAGES);
                
                HorizontalPanel panel = new HorizontalPanel();
-               panel.add(label);
+               
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+                               
JMeterUtils.getResString("proxy_sampler_settings"))); // $NON-NLS-1$
                panel.add(label2);
                panel.add(samplerTypeName);
                panel.add(samplerRedirectAutomatically);
@@ -588,7 +605,7 @@
                targetNodes.setActionCommand(CHANGE_TARGET);
                // Action listener will be added later
 
-               JLabel label = new 
JLabel(JMeterUtils.getResString("proxy_target"));
+               JLabel label = new 
JLabel(JMeterUtils.getResString("proxy_target")); // $NON-NLS-1$
                label.setLabelFor(targetNodes);
 
                HorizontalPanel panel = new HorizontalPanel();
@@ -628,16 +645,16 @@
                DefaultComboBoxModel m = new DefaultComboBoxModel();
                // Note: position of these elements in the menu *must* match the
                // corresponding ProxyControl.GROUPING_* values.
-               m.addElement(JMeterUtils.getResString("grouping_no_groups"));
-               
m.addElement(JMeterUtils.getResString("grouping_add_separators"));
-               
m.addElement(JMeterUtils.getResString("grouping_in_controllers"));
-               
m.addElement(JMeterUtils.getResString("grouping_store_first_only"));
+               m.addElement(JMeterUtils.getResString("grouping_no_groups")); 
// $NON-NLS-1$
+               
m.addElement(JMeterUtils.getResString("grouping_add_separators")); // 
$NON-NLS-1$
+               
m.addElement(JMeterUtils.getResString("grouping_in_controllers")); // 
$NON-NLS-1$
+               
m.addElement(JMeterUtils.getResString("grouping_store_first_only")); // 
$NON-NLS-1$
                groupingMode = new JComboBox(m);
                groupingMode.setName(ProxyControl.GROUPING_MODE);
                groupingMode.setSelectedIndex(0);
                groupingMode.addItemListener(this);
 
-               JLabel label2 = new 
JLabel(JMeterUtils.getResString("grouping_mode"));
+               JLabel label2 = new 
JLabel(JMeterUtils.getResString("grouping_mode")); // $NON-NLS-1$
                label2.setLabelFor(groupingMode);
 
                HorizontalPanel panel = new HorizontalPanel();
@@ -646,6 +663,36 @@
 
                return panel;
        }
+       
+       private JPanel createContentTypePanel() {
+               contentTypeInclude = new JTextField(30);
+               contentTypeInclude.setName(ProxyControl.CONTENT_TYPE_INCLUDE);
+               contentTypeInclude.addActionListener(this);
+               
contentTypeInclude.setActionCommand(ProxyControl.CONTENT_TYPE_INCLUDE);
+               JLabel labelInclude = new 
JLabel(JMeterUtils.getResString("proxy_content_type_include")); // $NON-NLS-1$
+               labelInclude.setLabelFor(contentTypeInclude);
+               // Default value
+               
contentTypeInclude.setText(JMeterUtils.getProperty("proxy.content_type_include"));
 // $NON-NLS-1$
+
+               contentTypeExclude = new JTextField(30);
+               contentTypeExclude.setName(ProxyControl.CONTENT_TYPE_EXCLUDE);
+               contentTypeExclude.addActionListener(this);
+               
contentTypeExclude.setActionCommand(ProxyControl.CONTENT_TYPE_EXCLUDE);
+               JLabel labelExclude = new 
JLabel(JMeterUtils.getResString("proxy_content_type_exclude")); // $NON-NLS-1$
+               labelExclude.setLabelFor(contentTypeExclude);
+               // Default value
+               
contentTypeExclude.setText(JMeterUtils.getProperty("proxy.content_type_exclude"));
 // $NON-NLS-1$
+               
+               HorizontalPanel panel = new HorizontalPanel();
+               
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+                               
JMeterUtils.getResString("proxy_content_type_filter"))); // $NON-NLS-1$
+               panel.add(labelInclude);
+               panel.add(contentTypeInclude);
+               panel.add(labelExclude);
+               panel.add(contentTypeExclude);
+               
+               return panel;
+       }
 
        private JPanel createIncludePanel() {
                includeModel = new PowerTableModel(new String[] { INCLUDE_COL 
}, new Class[] { String.class });
@@ -655,7 +702,7 @@
 
                JPanel panel = new JPanel(new BorderLayout());
                
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
 JMeterUtils
-                               .getResString("patterns_to_include")));
+                               .getResString("patterns_to_include"))); // 
$NON-NLS-1$
 
                panel.add(new JScrollPane(includeTable), BorderLayout.CENTER);
                panel.add(createTableButtonPanel(ADD_INCLUDE, DELETE_INCLUDE), 
BorderLayout.SOUTH);
@@ -671,7 +718,7 @@
 
                JPanel panel = new JPanel(new BorderLayout());
                
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
 JMeterUtils
-                               .getResString("patterns_to_exclude")));
+                               .getResString("patterns_to_exclude"))); // 
$NON-NLS-1$
 
                panel.add(new JScrollPane(excludeTable), BorderLayout.CENTER);
                panel.add(createTableButtonPanel(ADD_EXCLUDE, DELETE_EXCLUDE), 
BorderLayout.SOUTH);
@@ -682,12 +729,12 @@
        private JPanel createTableButtonPanel(String addCommand, String 
deleteCommand) {
                JPanel buttonPanel = new JPanel();
 
-               JButton addButton = new 
JButton(JMeterUtils.getResString("add"));
+               JButton addButton = new 
JButton(JMeterUtils.getResString("add")); // $NON-NLS-1$
                addButton.setActionCommand(addCommand);
                addButton.addActionListener(this);
                buttonPanel.add(addButton);
 
-               JButton deleteButton = new 
JButton(JMeterUtils.getResString("delete"));
+               JButton deleteButton = new 
JButton(JMeterUtils.getResString("delete")); // $NON-NLS-1$
                deleteButton.setActionCommand(deleteCommand);
                deleteButton.addActionListener(this);
                buttonPanel.add(deleteButton);
@@ -707,7 +754,7 @@
                if (gp != null) {
                        root = (JMeterTreeNode) 
GuiPackage.getInstance().getTreeModel().getRoot();
                        targetNodesModel
-                                       .addElement(new TreeNodeWrapper(null, 
JMeterUtils.getResString("use_recording_controller")));
+                                       .addElement(new TreeNodeWrapper(null, 
JMeterUtils.getResString("use_recording_controller"))); // $NON-NLS-1$
                        buildNodesModel(root, "", 0);
                }
                TreeNodeWrapper choice = null;
@@ -768,7 +815,7 @@
                int multi = 4;
                StringBuffer spaces = new StringBuffer(level * multi);
                for (int i = 0; i < level * multi; i++) {
-                       spaces.append(" ");
+                       spaces.append(" "); // $NON-NLS-1$
                }
                return spaces.toString();
        }

Modified: 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/proxy/TestProxyControl.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/proxy/TestProxyControl.java?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/proxy/TestProxyControl.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/proxy/TestProxyControl.java
 Sun Mar 18 16:26:42 2007
@@ -20,6 +20,7 @@
 
 import junit.framework.TestCase;
 
+import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.protocol.http.sampler.HTTPNullSampler;
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
 
@@ -55,5 +56,94 @@
                        sampler.setPath("header.gif");
                        sampler.setDomain("jakarta.org");
                        assertFalse("Should not match header.gif", 
control.filterUrl(sampler));
+               }
+
+               public void testContentTypeNoFilters() throws Exception {
+                       SampleResult result = new SampleResult();
+                       // No filters
+                       control.setContentTypeInclude(null);
+                       control.setContentTypeExclude(null);
+
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("image/png");
+                       assertTrue("Should allow image/png", 
control.filterContentType(result));
+
+                       // Empty filters
+                       control.setContentTypeInclude("");
+                       control.setContentTypeExclude("");
+                       
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("image/png");
+                       assertTrue("Should allow image/png", 
control.filterContentType(result));
+                       
+                       // Non empty filters
+                       control.setContentTypeInclude(" ");
+                       control.setContentTypeExclude(" ");
+                       
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertFalse("Should not allow text/html", 
control.filterContentType(result));                   
+                       result.setContentType("image/png");
+                       assertFalse("Should not allow image/png", 
control.filterContentType(result));
+               }
+               
+               public void testContentTypeInclude() throws Exception {
+                       SampleResult result = new SampleResult();
+                       control.setContentTypeInclude("text/html|text/ascii");
+
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("text/css");
+                       assertFalse("Should not allow text/css", 
control.filterContentType(result));
+               }
+               
+               public void testContentTypeExclude() throws Exception {
+                       SampleResult result = new SampleResult();
+                       control.setContentTypeExclude("text/css");
+
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("text/css");
+                       assertFalse("Should not allow text/css", 
control.filterContentType(result));
+               }
+               
+               public void testContentTypeIncludeAndExclude() throws Exception 
{
+                       SampleResult result = new SampleResult();
+                       // Simple inclusion and exclusion filter
+                       control.setContentTypeInclude("text/html|text/ascii");
+                       control.setContentTypeExclude("text/css");
+
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("text/css");
+                       assertFalse("Should not allow text/css", 
control.filterContentType(result));                    
+                       result.setContentType("image/png");
+                       assertFalse("Should not allow image/png", 
control.filterContentType(result));
+                       
+                       // Allow all but images
+                       control.setContentTypeInclude(null);
+                       control.setContentTypeExclude("image/.*");
+                       
+                       result.setContentType(null);
+                       assertTrue("Should allow if no content-type present", 
control.filterContentType(result));                       
+                       result.setContentType("text/html; charset=utf-8");
+                       assertTrue("Should allow text/html", 
control.filterContentType(result));                        
+                       result.setContentType("text/css");
+                       assertTrue("Should allow text/css", 
control.filterContentType(result));                 
+                       result.setContentType("image/png");
+                       assertFalse("Should not allow image/png", 
control.filterContentType(result));
                }
 }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=519733&r1=519732&r2=519733
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sun Mar 18 16:26:42 2007
@@ -123,6 +123,7 @@
 <li>Bug 41873 - Add name to AssertionResult and display AssertionResult in 
ViewResultsFullVisualizer</li>
 <li>Bug 41876 - Add more options to control what the HTTP Proxy generates</li>
 <li>Bug 39693 - View Result Table use icon instead of check box</li>
+<li>Bug 41880 - Add content-type filtering to HTTP Proxy Server</li>
 </ul>
 
 <h4>Non-functional improvements:</h4>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to