Merge remote-tracking branch 'origin/master' into swift-4.0-branch
diff --git a/Foundation/NSURLSession/NSURLSessionTask.swift b/Foundation/NSURLSession/NSURLSessionTask.swift
index 2b28de4..f819ff0 100644
--- a/Foundation/NSURLSession/NSURLSessionTask.swift
+++ b/Foundation/NSURLSession/NSURLSessionTask.swift
@@ -546,13 +546,12 @@
guard let task = `protocol`.task else { fatalError() }
guard let session = task.session as? URLSession else { fatalError() }
switch session.behaviour(for: task) {
- case .taskDelegate(let delegate) where delegate is URLSessionDownloadDelegate:
- let downloadDelegate = delegate as! URLSessionDownloadDelegate
- let downloadTask = task as! URLSessionDownloadTask
- session.delegateQueue.addOperation {
- downloadDelegate.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: `protocol`.properties[URLProtocol._PropertyKey.temporaryFileURL] as! URL)
- }
case .taskDelegate(let delegate):
+ if let downloadDelegate = delegate as? URLSessionDownloadDelegate, let downloadTask = task as? URLSessionDownloadTask {
+ session.delegateQueue.addOperation {
+ downloadDelegate.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: `protocol`.properties[URLProtocol._PropertyKey.temporaryFileURL] as! URL)
+ }
+ }
session.delegateQueue.addOperation {
delegate.urlSession(session, task: task, didCompleteWithError: nil)
task.state = .completed
diff --git a/TestFoundation/TestNSURLSession.swift b/TestFoundation/TestNSURLSession.swift
index 6571658..02eb94d 100644
--- a/TestFoundation/TestNSURLSession.swift
+++ b/TestFoundation/TestNSURLSession.swift
@@ -41,6 +41,7 @@
("test_outOfRangeButCorrectlyFormattedHTTPCode", test_outOfRangeButCorrectlyFormattedHTTPCode),
("test_missingContentLengthButStillABody", test_missingContentLengthButStillABody),
("test_illegalHTTPServerResponses", test_illegalHTTPServerResponses),
+ ("test_dataTaskWithSharedDelegate", test_dataTaskWithSharedDelegate),
]
}
@@ -429,8 +430,37 @@
waitForExpectations(timeout: 12)
}
}
+
+ func test_dataTaskWithSharedDelegate() {
+ let sharedDelegate = SharedDelegate()
+ let urlString0 = "http://127.0.0.1:\(TestURLSession.serverPort)/Nepal"
+ let session = URLSession(configuration: .default, delegate: sharedDelegate, delegateQueue: nil)
+
+ let dataRequest = URLRequest(url: URL(string: urlString0)!)
+ let dataTask = session.dataTask(with: dataRequest)
+
+ sharedDelegate.dataCompletionExpectation = expectation(description: "GET \(urlString0)")
+ dataTask.resume()
+ waitForExpectations(timeout: 20)
+ }
}
+class SharedDelegate: NSObject {
+ var dataCompletionExpectation: XCTestExpectation!
+}
+
+extension SharedDelegate: URLSessionDataDelegate {
+ func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
+ dataCompletionExpectation.fulfill()
+ }
+}
+
+extension SharedDelegate: URLSessionDownloadDelegate {
+ func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
+ }
+}
+
+
class SessionDelegate: NSObject, URLSessionDelegate {
let invalidateExpectation: XCTestExpectation
init(invalidateExpectation: XCTestExpectation){