https://kotlinlang.org logo
#ktor
Title
# ktor
p

Paul Woitaschek

02/13/2021, 11:40 AM
Did someone get ktor to work on ios? For me the get call suspends just forever:
Copy code
@Test
fun test() {
  val client = HttpClient()
  runBlocking {
    println("start")
    val result: String = client.get("<https://www.google.com/>")
    println("result=$result")
  }
}
I’m using
Copy code
implementation("io.ktor:ktor-client-ios:1.5.1")
And
Copy code
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2-native-mt
With the
strictly
block applied
m

Michal Klimczak

02/13/2021, 5:50 PM
I have used it successfully for some time. Never in a runBlocking though, but I don't think this should make any difference. But of course println will not work on ios, not sure if you are really use it or it's just an example
p

Paul Woitaschek

02/13/2021, 5:59 PM
No it's no example. And println works fine. Just that it doesn't print the second statement as it's never reached
👍 1
l

louiscad

02/13/2021, 6:22 PM
I guess it's blocking the main loop that is relied on for the callbacks under the hood. Try in real application code in
Dispatchers.Main
without
runBlocking
, I think it'll work.
p

Paul Woitaschek

02/13/2021, 6:26 PM
How would I be able to run this in a test then?
l

louiscad

02/13/2021, 6:28 PM
I'm not sure, but I'd just try to begin with.
m

Michal Klimczak

02/13/2021, 7:19 PM
Ok I only just noticed that it's a test ;)
p

Paul Woitaschek

02/13/2021, 8:41 PM
Apparently there is a
io.ktor:ktor-test-dispatcher:1.5.1
artifact exposing a
testSuspend
function which makes this work 🙂
🙏🏻 1
This leads to even stranger issues 😕
Copy code
start
Invalid connection: com.apple.coresymbolicationd

io.ktor.client.engine.ios.IosHttpRequestException: Exception in http request: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be "<http://www.google.com|www.google.com>" which could put your confidential information at risk." UserInfo={NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, NSErrorPeerCertificateChainKey=(
    "<cert(0x7f98c782aa00) s: www.google.com i: GTS CA 1O1>",
    "<cert(0x7f98c782b200) s: GTS CA 1O1 i: GlobalSign>"
), NSErrorClientCertificateStateKey=0, NSErrorFailingURLKey=<https://www.google.com/>, NSErrorFailingURLStringKey=<https://www.google.com/>, NSUnderlyingError=0x7f98c6d52b60 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f98c6d5caa0>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9807, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, kCFStreamPropertySSLPeerCertificates=(
    "<cert(0x7f98c782aa00) s: www.google.com i: GTS CA 1O1>",
    "<cert(0x7f98c782b200) s: GTS CA 1O1 i: GlobalSign>"
)}}, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <DD6914C9-6126-4119-BF6F-F6499649DD75>.<1>"
), _kCFStreamErrorCodeKey=-9807, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <DD6914C9-6126-4119-BF6F-F6499649DD75>.<1>, NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7f98c6d5caa0>, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be "<http://www.google.com|www.google.com>" which could put your confidential information at risk.}
io.ktor.client.engine.ios.IosHttpRequestException: Exception in http request: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be "<http://www.google.com|www.google.com>" which could put your confidential information at risk." UserInfo={NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, NSErrorPeerCertificateChainKey=(
    "<cert(0x7f98c782aa00) s: www.google.com i: GTS CA 1O1>",
    "<cert(0x7f98c782b200) s: GTS CA 1O1 i: GlobalSign>"
), NSErrorClientCertificateStateKey=0, NSErrorFailingURLKey=<https://www.google.com/>, NSErrorFailingURLStringKey=<https://www.google.com/>, NSUnderlyingError=0x7f98c6d52b60 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f98c6d5caa0>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9807, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, kCFStreamPropertySSLPeerCertificates=(
    "<cert(0x7f98c782aa00) s: www.google.com i: GTS CA 1O1>",
    "<cert(0x7f98c782b200) s: GTS CA 1O1 i: GlobalSign>"
)}}, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <DD6914C9-6126-4119-BF6F-F6499649DD75>.<1>"
m

Michal Klimczak

02/14/2021, 7:56 AM
I would guess that nsurlconnection verifies the certificate of the server against a list of authorities it knows. Since you are not running this on ios (how are kotlin ios tests run anyway?) it has no certs to verify. You could probably use a trust-all client (and provide it to ktor) or provide your own certs to the client. What's the purpose of this test?
p

Paul Woitaschek

02/14/2021, 7:57 AM
Toying in a sandbox 🙂
how are kotlin ios tests run anyway?
Thats the question I'm asking myself too
K 1
m

Michal Klimczak

02/14/2021, 8:01 AM
If its just for experimenting I would try pinning th Google cert - this will probably help https://levelup.gitconnected.com/kotlin-multiplatform-ios-certificate-pinning-fd1abba5ca8f
p

Paul Woitaschek

02/14/2021, 8:08 AM
Anyways, on a simulator it’s running 🙂
👍 1
20 Views