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){