On Tue, 2018-12-18 at 14:13 +0100, Philippe Mouawad wrote:
> Hello,
> We face a bug in JMeter when :
> 
>    - using proxy
>    - and using POST method which leads to a 404
>    - The first request leads as expected to a 404 results
>    - BUT (bug is here) the second one triggers a
>    org.apache.http.NoHttpResponseException: jmeter.apache.org:80
> failed to
>    respond
> 
> Bug id:
> https://bz.apache.org/bugzilla/show_bug.cgi?id=63015
> 
> To reproduce it in Junit below , I just added:
> 
>    - EntityUtils.consumeQuietly(response.getEntity());
> 
> This call  consumes data and at the end will call
> ConnHolder#releaseConnection(true).
> While if missing, ConnHolder#releaseConnection(false) would be called
> closing the Connection so since we start with a new one, it's ok.
> 
> In JMeter , since we consume data we end up calling
> eofWatcher.eofDetected(toCheckStream);which calls
> ResponseEntityProxy#eofDetected which calls
> ConnHolder#releaseConnection(true);
> 
> 
> 
> Find below JUnit:
> 

JUnit passes for me. Squid proxy docker image can be found here:

https://github.com/apache/httpcomponents-client/tree/master/httpclient5-testing/docker/squid

Oleg

>     @Test
>     public void bugWithPostAndProxy() throws Exception {
>         PoolingHttpClientConnectionManager pHCCM = new
> PoolingHttpClientConnectionManager(2000, TimeUnit.MILLISECONDS);
>         pHCCM.setDefaultMaxPerRoute(5);
>         pHCCM.setValidateAfterInactivity(1700);
>         HttpHost proxy = new HttpHost("localhost", 8888, "http");
> 
>         RequestConfig config =
> RequestConfig.custom().setProxy(proxy).build();
> 
>         try (CloseableHttpClient httpclient = HttpClients.custom().
>                 setConnectionManager(pHCCM).
>                 setDefaultSocketConfig(SocketConfig.DEFAULT).
>                 setConnectionTimeToLive(2000, TimeUnit.MILLISECONDS).
>                 setRetryHandler(new
> StandardHttpRequestRetryHandler(0,
> false)).
> 
> setConnectionReuseStrategy(DefaultClientConnectionReuseStrategy.INSTA
> NCE).
>                 build()) {
>             HttpHost target = new HttpHost("jmeter.apache.org");
>             HttpPost request = new HttpPost("/404.html");
>             request.addHeader("Content-Type",
> "application/x-www-form-urlencoded; charset=UTF-8");
>             request.addHeader("Connection", "keep-alive");
>             request.setConfig(config);
>             HttpContext httpContext = new BasicHttpContext();
>             httpContext.setAttribute(HttpClientContext.USER_TOKEN,
> "Thread
> Group1-1");
>             try (CloseableHttpResponse response =
> httpclient.execute(target, request, httpContext)) {
>                 logger.info("Headers:{}",
> response.getEntity().toString());
>                 EntityUtils.consumeQuietly(response.getEntity());
>                 logger.info("Headers:{}", response.getAllHeaders());
>             }
>             request = new HttpPost("/404.html");
>             request.addHeader("Connection", "keep-alive");
>             try (CloseableHttpResponse response =
> httpclient.execute(target, request, httpContext)) {
>                 EntityUtils.consumeQuietly(response.getEntity());
>                 logger.info("Headers:{}",
> response.getEntity().toString());
>                 logger.info("Headers:{}", response.getAllHeaders());
>             }
>         }
>     }
> 
> 
> 
> Stacktrace:
> org.apache.http.NoHttpResponseException: jmeter.apache.org:80 failed
> to
> respond
>     at
> org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(Default
> HttpResponseParser.java:141)
>     at
> org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(Default
> HttpResponseParser.java:56)
>     at
> org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessagePa
> rser.java:259)
>     at
> org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHead
> er(DefaultBHttpClientConnection.java:163)
>     at
> org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy
> .java:165)
>     at
> org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRe
> questExecutor.java:273)
>     at
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecu
> tor.java:125)
>     at
> org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.
> java:272)
>     at
> org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java
> :185)
>     at
> org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
>     at
> org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java
> :110)
>     at
> org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttp
> Client.java:185)
>     at
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttp
> Client.java:72)
>     at
> org.apache.jmeter.protocol.http.proxy.RequestBug.bugWithPostAndProxy(
> RequestBug.java:98)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
> java:62)
>     at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
> sorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:498)
>     at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(Framework
> Method.java:50)
>     at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCal
> lable.java:12)
>     at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMe
> thod.java:47)
>     at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMet
> hod.java:17)
>     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
>     at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
> ner.java:78)
>     at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
> ner.java:57)
>     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
>     at
> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
>     at
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
>     at
> org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
>     at
> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
>     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
>     at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4
> TestReference.java:86)
>     at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution
> .java:38)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
> eTestRunner.java:459)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
> eTestRunner.java:678)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTest
> Runner.java:382)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTes
> tRunner.java:192)


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

Reply via email to