diff --git a/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt index 37cf2f0caa..9a7d68dfa9 100644 --- a/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt +++ b/ktor-client/ktor-client-core/js/src/io/ktor/client/engine/js/JsClientEngine.kt @@ -90,6 +90,8 @@ internal class JsClientEngine( val urlString = request.url.toString() val socket: WebSocket = createWebSocket(urlString, request.headers) + val session = JsWebSocketSession(callContext, socket) + try { socket.awaitConnection() } catch (cause: Throwable) { @@ -97,8 +99,6 @@ internal class JsClientEngine( throw cause } - val session = JsWebSocketSession(callContext, socket) - return HttpResponseData( HttpStatusCode.SwitchingProtocols, requestTime, diff --git a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/WebSocketTest.kt b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/WebSocketTest.kt index 5ae39ae2bf..347e7c8fda 100644 --- a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/WebSocketTest.kt +++ b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/WebSocketTest.kt @@ -17,6 +17,7 @@ import io.ktor.utils.io.charsets.* import io.ktor.websocket.* import kotlinx.coroutines.* import kotlin.test.* +import kotlin.time.Duration.Companion.seconds internal val ENGINES_WITHOUT_WS = listOf("Android", "Apache", "Apache5", "Curl", "DarwinLegacy") @@ -322,4 +323,28 @@ class WebSocketTest : ClientLoader() { } } } + + @Test + fun testImmediateReceiveAfterConnect() = clientTests(ENGINES_WITHOUT_WS) { + config { + install(WebSockets) + } + + test { client -> + withTimeout(10_000) { + coroutineScope { + val defs = (1..100).map { + async { + client.webSocket("$TEST_WEBSOCKET_SERVER/websockets/headers") { + val frame = withTimeoutOrNull(1.seconds) { incoming.receive() } + assertNotNull(frame) + assertIs(frame) + } + } + } + defs.awaitAll() + } + } + } + } }