Author: sebb
Date: Fri Aug 30 00:00:15 2013
New Revision: 1518861

URL: http://svn.apache.org/r1518861
Log:
Proxy should deliver failed requests to any configured Listeners
Bugzilla Id: 55506

Modified:
    
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Proxy.java
    jmeter/trunk/xdocs/changes.xml

Modified: 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Proxy.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Proxy.java?rev=1518861&r1=1518860&r2=1518861&view=diff
==============================================================================
--- 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Proxy.java 
(original)
+++ 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Proxy.java 
Fri Aug 30 00:00:15 2013
@@ -20,6 +20,7 @@ package org.apache.jmeter.protocol.http.
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,6 +28,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.PrintStream;
 import java.net.Socket;
 import java.net.URL;
 import java.net.UnknownHostException;
@@ -206,7 +208,15 @@ public class Proxy extends Thread {
                     throw new JMeterException(); // hack to skip processing
                 }
                 // Re-parse (now it's the http request over SSL)
-                ba = request.parse(new 
BufferedInputStream(clientSocket.getInputStream()));
+                try {
+                    ba = request.parse(new 
BufferedInputStream(clientSocket.getInputStream()));
+                } catch (IOException ioe) { // most likely this is because of 
a certificate error
+                    final String url = param.length>0 ?  " for '"+ param[0] 
+"'" : "";
+                    log.warn(port + "Problem with SSL certificate"+url+"? 
Ensure browser is set to accept the JMeter proxy cert: " + ioe.getMessage());
+                    // won't work: 
writeErrorToClient(HttpReplyHdr.formInternalError());
+                    result = generateErrorResult(result, request, ioe, 
"\n**ensure browser is set to accept the JMeter proxy certificate**"); // 
Generate result (if nec.) and populate it
+                    throw new JMeterException(); // hack to skip processing
+                }
                 if (log.isDebugEnabled()) {
                     log.debug(port + "Reparse: " + new String(ba));
                 }
@@ -244,26 +254,17 @@ public class Proxy extends Thread {
         } catch (UnknownHostException uhe) {
             log.warn(port + "Server Not Found.", uhe);
             writeErrorToClient(HttpReplyHdr.formServerNotFound());
-            result = generateErrorResult(result, uhe); // Generate result (if 
nec.) and populate it
+            result = generateErrorResult(result, request, uhe); // Generate 
result (if nec.) and populate it
         } catch (IllegalArgumentException e) {
             log.error(port + "Not implemented (probably used https)", e);
             writeErrorToClient(HttpReplyHdr.formNotImplemented("Probably used 
https instead of http. " +
                     "To record https requests, see " +
                     "<a 
href=\"http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Proxy_Server\";>HTTP
 Proxy Server documentation</a>"));
-            result = generateErrorResult(result, e); // Generate result (if 
nec.) and populate it
-        } catch (IOException ioe) {
-            final String url = param.length>0 ?  " for '"+ param[0] +"'" : "";
-            log.error(port + "Problem with SSL certificate"+url+"? Ensure 
browser is set to accept the JMeter proxy cert:", ioe);
-            // won't work: 
writeErrorToClient(HttpReplyHdr.formInternalError());
-            if (result == null) {
-                result = new SampleResult();
-                result.setSampleLabel("Sample failed");
-            }
-            result.setResponseMessage(ioe.getMessage()+ "\n**ensure browser is 
set to accept the JMeter proxy certificate**");
+            result = generateErrorResult(result, request, e); // Generate 
result (if nec.) and populate it
         } catch (Exception e) {
             log.error(port + "Exception when processing sample", e);
             writeErrorToClient(HttpReplyHdr.formInternalError());
-            result = generateErrorResult(result, e); // Generate result (if 
nec.) and populate it
+            result = generateErrorResult(result, request, e); // Generate 
result (if nec.) and populate it
         } finally {
             if (log.isDebugEnabled()) {
                 if(sampler != null) {
@@ -281,7 +282,8 @@ public class Proxy extends Thread {
                     headers.removeHeaderNamed(hdr);
                 }
             }
-            if(sampler != null) {
+            if(result != null) // sampler is allowed to be null
+            {
                 target.deliverSampler(sampler, new TestElement[] { 
captureHttpHeaders ? headers : null }, result);
             }
             try {
@@ -397,12 +399,21 @@ public class Proxy extends Thread {
         return in;
     }
 
-    private static SampleResult generateErrorResult(SampleResult result, 
Exception e) {
+    private SampleResult generateErrorResult(SampleResult result, 
HttpRequestHdr request, Exception e) {
+        return generateErrorResult(result, request, e, "");
+    }
+
+    private static SampleResult generateErrorResult(SampleResult result, 
HttpRequestHdr request, Exception e, String msg) {
         if (result == null) {
             result = new SampleResult();
-            result.setSampleLabel("Sample failed");
+            ByteArrayOutputStream text = new ByteArrayOutputStream(200);
+            e.printStackTrace(new PrintStream(text));
+            result.setResponseData(text.toByteArray());
+            result.setSamplerData(request.getFirstLine());
+            result.setSampleLabel(request.getUrl());
         }
-        result.setResponseMessage(e.getMessage());
+        result.setSuccessful(false);
+        result.setResponseMessage(e.getMessage()+msg);
         return result;
     }
 

Modified: jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1518861&r1=1518860&r2=1518861&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Fri Aug 30 00:00:15 2013
@@ -260,6 +260,7 @@ Previously the default was 1, which coul
 <li><bugzilla>55455</bugzilla> - HTTPS with HTTPClient4 ignores cps 
setting</li>
 <li><bugzilla>55502</bugzilla> - Proxy generates empty http:/ entries when 
recording</li>
 <li><bugzilla>55504</bugzilla> - Proxy incorrectly issues CONNECT requests 
when browser prompts for certificate override</li>
+<li><bugzilla>55506</bugzilla> - Proxy should deliver failed requests to any 
configured Listeners</li>
 </ul>
 
 <h3>Other Samplers</h3>


Reply via email to