Author: milamber
Date: Sun Apr  3 23:13:09 2011
New Revision: 1088435

URL: http://svn.apache.org/viewvc?rev=1088435&view=rev
Log:
Bug 50170 - Bytes reported by http sampler is after GUnZip
Add an optional property to allow change the method to get response size.

Modified:
    jakarta/jmeter/trunk/bin/jmeter.properties
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
    
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
    jakarta/jmeter/trunk/xdocs/changes.xml
    jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml

Modified: jakarta/jmeter/trunk/bin/jmeter.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/bin/jmeter.properties?rev=1088435&r1=1088434&r2=1088435&view=diff
==============================================================================
--- jakarta/jmeter/trunk/bin/jmeter.properties (original)
+++ jakarta/jmeter/trunk/bin/jmeter.properties Sun Apr  3 23:13:09 2011
@@ -243,6 +243,16 @@ log_level.jorphan=INFO
 #log_config=logkit.xml
 
 #---------------------------------------------------------------------------
+# HTTP common configuration
+#---------------------------------------------------------------------------
+
+# Response size calculate method
+# default: only data (uncompress size if deflate)
+#http.getbytes.type=default
+#http.getbytes.type=calculate_headers_size+default
+#http.getbytes.type=calculate_headers_size+content-length_value
+
+#---------------------------------------------------------------------------
 # HTTP Java configuration
 #---------------------------------------------------------------------------
 

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java?rev=1088435&r1=1088434&r2=1088435&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Sun 
Apr  3 23:13:09 2011
@@ -36,10 +36,12 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map.Entry;
 import java.util.MissingResourceException;
 import java.util.Properties;
 import java.util.Random;
 import java.util.ResourceBundle;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -73,6 +75,8 @@ public class JMeterUtils implements Unit
             new Perl5Compiler());
 
     private static final String EXPERT_MODE_PROPERTY = "jmeter.expertMode"; // 
$NON-NLS-1$
+    
+    private static final String HEADER_CONTENT_LENGTH = "Content-Length"; // 
$NON-NLS-1$
 
     private static final String ENGLISH_LANGUAGE = 
Locale.ENGLISH.getLanguage();
 
@@ -1237,4 +1241,19 @@ public class JMeterUtils implements Unit
         return linkedHeaders;
     }
     
+    /**
+     * Get Content-Length value from headers
+     * @param headers
+     * @return Content-Length value
+     */
+    public static int getHeaderContentLength(String headers) {
+        LinkedHashMap<String, String> lhm = JMeterUtils.parseHeaders(headers);
+        Set<Entry<String, String>> keySet = lhm.entrySet();
+        for (Entry<String, String> entry : keySet) {
+            if (entry.getKey().equals(HEADER_CONTENT_LENGTH)) {
+                return Integer.parseInt(entry.getValue());
+            }
+        }
+        return 0; // Content-Length not found
+    }
 }

Modified: 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java?rev=1088435&r1=1088434&r2=1088435&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
 (original)
+++ 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
 Sun Apr  3 23:13:09 2011
@@ -23,6 +23,7 @@ import java.net.URL;
 
 import org.apache.jmeter.protocol.http.util.HTTPConstants;
 import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
 
 /**
  * This is a specialisation of the SampleResult class for the HTTP protocol.
@@ -31,6 +32,15 @@ import org.apache.jmeter.samplers.Sample
 public class HTTPSampleResult extends SampleResult {
 
     private static final long serialVersionUID = 240L;
+    
+    private static final String GETBYTES_TYPE_DEFAULT = "default";
+    
+    private static final String GETBYTES_TYPE_HEAD_CONTENTLENGTH = 
"calculate_headers_size+content-length_value";
+    
+    private static final String GETBYTES_TYPE_HEAD_DEFAULT = 
"calculate_headers_size+default";
+
+    private static final String GETBYTES_TYPE = 
+        JMeterUtils.getPropDefault("http.getbytes.type", 
GETBYTES_TYPE_DEFAULT); // $NON-NLS-1$
 
     private String cookies = ""; // never null
 
@@ -215,4 +225,36 @@ public class HTTPSampleResult extends Sa
         setResponseCode(HTTP_NO_CONTENT_CODE);
         setResponseMessage(HTTP_NO_CONTENT_MSG);
     }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.jmeter.samplers.SampleResult#getBytes()
+     */
+    @Override
+    public int getBytes() {
+        if (GETBYTES_TYPE.equals(GETBYTES_TYPE_HEAD_CONTENTLENGTH)) {
+            return calculateHeadersSize()
+                    + 
JMeterUtils.getHeaderContentLength(this.getResponseHeaders());
+        }
+        if (GETBYTES_TYPE.equals(GETBYTES_TYPE_HEAD_DEFAULT)) {
+            return calculateHeadersSize() + super.getBytes();
+        }
+        return super.getBytes(); // Default
+    }
+
+    /**
+     * Calculate response headers size
+     * 
+     * @return the size response headers (in bytes)
+     */
+    private int calculateHeadersSize() {
+        int headersSize = 0;
+        headersSize += 9 // Http proto length + 1 space (i.e.: "HTTP/1.x ")
+                + String.valueOf(this.getResponseCode()).length()
+                + this.getResponseMessage().length();
+        headersSize += this.getResponseHeaders().length();
+        return headersSize;
+    }
+    
 }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1088435&r1=1088434&r2=1088435&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sun Apr  3 23:13:09 2011
@@ -150,6 +150,7 @@ Fixed RMI startup to provide location of
 <li>Allow HTTP implementation to be selected at run-time</li>
 <li>Bug 50684 - Optionally disable Content-Type and Transfer-Encoding in 
Multipart POST</li>
 <li>Bug 50943 - Allowing concurrent downloads of embedded resources in html 
page</li>
+<li>Bug 50170 - Bytes reported by http sampler is after GUnZip<br></br>Add an 
optional property to allow change the method to get response size</li>
 </ul>
 
 <h3>Other samplers</h3>

Modified: jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1088435&r1=1088434&r2=1088435&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml Sun Apr  3 
23:13:09 2011
@@ -333,6 +333,16 @@ The HttpClient version of the sampler su
 #httpclient.socket.http.cps=0
 #httpclient.socket.https.cps=0
 </pre>
+<p><b>Method to calculate Response size</b><br></br>
+An optional property to allow change the method to get response size:<br></br>
+<ul><li>Default behavior: Size in bytes is the response data length (without 
response headers)
+<pre>http.getbytes.type=default</pre></li>
+<li>Response headers length and default (response data length)
+<pre>http.getbytes.type=calculate_headers_size+default</pre></li>
+<li>Response headers length and value of "Content-length" header (generally 
provide by web server)<br></br>
+Useful when web server uses a deflate/gzip method to compress response data
+<pre>http.getbytes.type=calculate_headers_size+content-length_value</pre></li></ul>
+</p>
 <links>
         <link href="test_plan.html#assertions">Assertion</link>
         <link href="build-web-test-plan.html">Building a Web Test Plan</link>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to