Author: sebb
Date: Sat Apr 14 05:50:04 2007
New Revision: 528800

URL: http://svn.apache.org/viewvc?view=rev&rev=528800
Log:
Bug 42098 - Use specified encoding for parameter values in HTTP GET

Modified:
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java
    
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/sampler/TestHTTPSamplersAgainstHttpMirrorServer.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?view=diff&rev=528800&r1=528799&r2=528800
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 Sat Apr 14 05:50:04 2007
@@ -19,6 +19,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Arrays;
@@ -36,6 +37,7 @@
 import org.apache.jmeter.protocol.http.control.HeaderManager;
 import org.apache.jmeter.protocol.http.parser.HTMLParseException;
 import org.apache.jmeter.protocol.http.parser.HTMLParser;
+import org.apache.jmeter.protocol.http.util.EncoderCache;
 import org.apache.jmeter.protocol.http.util.HTTPArgument;
 import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jmeter.samplers.Entry;
@@ -486,6 +488,24 @@
         }
         return port;
     }
+
+    /**
+     * Tell whether the default port for the specified protocol is used
+     * 
+     * @return true if the default port number for the protocol is used, false 
otherwise
+     */
+    public boolean isProtocolDefaultPort() {
+       final int port = getPropertyAsInt(PORT);
+        final String protocol = getProtocol();
+               if (port == UNSPECIFIED_PORT || 
+                (PROTOCOL_HTTP.equalsIgnoreCase(protocol) && port == 
DEFAULT_HTTP_PORT) ||
+                (PROTOCOL_HTTPS.equalsIgnoreCase(protocol) && port == 
DEFAULT_HTTPS_PORT)) {
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
     
        public int getPort() {
                int port = getPropertyAsInt(PORT);
@@ -620,26 +640,55 @@
             pathAndQuery.append("/"); // $NON-NLS-1$
         }
         pathAndQuery.append(path);
-        if (this.getMethod().equals(GET) && getQueryString().length() > 0) {
-                       if (path.indexOf(QRY_PFX) > -1) {
-                               pathAndQuery.append(QRY_SEP);
-                       } else {
-                               pathAndQuery.append(QRY_PFX);
-                       }
-            pathAndQuery.append(getQueryString());
+
+        // Add the query string if it is a HTTP GET request
+        if(GET.equals(getMethod())) {
+            // Get the query string encoded in specified encoding
+            // If no encoding is specified by user, we will get it
+            // encoded in UTF-8, which is what the HTTP spec says
+            String queryString = getQueryString(getContentEncoding());
+            if(queryString.length() > 0) {
+                if (path.indexOf(QRY_PFX) > -1) {
+                    pathAndQuery.append(QRY_SEP);
+                } else {
+                    pathAndQuery.append(QRY_PFX);
+                }
+                pathAndQuery.append(queryString);
+            }
                }
-               if (getPort() == UNSPECIFIED_PORT || getPort() == 
DEFAULT_HTTP_PORT) {
+        // If default port for protocol is used, we do not include port in URL
+        if(isProtocolDefaultPort()) {
                        return new URL(getProtocol(), getDomain(), 
pathAndQuery.toString());
                }
-               return new URL(getProtocol(), getPropertyAsString(DOMAIN), 
getPort(), pathAndQuery.toString());
+        else {
+            return new URL(getProtocol(), getDomain(), getPort(), 
pathAndQuery.toString());
+        }
        }
 
+    /**
+     * Gets the QueryString attribute of the UrlConfig object, using
+     * UTF-8 to encode the URL
+     * 
+     * @return the QueryString value
+     */
+    public String getQueryString() {
+        // We use the encoding which should be used according to the HTTP 
spec, which is UTF-8
+        return getQueryString(EncoderCache.URL_ARGUMENT_ENCODING);
+    }
+    
        /**
-        * Gets the QueryString attribute of the UrlConfig object.
+        * Gets the QueryString attribute of the UrlConfig object, using the
+        * specified encoding to encode the parameter values put into the URL
         * 
+        * @param contentEncoding the encoding to use for encoding parameter 
values
         * @return the QueryString value
         */
-       public String getQueryString() {
+       public String getQueryString(String contentEncoding) {
+               // Check if the sampler has a specified content encoding        
+               if(contentEncoding == null || contentEncoding.trim().length() 
== 0) {
+                       // We use the encoding which should be used according 
to the HTTP spec, which is UTF-8
+                       contentEncoding = EncoderCache.URL_ARGUMENT_ENCODING;
+               }
                StringBuffer buf = new StringBuffer();
                PropertyIterator iter = getArguments().iterator();
                boolean first = true;
@@ -669,7 +718,14 @@
                        } else {
                                buf.append(item.getMetaData());
                        }
-                       buf.append(item.getEncodedValue());
+            
+                       // Encode the parameter value in the specified content 
encoding
+                       try {
+                           buf.append(item.getEncodedValue(contentEncoding));
+                       }
+                       catch(UnsupportedEncodingException e) {
+                           log.warn("Unable to encode parameter in encoding " 
+ contentEncoding + ", parameter value not included in query string");
+                       }
                }
                return buf.toString();
        }

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java?view=diff&rev=528800&r1=528799&r2=528800
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java
 Sat Apr 14 05:50:04 2007
@@ -233,7 +233,7 @@
                 // We create the post body content now, so we know the size
                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
                 
-                String postBody = getQueryStringForPostBody(sampler, 
contentEncoding);
+                String postBody = sampler.getQueryString(contentEncoding);
                 // Query string should be encoded in UTF-8
                 bos.write(postBody.getBytes("UTF-8")); // $NON-NLS-1$
                 bos.flush();
@@ -251,37 +251,6 @@
             connection.setDoOutput(true);
         }
     }
