Skip to content

Commit 16dc61c

Browse files
authored
Apple HttpEngine: lock the handlers map (#6348)
Fixes 6346
1 parent 5f2998f commit 16dc61c

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

libraries/apollo-runtime/src/appleMain/kotlin/com/apollographql/apollo/network/http/DefaultHttpEngine.apple.kt

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import com.apollographql.apollo.api.http.HttpRequest
66
import com.apollographql.apollo.api.http.HttpResponse
77
import com.apollographql.apollo.exception.ApolloNetworkException
88
import com.apollographql.apollo.network.toNSData
9+
import kotlinx.atomicfu.locks.reentrantLock
10+
import kotlinx.atomicfu.locks.withLock
911
import kotlinx.cinterop.alloc
1012
import kotlinx.cinterop.nativeHeap
1113
import kotlinx.cinterop.ptr
@@ -207,6 +209,8 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
207209
fun onComplete(error: NSError?)
208210
}
209211

212+
private val lock = reentrantLock()
213+
210214
private val handlers = mutableMapOf<NSURLSessionTask, Handler>()
211215

212216
override fun URLSession(
@@ -215,7 +219,9 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
215219
didReceiveResponse: NSURLResponse,
216220
completionHandler: (NSURLSessionResponseDisposition) -> Unit,
217221
) {
218-
handlers[dataTask]?.onResponse(didReceiveResponse as NSHTTPURLResponse)
222+
lock.withLock {
223+
handlers[dataTask]
224+
}?.onResponse(didReceiveResponse as NSHTTPURLResponse)
219225
completionHandler(NSURLSessionResponseAllow)
220226
}
221227

@@ -224,18 +230,22 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
224230
dataTask: NSURLSessionDataTask,
225231
didReceiveData: NSData,
226232
) {
227-
handlers[dataTask]?.onData(didReceiveData)
233+
lock.withLock {
234+
handlers[dataTask]
235+
}?.onData(didReceiveData)
228236
}
229237

230238
override fun URLSession(
231239
session: NSURLSession,
232240
task: NSURLSessionTask,
233241
didCompleteWithError: NSError?,
234242
) {
235-
handlers[task]?.onComplete(didCompleteWithError)
236-
237-
// Cleanup
238-
handlers.remove(task)
243+
lock.withLock {
244+
handlers[task].also {
245+
// Cleanup
246+
handlers.remove(task)
247+
}
248+
}?.onComplete(didCompleteWithError)
239249
}
240250

241251
override fun URLSession(
@@ -244,16 +254,20 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
244254
willCacheResponse: NSCachedURLResponse,
245255
completionHandler: (NSCachedURLResponse?) -> Unit,
246256
) {
247-
handlers[dataTask]?.onComplete(null)
248-
249-
// Cleanup
250-
handlers.remove(dataTask)
257+
lock.withLock {
258+
handlers[dataTask].also {
259+
// Cleanup
260+
handlers.remove(dataTask)
261+
}
262+
}?.onComplete(null)
251263

252264
completionHandler(willCacheResponse)
253265
}
254266

255267
fun registerHandlerForTask(task: NSURLSessionTask, handler: Handler) {
256-
handlers[task] = handler
268+
lock.withLock {
269+
handlers[task] = handler
270+
}
257271
}
258272
}
259273

0 commit comments

Comments
 (0)