Skip to content

Commit 030299e

Browse files
authored
KTOR-4766 Add defaultRequest plugin extension (#4924)
1 parent ac3e4db commit 030299e

4 files changed

Lines changed: 66 additions & 3 deletions

File tree

ktor-client/ktor-client-cio/jvm/test/io/ktor/client/engine/cio/UnixSocketTest.kt

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package io.ktor.client.engine.cio
66

77
import io.ktor.client.HttpClient
8+
import io.ktor.client.plugins.defaultRequest
89
import io.ktor.client.request.get
910
import io.ktor.client.request.unixSocket
1011
import io.ktor.client.statement.bodyAsText
@@ -13,7 +14,6 @@ import io.ktor.server.application.*
1314
import io.ktor.server.cio.*
1415
import io.ktor.server.cio.CIO
1516
import io.ktor.server.engine.*
16-
import io.ktor.server.request.*
1717
import io.ktor.server.response.*
1818
import io.ktor.server.routing.*
1919
import kotlinx.coroutines.delay
@@ -45,7 +45,7 @@ class UnixSocketTest {
4545

4646
val client = HttpClient(io.ktor.client.engine.cio.CIO)
4747
try {
48-
server.startSuspend(wait = false)
48+
server.start(wait = false)
4949
delay(1000)
5050

5151
val response = client.get("http://localhost/") {
@@ -55,7 +55,55 @@ class UnixSocketTest {
5555
assertEquals("Hello, Unix socket world!", response.bodyAsText())
5656
} finally {
5757
client.close()
58-
server.stop()
58+
server.stop(0, 0)
59+
}
60+
}
61+
62+
@Test
63+
fun testUnixSocketClientWithDefaultRequest() = runBlocking {
64+
if (!UnixSocketAddress.isSupported()) return@runBlocking
65+
66+
val server = embeddedServer(
67+
CIO,
68+
serverConfig {
69+
module {
70+
routing {
71+
get("/test") {
72+
call.respondText("Hello from default Unix socket!")
73+
}
74+
get("/custom") {
75+
call.respondText("Hello from custom endpoint!")
76+
}
77+
}
78+
}
79+
},
80+
configure = {
81+
unixConnector("/tmp/test-unix-socket-default.sock")
82+
}
83+
)
84+
85+
val client = HttpClient(io.ktor.client.engine.cio.CIO) {
86+
defaultRequest {
87+
unixSocket("/tmp/test-unix-socket-default.sock/")
88+
}
89+
}
90+
91+
try {
92+
server.start(wait = false)
93+
delay(1000)
94+
95+
// Test that the default Unix socket is used
96+
val response1 = client.get("http://localhost/test")
97+
assertEquals(200, response1.status.value)
98+
assertEquals("Hello from default Unix socket!", response1.bodyAsText())
99+
100+
// Test another endpoint with the same default Unix socket
101+
val response2 = client.get("http://localhost/custom")
102+
assertEquals(200, response2.status.value)
103+
assertEquals("Hello from custom endpoint!", response2.bodyAsText())
104+
} finally {
105+
client.close()
106+
server.stop(0, 0)
59107
}
60108
}
61109
}

ktor-client/ktor-client-core/api/ktor-client-core.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,10 @@ public final class io/ktor/client/plugins/DefaultRequest$DefaultRequestBuilder :
263263
public final fun getPort ()I
264264
public final fun getUrl ()Lio/ktor/http/URLBuilder;
265265
public final fun setAttributes (Lkotlin/jvm/functions/Function1;)V
266+
public final fun setCapability (Lio/ktor/client/engine/HttpClientEngineCapability;Ljava/lang/Object;)V
266267
public final fun setHost (Ljava/lang/String;)V
267268
public final fun setPort (I)V
269+
public final fun unixSocket (Ljava/lang/String;)V
268270
public final fun url (Ljava/lang/String;)V
269271
public final fun url (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
270272
public final fun url (Lkotlin/jvm/functions/Function1;)V

ktor-client/ktor-client-core/api/ktor-client-core.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,9 @@ final class io.ktor.client.plugins/DefaultRequest { // io.ktor.client.plugins/De
615615
final fun <get-port>(): kotlin/Int // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.port.<get-port>|<get-port>(){}[0]
616616
final fun <set-port>(kotlin/Int) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.port.<set-port>|<set-port>(kotlin.Int){}[0]
617617

618+
final fun <#A2: kotlin/Any> setCapability(io.ktor.client.engine/HttpClientEngineCapability<#A2>, #A2) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.setCapability|setCapability(io.ktor.client.engine.HttpClientEngineCapability<0:0>;0:0){0§<kotlin.Any>}[0]
618619
final fun setAttributes(kotlin/Function1<io.ktor.util/Attributes, kotlin/Unit>) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.setAttributes|setAttributes(kotlin.Function1<io.ktor.util.Attributes,kotlin.Unit>){}[0]
620+
final fun unixSocket(kotlin/String) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.unixSocket|unixSocket(kotlin.String){}[0]
619621
final fun url(kotlin/Function1<io.ktor.http/URLBuilder, kotlin/Unit>) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.url|url(kotlin.Function1<io.ktor.http.URLBuilder,kotlin.Unit>){}[0]
620622
final fun url(kotlin/String) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.url|url(kotlin.String){}[0]
621623
final fun url(kotlin/String? = ..., kotlin/String? = ..., kotlin/Int? = ..., kotlin/String? = ..., kotlin/Function1<io.ktor.http/URLBuilder, kotlin/Unit> = ...) // io.ktor.client.plugins/DefaultRequest.DefaultRequestBuilder.url|url(kotlin.String?;kotlin.String?;kotlin.Int?;kotlin.String?;kotlin.Function1<io.ktor.http.URLBuilder,kotlin.Unit>){}[0]

ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/DefaultRequest.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package io.ktor.client.plugins
66

77
import io.ktor.client.*
8+
import io.ktor.client.engine.*
89
import io.ktor.client.request.*
910
import io.ktor.http.*
1011
import io.ktor.util.*
@@ -231,6 +232,16 @@ public class DefaultRequest private constructor(private val block: DefaultReques
231232
public fun setAttributes(block: Attributes.() -> Unit) {
232233
attributes.apply(block)
233234
}
235+
236+
public fun <T : Any> setCapability(key: HttpClientEngineCapability<T>, capability: T) {
237+
val capabilities = attributes.computeIfAbsent(ENGINE_CAPABILITIES_KEY) { mutableMapOf() }
238+
capabilities[key] = capability
239+
}
240+
241+
@OptIn(InternalAPI::class)
242+
public fun unixSocket(path: String) {
243+
setCapability(UnixSocketCapability, UnixSocketSettings(path))
244+
}
234245
}
235246
}
236247

0 commit comments

Comments
 (0)