-    
-       /**
-        * Gets the query string for the sampler encoded for http post body.
-        * This method works differently from the getQueryString in 
HttpSamplerBase,
-        * becuase this method does not force the parameter value to be url 
encoded
-        * in utf8. Rather, it uses the specified encoding for the parameter 
value
-        * 
-        * @return the querystring encoded as usable for a http post body 
request
-        */
-       private String getQueryStringForPostBody(HTTPSampler sampler, String 
contentEncoding) throws IOException {
-               StringBuffer buf = new StringBuffer();
-               PropertyIterator iter = sampler.getArguments().iterator();
-               boolean first = true;
-               while (iter.hasNext()) {
-            HTTPArgument arg = (HTTPArgument) iter.next().getObjectValue();
-                       
-                       if (!first) {
-                               buf.append("&");
-                       } else {
-                               first = false;
-                       }
-                       buf.append(arg.getEncodedName());
-                       if (arg.getMetaData() == null) {
-                               buf.append("=");
-                       } else {
-                               buf.append(arg.getMetaData());
-                       }
-                       buf.append(URLEncoder.encode(arg.getValue(), 
contentEncoding));
-               }
-               return buf.toString();
-       }
     
     /**
      * Get the boundary string, used to separate multiparts

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java?view=diff&rev=528800&r1=528799&r2=528800
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java
 Sat Apr 14 05:50:04 2007
@@ -24,31 +24,53 @@
 import org.apache.oro.util.Cache;
 import org.apache.oro.util.CacheLRU;
 
-/**
- * @author Administrator
- * 
- * @version $Revision$ last updated $Date$
- */
 public class EncoderCache {
-       Cache cache;
+       
+    /** The encoding which should be usd for URLs, according to HTTP 
specification */
+    public static final String URL_ARGUMENT_ENCODING = "UTF-8";
+
+    private Cache cache;
 
        public EncoderCache(int cacheSize) {
                cache = new CacheLRU(cacheSize);
        }
 
-       public String getEncoded(String k) {
-               Object encodedValue = cache.getElement(k);
-               if (encodedValue != null) {
-                       return (String) encodedValue;
-               }
-               try {
-                       encodedValue = URLEncoder.encode(k, "utf8");
-               } catch (UnsupportedEncodingException e) {
-                       // This can't happen (how should utf8 not be 
supported!?!),
-                       // so just throw an Error:
-                       throw new Error("Should not happen: " + e.toString());
-               }
-               cache.addElement(k, encodedValue);
-               return (String) encodedValue;
-       }
+
+    /**
+     * Get the specified value URL encoded using UTF-8 encoding
+     * 
+     * @param k the value to encode
+     * @return the value URL encoded using UTF-8
+     */
+    public String getEncoded(String k) {
+        try {
+            return getEncoded(k, URL_ARGUMENT_ENCODING);
+        } catch (UnsupportedEncodingException e) {
+            // This can't happen (how should utf8 not be supported!?!),
+            // so just throw an Error:
+            throw new Error("Should not happen: " + e.toString());
+        }
+    }
+    
+    /**
+     * Get the specified value URL encoded using the specified encoding
+     * 
+     * @param k the value to encode
+     * @param contentEncoding the encoding to use when URL encoding
+     * @return the value URL encoded using the specified encoding
+     * @throws UnsupportedEncodingException if the specified encoding is not 
supported
+     */
+    public String getEncoded(String k, String contentEncoding) throws 
UnsupportedEncodingException {
+        String cacheKey = k + contentEncoding;
+        // Check if we have it in the cache
+        Object encodedValue = cache.getElement(cacheKey);
+        if (encodedValue != null) {
+            return (String) encodedValue;
+        }
+        // Perform the encoding
+        encodedValue = URLEncoder.encode(k, contentEncoding);
+        // Add to cache
+        cache.addElement(cacheKey, encodedValue);
+        return (String) encodedValue;
+    }
 }

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java?view=diff&rev=528800&r1=528799&r2=528800
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java
 Sat Apr 14 05:50:04 2007
