[ https://issues.apache.org/jira/browse/HTTPCLIENT-2301?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17796141#comment-17796141 ]
ASF subversion and git services commented on HTTPCLIENT-2301: ------------------------------------------------------------- Commit 7724432894209f95dd70708de478465b9fac5e6f in httpcomponents-client's branch refs/heads/master from Arturo Bernal [ https://gitbox.apache.org/repos/asf?p=httpcomponents-client.git;h=772443289 ] HTTPCLIENT-2301. Refactor release method to use local conn variable. This commit updates the release method to use the local conn variable from internalEndpoint.detach() for accurate state management and resource cleanup, addressing the issue HTTPCLIENT-2301. (#502) > BasicHttpClientConnectionManager returns response of previous requests > ---------------------------------------------------------------------- > > Key: HTTPCLIENT-2301 > URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2301 > Project: HttpComponents HttpClient > Issue Type: Bug > Components: HttpClient (classic) > Affects Versions: 5.2.1, 5.3-alpha1 > Environment: JAVA 18 > kotlin 1.7.22 > Ubuntu 22.04 x64 > Reporter: Pierre N. > Assignee: Arturo Bernal > Priority: Minor > Labels: volunteers-wanted > Fix For: 5.4-alpha1 > > Attachments: test.kt > > Time Spent: 1.5h > Remaining Estimate: 0h > > BasicHttpClientConnectionManager doesn't handle request timeout correctly and > return the response of a previous request. > The unit test below should output: > {quote} > http://localhost:41751/1 -> 1 > http://localhost:41751/2 -> java.net.SocketTimeoutException: Read timed out > http://localhost:41751/2 -> java.net.SocketTimeoutException: Read timed out > http://localhost:41751/3 -> 3 > http://localhost:41751/3 -> 3 > http://localhost:41751/3 -> 3 > {quote} > But instead it returns: > {quote} > http://localhost:33875/1 -> 1 > http://localhost:33875/2 -> java.net.SocketTimeoutException: Read timed out > http://localhost:33875/2 -> java.net.SocketTimeoutException: Read timed out > http://localhost:33875/3 -> java.net.SocketTimeoutException: Read timed out > http://localhost:33875/3 -> 2 > http://localhost:33875/3 -> 3 > {quote} > As you can see it returns 2 when requesting the uri /3 which returned 3. > Also it timeout on the first request to /3 while it shouldn't. > Replace with PoolingHttpClientConnectionManager() and it works as expected. > Kotlin unit test to reproduce : > {quote} > import com.github.tomakehurst.wiremock.client.WireMock.* > import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo > import com.github.tomakehurst.wiremock.junit5.WireMockTest > import org.apache.hc.client5.http.classic.methods.HttpGet > import org.apache.hc.client5.http.config.RequestConfig > import org.apache.hc.client5.http.impl.classic.CloseableHttpClient > import org.apache.hc.client5.http.impl.classic.HttpClients > import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager > import org.apache.hc.core5.http.io.entity.EntityUtils > import org.apache.hc.core5.util.Timeout > import org.junit.jupiter.api.Test > @WireMockTest > internal class HttpClientRaceConditionDebug { > @Test > fun `debugging z`(wm: WireMockRuntimeInfo) { > stubFor(get(urlEqualTo("/1")).willReturn(aResponse().withBody("1"))) > > stubFor(get(urlEqualTo("/2")).willReturn(aResponse().withFixedDelay(2000).withBody("2"))) > stubFor(get(urlEqualTo("/3")).willReturn(aResponse().withBody("3"))) > val client = HttpClients.custom() > .setConnectionManager(BasicHttpClientConnectionManager()) > // .setConnectionManager(PoolingHttpClientConnectionManager()) > .setDefaultRequestConfig( > RequestConfig.custom() > .setResponseTimeout(Timeout.ofSeconds(1)) > .build() > ) > .build() > client.executeAndLog("${wm.httpBaseUrl}/1") > client.executeAndLog("${wm.httpBaseUrl}/2") > client.executeAndLog("${wm.httpBaseUrl}/2") > client.executeAndLog("${wm.httpBaseUrl}/3") > client.executeAndLog("${wm.httpBaseUrl}/3") > client.executeAndLog("${wm.httpBaseUrl}/3") > } > private fun CloseableHttpClient.executeAndLog(uri: String) { > try { > execute(HttpGet(uri)) { println("$uri -> > ${EntityUtils.toString(it.entity)}") } > } catch (ex: Exception) { > println("$uri -> $ex") > } > } > } > {quote} -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org For additional commands, e-mail: dev-h...@hc.apache.org