[ https://issues.apache.org/jira/browse/HTTPCLIENT-2301?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17770084#comment-17770084 ]
Oleg Kalnichevski commented on HTTPCLIENT-2301: ----------------------------------------------- > BasicHttpClientConnectionManager returns response of previous requests This makes no sense. Connection managers do not return any response messages. They merely manage connections. All three request URIs have the same URI authority. All requests can be served using the same physical connection. I suspect there is something wrong with the way you mock the backend. Please provide a test case that does not require a mock library. Oleg > 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. > Priority: Major > Attachments: test.kt > > > 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