@@ -92,8 +92,8 @@
                setAlwaysEncoded(true);
                if (alreadyEncoded) {
                        try {
-                               name = URLDecoder.decode(name, "UTF-8"); // 
$NON-NLS-1$
-                               value = URLDecoder.decode(value, "UTF-8");  // 
$NON-NLS-1$
+                               name = URLDecoder.decode(name, 
EncoderCache.URL_ARGUMENT_ENCODING);
+                               value = URLDecoder.decode(value, 
EncoderCache.URL_ARGUMENT_ENCODING);
                        } catch (UnsupportedEncodingException e) {
                                // UTF-8 unsupported? You must be joking!
                                log.error("UTF-8 encoding not supported!");
@@ -132,13 +132,36 @@
                }
        }
 
-       public String getEncodedValue() {
-               if (isAlwaysEncoded()) {
-                       return cache.getEncoded(getValue());
-               } else {
-                       return getValue();
-               }
-       }
+    /**
+     * Get the argument value encoded using UTF-8
+     * 
+     * @return the argument value encoded in UTF-8
+     */
+    public String getEncodedValue() {
+        // Encode according to the HTTP spec, i.e. UTF-8
+        try {
+            return getEncodedValue(EncoderCache.URL_ARGUMENT_ENCODING);
+        } catch (UnsupportedEncodingException e) {
+            // This can't happen (how should utf8 not be supported!?!),
+            // so just throw an Error:
+            throw new Error("Should not happen: " + e.toString());
+        }
+    }
+
+    /**
+     * Get the argument value encoded in the specified encoding
+     * 
+     * @param contentEncoding the encoding to use when encoding the argument 
value
+     * @return the argument value encoded in the specified encoding
+     * @throws UnsupportedEncodingException
+     */
+    public String getEncodedValue(String contentEncoding) throws 
UnsupportedEncodingException {
+        if (isAlwaysEncoded()) {
+            return cache.getEncoded(getValue(), contentEncoding);
+        } else {
+            return getValue();
+        }
+    }
 
        public String getEncodedName() {
                if (isAlwaysEncoded()) {

Modified: 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/sampler/TestHTTPSamplersAgainstHttpMirrorServer.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/sampler/TestHTTPSamplersAgainstHttpMirrorServer.java?view=diff&rev=528800&r1=528799&r2=528800
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/sampler/TestHTTPSamplersAgainstHttpMirrorServer.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/jmeter/protocol/http/sampler/TestHTTPSamplersAgainstHttpMirrorServer.java
 Sat Apr 14 05:50:04 2007
@@ -25,11 +25,13 @@
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.net.URL;
 import java.util.Locale;
 
 import org.apache.jmeter.config.Arguments;
 import org.apache.jmeter.engine.util.ValueReplacer;
 import org.apache.jmeter.protocol.http.control.HttpMirrorControl;
+import org.apache.jmeter.protocol.http.util.EncoderCache;
 import org.apache.jmeter.protocol.http.util.HTTPArgument;
 import org.apache.jmeter.testelement.TestPlan;
 import org.apache.jmeter.threads.JMeterContextService;
@@ -88,7 +90,7 @@
         // delete temporay file
         temporaryFile.delete();
     }
-        
+
     public void testPostRequest_UrlEncoded() throws Exception {
         // Test HTTPSampler
         String samplerDefaultEncoding = "ISO-8859-1";
@@ -98,7 +100,7 @@
         samplerDefaultEncoding = "US-ASCII";
         testPostRequest_UrlEncoded(HTTP_SAMPLER2, samplerDefaultEncoding);
     }
-       
+
     public void testPostRequest_FormMultipart() throws Exception {
         // Test HTTPSampler
         String samplerDefaultEncoding = "ISO-8859-1";
@@ -117,6 +119,22 @@
         // Test HTTPSampler2
         samplerDefaultEncoding = "US-ASCII";
         testPostRequest_FileUpload(HTTP_SAMPLER2, samplerDefaultEncoding);
+    }
+
+    public void testGetRequest() throws Exception {
+        // Test HTTPSampler
+        testGetRequest(HTTP_SAMPLER);
+        
+        // Test HTTPSampler2
+        testGetRequest(HTTP_SAMPLER2);
+    }
+    
+    public void testGetRequest_Parameters() throws Exception {
+        // Test HTTPSampler
+        testGetRequest_Parameters(HTTP_SAMPLER);
+        
+        // Test HTTPSampler2
+        testGetRequest_Parameters(HTTP_SAMPLER2);
     }   
 
     private void testPostRequest_UrlEncoded(int samplerType, String 
samplerDefaultEncoding) throws Exception {
@@ -286,6 +304,124 @@
         checkPostRequestFileUpload(sampler, res, samplerDefaultEncoding, 
contentEncoding, titleField, titleValue, descriptionField, descriptionValue, 
fileField, temporaryFile, fileMimeType, TEST_FILE_CONTENT);
     }
     
+    private void testGetRequest(int samplerType) throws Exception {
+        // Test sending simple HTTP get
+        // Test sending data with default encoding
+        HTTPSamplerBase sampler = createHttpSampler(samplerType);
+        String contentEncoding = "";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        HTTPSampleResult res = executeSampler(sampler);
+        checkGetRequest(sampler, res);
+        
+        // Test sending data with ISO-8859-1 encoding
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "ISO-8859-1";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        res = executeSampler(sampler);
+        checkGetRequest(sampler, res);
+
+        // Test sending data with UTF-8 encoding
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "UTF-8";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        res = executeSampler(sampler);
+        checkGetRequest(sampler, res);
+    }
+
+    private void testGetRequest_Parameters(int samplerType) throws Exception {
+        String titleField = "title";
+        String titleValue = "mytitle";
+        String descriptionField = "description";
+        String descriptionValue = "mydescription";
+        
+        // Test sending simple HTTP get
+        // Test sending data with default encoding
+        HTTPSamplerBase sampler = createHttpSampler(samplerType);
+        String contentEncoding = "";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        setupFormData(sampler, false, titleField, titleValue, 
descriptionField, descriptionValue);
+        HTTPSampleResult res = executeSampler(sampler);
+        sampler.setRunningVersion(true);
+        URL executedUrl = sampler.getUrl();
+        sampler.setRunningVersion(false);
+        checkGetRequest_Parameters(sampler, res, contentEncoding, executedUrl, 
titleField, titleValue, descriptionField, descriptionValue);
+        
+        // Test sending data with ISO-8859-1 encoding
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "ISO-8859-1";
+        titleValue = "mytitle\uc385";
+        descriptionValue = "mydescription\uc385";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        setupFormData(sampler, false, titleField, titleValue, 
descriptionField, descriptionValue);
+        res = executeSampler(sampler);
+        sampler.setRunningVersion(true);
+        executedUrl = sampler.getUrl();
+        sampler.setRunningVersion(false);
+        checkGetRequest_Parameters(sampler, res, contentEncoding, executedUrl, 
titleField, titleValue, descriptionField, descriptionValue);
+
+        // Test sending data with UTF-8 encoding
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "UTF-8";
+        titleValue = "mytitle\u0153\u20a1\u0115\u00c5";
+        descriptionValue = "mydescription\u0153\u20a1\u0115\u00c5";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        setupFormData(sampler, false, titleField, titleValue, 
descriptionField, descriptionValue);
+        res = executeSampler(sampler);
+        sampler.setRunningVersion(true);
+        executedUrl = sampler.getUrl();
+        sampler.setRunningVersion(false);
+        checkGetRequest_Parameters(sampler, res, contentEncoding, executedUrl, 
titleField, titleValue, descriptionField, descriptionValue);
+        
+        // Test sending data as UTF-8, with values that changes when urlencoded
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "UTF-8";
+        titleValue = "mytitle\u0153+\u20a1 \u0115&yes\u00c5";
+        descriptionValue = "mydescription \u0153 \u20a1 \u0115 \u00c5";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        setupFormData(sampler, false, titleField, titleValue, 
descriptionField, descriptionValue);
+        res = executeSampler(sampler);
+        sampler.setRunningVersion(true);
+        executedUrl = sampler.getUrl();
+        sampler.setRunningVersion(false);
+        checkGetRequest_Parameters(sampler, res, contentEncoding, executedUrl, 
titleField, titleValue, descriptionField, descriptionValue);
+
+        // Test sending data as UTF-8, where user defined variables are used
+        // to set the value for form data
+        JMeterUtils.setLocale(Locale.ENGLISH);
+        TestPlan testPlan = new TestPlan();
+        JMeterVariables vars = new JMeterVariables();
+        vars.put("title_prefix", "a test\u00c5");
+        vars.put("description_suffix", "the_end");
+        JMeterContextService.getContext().setVariables(vars);
+        JMeterContextService.getContext().setSamplingStarted(true);
+        ValueReplacer replacer = new ValueReplacer();
+        replacer.setUserDefinedVariables(testPlan.getUserDefinedVariables());
+        
+        sampler = createHttpSampler(samplerType);
+        contentEncoding = "UTF-8";
+        titleValue = "${title_prefix}mytitle\u0153\u20a1\u0115\u00c5";
+        descriptionValue = 
"mydescription\u0153\u20a1\u0115\u00c5${description_suffix}";
+        setupUrl(sampler, contentEncoding);
+        sampler.setMethod(HTTPSamplerBase.GET);
+        setupFormData(sampler, false, titleField, titleValue, 
descriptionField, descriptionValue);
+        // Replace the variables in the sampler
+        replacer.replaceValues(sampler);
+        res = executeSampler(sampler);
+        String expectedTitleValue = "a 
test\u00c5mytitle\u0153\u20a1\u0115\u00c5";
+        String expectedDescriptionValue = 
"mydescription\u0153\u20a1\u0115\u00c5the_end";
+        sampler.setRunningVersion(true);
+        executedUrl = sampler.getUrl();
+        sampler.setRunningVersion(false);
+        checkGetRequest_Parameters(sampler, res, contentEncoding, executedUrl, 
titleField, expectedTitleValue, descriptionField, expectedDescriptionValue);
+    }
+    
     private HTTPSampleResult executeSampler(HTTPSamplerBase sampler) {
         sampler.setRunningVersion(true);
         sampler.threadStarted();
@@ -332,6 +468,9 @@
             // Skip the blank line with crlf dividing headers and body
             bodySent = 
dataSentToMirrorServer.substring(posDividerHeadersAndBody+2);
         }
+        else {
+            fail("No header and body section found");
+        }
         // Check response headers
         assertTrue(isInRequestHeaders(headersSent, 
HTTPSamplerBase.HEADER_CONTENT_TYPE, 
HTTPSamplerBase.APPLICATION_X_WWW_FORM_URLENCODED));
         assertTrue(
@@ -344,6 +483,8 @@
         // Check post body which was sent to the mirror server, and
         // sent back by the mirror server
         checkArraysHaveSameContent(expectedPostBody.getBytes(contentEncoding), 
bodySent.getBytes(contentEncoding));
+        // Check method, path and query sent
+        checkMethodPathQuery(headersSent, sampler.getMethod(), 
sampler.getPath(), null);
     }
 
     private void checkPostRequestFormMultipart(
@@ -385,6 +526,9 @@
             // Skip the blank line with crlf dividing headers and body
             bodySent = 
dataSentToMirrorServer.substring(posDividerHeadersAndBody+2);
         }
+        else {
+            fail("No header and body section found");
+        }
         // Check response headers
         assertTrue(isInRequestHeaders(headersSent, 
HTTPSamplerBase.HEADER_CONTENT_TYPE, "multipart/form-data" + "; boundary=" + 
boundaryString));
         assertTrue(
@@ -397,6 +541,8 @@
         // Check post body which was sent to the mirror server, and
         // sent back by the mirror server
         checkArraysHaveSameContent(expectedPostBody, 
bodySent.getBytes(contentEncoding));
+        // Check method, path and query sent
+        checkMethodPathQuery(headersSent, sampler.getMethod(), 
sampler.getPath(), null);
     }
     
     private void checkPostRequestFileUpload(
@@ -443,6 +589,9 @@
             // Skip the blank line with crlf dividing headers and body
             bodySent = 
dataSentToMirrorServer.substring(posDividerHeadersAndBody+2);
         }
+        else {
+            fail("No header and body section found");
+        }
         // Check response headers
         assertTrue(isInRequestHeaders(headersSent, 
HTTPSamplerBase.HEADER_CONTENT_TYPE, "multipart/form-data" + "; boundary=" + 
boundaryString));
         assertTrue(
@@ -457,7 +606,123 @@
         // We cannot check this merely by getting the body in the 
contentEncoding,
         // since the actual file content is sent binary, without being encoded
         //checkArraysHaveSameContent(expectedPostBody, 
bodySent.getBytes(contentEncoding));
-    }    
+        // Check method, path and query sent
+        checkMethodPathQuery(headersSent, sampler.getMethod(), 
sampler.getPath(), null);
+    }
+
+    private void checkGetRequest(
+            HTTPSamplerBase sampler,
+            HTTPSampleResult res
+            ) throws IOException {
+        // Check URL
+        assertEquals(sampler.getUrl(), res.getURL());
+        // Check method
+        assertEquals(sampler.getMethod(), res.getHTTPMethod());
+        // Check that the query string is empty
+        assertEquals(0, res.getQueryString().length());
+
+        // Find the data sent to the mirror server, which the mirror server is 
sending back to us
+        String dataSentToMirrorServer = new String(res.getResponseData(), 
EncoderCache.URL_ARGUMENT_ENCODING);
+        int posDividerHeadersAndBody = 
getPositionOfBody(dataSentToMirrorServer);
+        String headersSent = null;
+        String bodySent = null;
+        if(posDividerHeadersAndBody >= 0) {
+            headersSent = dataSentToMirrorServer.substring(0, 
posDividerHeadersAndBody);
+            // Skip the blank line with crlf dividing headers and body
+            bodySent = 
dataSentToMirrorServer.substring(posDividerHeadersAndBody+2);
+        }
+        else {
+            fail("No header and body section found");
+        }
+        // No body should have been sent
+        assertEquals(bodySent.length(), 0);
+        // Check method, path and query sent
+        checkMethodPathQuery(headersSent, sampler.getMethod(), 
sampler.getPath(), null);
+    }
+    
+    private void checkGetRequest_Parameters(
+            HTTPSamplerBase sampler,
+            HTTPSampleResult res,
+            String contentEncoding,
+            URL executedUrl,
+            String titleField,
+            String titleValue,
+            String descriptionField,
+            String descriptionValue) throws IOException {
+        if(contentEncoding == null || contentEncoding.length() == 0) {
+            contentEncoding = EncoderCache.URL_ARGUMENT_ENCODING;
+        }
+        // Check URL
+        assertEquals(executedUrl, res.getURL());
+        // Check method
+        assertEquals(sampler.getMethod(), res.getHTTPMethod());
+        // Cannot check the query string of the result, because the mirror 
server
+        // replies without including query string in URL
+        String expectedQueryString = titleField + "=" + 
URLEncoder.encode(titleValue, contentEncoding) + "&" + descriptionField + "=" + 
URLEncoder.encode(descriptionValue, contentEncoding);
+
+        // Find the data sent to the mirror server, which the mirror server is 
sending back to us
+        String dataSentToMirrorServer = new String(res.getResponseData(), 
EncoderCache.URL_ARGUMENT_ENCODING);
+        int posDividerHeadersAndBody = 
getPositionOfBody(dataSentToMirrorServer);
+        String headersSent = null;
+        String bodySent = null;
+        if(posDividerHeadersAndBody >= 0) {
+            headersSent = dataSentToMirrorServer.substring(0, 
posDividerHeadersAndBody);
+            // Skip the blank line with crlf dividing headers and body
+            bodySent = 
dataSentToMirrorServer.substring(posDividerHeadersAndBody+2);
+        }
+        else {
+            fail("No header and body section found");
+        }
+        // No body should have been sent
+        assertEquals(bodySent.length(), 0);
+        // Check method, path and query sent
+        checkMethodPathQuery(headersSent, sampler.getMethod(), 
sampler.getPath(), expectedQueryString);
+    }
+    
+    private void checkMethodPathQuery(
+            String headersSent,
+            String expectedMethod,
+            String expectedPath,
+            String expectedQueryString)
+            throws IOException {
+        // Check the Request URI sent to the mirror server, and
+        // sent back by the mirror server
+        int indexFirstSpace = headersSent.indexOf(" ");
+        int indexSecondSpace = headersSent.indexOf(" ", headersSent.length() > 
indexFirstSpace ? indexFirstSpace + 1 : indexFirstSpace);
+        if(indexFirstSpace <= 0 && indexSecondSpace <= 0 || indexFirstSpace == 
indexSecondSpace) {
+            fail("Could not find method and URI sent");
+        }
+        String methodSent = headersSent.substring(0, indexFirstSpace);
+        assertEquals(expectedMethod, methodSent);
+        String uriSent = headersSent.substring(indexFirstSpace + 1, 
indexSecondSpace);
+        int indexQueryStart = uriSent.indexOf("?");
+        if(expectedQueryString != null && expectedQueryString.length() > 0) {
+            // We should have a query string part
+            if(indexQueryStart <= 0 || (indexQueryStart == uriSent.length() - 
1)) {
+                fail("Could not find query string in URI");
+            }
+        }
+        else {
+            if(indexQueryStart > 0) {
+                // We should not have a query string part
+                fail("Query string present in URI");
+            }
+            else {
+                indexQueryStart = uriSent.length();
+            }
+        }
+        // Check path
+        String pathSent = uriSent.substring(0, indexQueryStart);
+        assertEquals(expectedPath, pathSent);
+        // Check query
+        if(expectedQueryString != null && expectedQueryString.length() > 0) {
+            String queryStringSent = uriSent.substring(indexQueryStart + 1);
+            // Is it only the parameter values which are encoded in the 
specified
+            // content encoding, the rest of the query is encoded in UTF-8
+            // Therefore we compare the whole query using UTF-8
+            
checkArraysHaveSameContent(expectedQueryString.getBytes(EncoderCache.URL_ARGUMENT_ENCODING),
 queryStringSent.getBytes(EncoderCache.URL_ARGUMENT_ENCODING));
+        }
+    }
 
     private boolean isInRequestHeaders(String requestHeaders, String 
headerName, String headerValue) {
         return checkRegularExpression(requestHeaders, headerName + ": " + 
headerValue);

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=528800&r1=528799&r2=528800
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sat Apr 14 05:50:04 2007
@@ -203,6 +203,7 @@
 <li>Bug 42022 - HTTPSampler does not allow multiple headers of same name</li>
 <li>Bug 42019 - Content type not stored in redirected HTTP request with 
subresults</li>
 <li>Bug 27780 - (patch 19936) create multipart/form-data HTTP request without 
uploading file</li>
+<li>Bug 42098 - Use specified encoding for parameter values in HTTP GET</li>
 </ul>
 
 <h3>Version 2.2</h3>



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

Reply via email to