in ktor-client/ktor-client-ios/darwin/src/io/ktor/client/engine/ios/IosClientEngine.kt [20:71]
override suspend fun execute(data: HttpRequestData): HttpResponseData {
val callContext = callContext()
val responseReader = IosResponseReader(callContext, data, config)
val configuration = NSURLSessionConfiguration.defaultSessionConfiguration().apply {
setupProxy(config)
config.sessionConfig(this)
}
val url = URLBuilder().takeFrom(data.url).buildString()
val nativeRequest = NSMutableURLRequest.requestWithURL(NSURL(string = url)).apply {
setupSocketTimeout(data)
val content = data.body
content.toNSData()?.let {
setHTTPBody(it)
}
mergeHeaders(data.headers, data.body) { key, value ->
setValue(value, key)
}
setCachePolicy(NSURLRequestReloadIgnoringCacheData)
setHTTPMethod(data.method.value)
config.requestConfig(this)
}
val session = NSURLSession.sessionWithConfiguration(
configuration, responseReader, delegateQueue = NSOperationQueue.mainQueue()
)
val task = session.dataTaskWithRequest(nativeRequest)
launch(callContext) {
task.resume()
}
callContext[Job]!!.invokeOnCompletion {
session.finishTasksAndInvalidate()
}
return try {
responseReader.awaitResponse()
} catch (cause: CancellationException) {
if (task.state == NSURLSessionTaskStateRunning) {
task.cancel()
}
throw cause
}
}