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]
