Skip to content

Commit 3554952

Browse files
committed
SessionDelegate is now properly called
1 parent 6f6f31b commit 3554952

3 files changed

Lines changed: 61 additions & 26 deletions

File tree

Sources/Apollo/GraphQLFile.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ public struct GraphQLFile {
1010
}
1111

1212
public init?(fieldName: String, originalName: String, mimeType: String = "application/octet-stream", fileURL: URL) {
13-
if let inputStream = InputStream(url: fileURL) {
14-
let contentLength = GraphQLFile.getFileSize(fileURL: fileURL)
15-
self.init(fieldName: fieldName, originalName: originalName, mimeType: mimeType, inputStream: inputStream, contentLength: contentLength)
13+
// TODO: Better error handling
14+
15+
16+
guard let inputStream = InputStream(url: fileURL) else {
17+
return nil
18+
}
19+
20+
guard let contentLength = GraphQLFile.getFileSize(fileURL: fileURL) else {
21+
return nil
1622
}
1723

18-
return nil
24+
self.init(fieldName: fieldName, originalName: originalName, mimeType: mimeType, inputStream: inputStream, contentLength: contentLength)
1925
}
2026

2127
public init(fieldName: String, originalName: String, mimeType: String = "application/octet-stream", inputStream: InputStream, contentLength: UInt64) {
@@ -27,17 +33,17 @@ public struct GraphQLFile {
2733
self.contentLength = contentLength
2834
}
2935

30-
private static func getFileSize(fileURL: URL) -> UInt64 {
36+
private static func getFileSize(fileURL: URL) -> UInt64? {
3137
let fileSize: UInt64
3238

3339
do {
3440
guard let fileSize = try FileManager.default.attributesOfItem(atPath: fileURL.path)[.size] as? NSNumber else {
35-
return 0
41+
return nil
3642
}
3743

3844
return fileSize.uint64Value
3945
} catch {
40-
return 0
46+
return nil
4147
}
4248
}
4349
}

Sources/Apollo/HTTPNetworkTransport.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public class HTTPNetworkTransport: NetworkTransport {
9797
request.httpBody = try! serializationFormat.serialize(value: body)
9898
}
9999

100-
let task = session.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
100+
func notifyCompletionHandler(data: Data?, response: URLResponse?, error: Error?) {
101101
if error != nil {
102102
completionHandler(nil, error)
103103
return
@@ -128,9 +128,9 @@ public class HTTPNetworkTransport: NetworkTransport {
128128
}
129129
}
130130

131-
if let progressHandler = progressHandler {
132-
self.sessionDelegate.add(task: task, progressHandler: progressHandler)
133-
}
131+
let task = session.dataTask(with: request)
132+
133+
self.sessionDelegate.add(task: task, completionHandler: notifyCompletionHandler, progressHandler: progressHandler)
134134

135135
task.resume()
136136

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,67 @@
11
class SessionDelegate: NSObject {
2+
class SessionDelegateTask {
3+
let completionHandler: (Data?, URLResponse?, Error?) -> Void
4+
let progressHandler: ((Progress) -> Void)?
5+
var data = Data()
6+
7+
init(completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void, progressHandler: ((Progress) -> Void)? = nil) {
8+
self.completionHandler = completionHandler
9+
self.progressHandler = progressHandler
10+
}
11+
12+
func didReceiveData(data: Data) {
13+
self.data.append(data)
14+
}
15+
}
216

3-
private var tasks: [Int: (Progress) -> Void] = [:]
4-
private let lock = NSLock()
17+
private var tasks: [Int: SessionDelegateTask] = [:]
18+
private let lock = Mutex()
519

6-
func add(task: URLSessionTask, progressHandler: @escaping (Progress) -> Void) {
7-
lock.lock()
8-
defer { lock.unlock() }
20+
func add(task: URLSessionTask, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void, progressHandler: ((Progress) -> Void)? = nil) {
21+
self.lock.lock()
22+
defer { self.lock.unlock() }
923

10-
self.tasks[task.taskIdentifier] = progressHandler
24+
self.tasks[task.taskIdentifier] = SessionDelegateTask(completionHandler: completionHandler, progressHandler: progressHandler)
1125
}
1226

13-
func get(task: URLSessionTask) -> ((Progress) -> Void)? {
14-
lock.lock()
15-
defer { lock.unlock() }
16-
17-
return self.tasks[task.taskIdentifier]
27+
func get(task: URLSessionTask) -> SessionDelegateTask? {
28+
return lock.withLock {
29+
return self.tasks[task.taskIdentifier]
30+
}
1831
}
1932

2033
func remove(task: URLSessionTask) {
21-
lock.lock()
22-
defer { lock.unlock() }
34+
self.lock.lock()
35+
defer { self.lock.unlock() }
2336

2437
self.tasks.removeValue(forKey: task.taskIdentifier)
2538
}
2639
}
2740

41+
extension SessionDelegate: URLSessionDataDelegate {
42+
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Swift.Void) {
43+
completionHandler(URLSession.ResponseDisposition.allow)
44+
}
45+
}
46+
2847
extension SessionDelegate: URLSessionTaskDelegate {
2948
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
30-
if let progressHandler = self.get(task: task) {
49+
if let sessionTask = self.get(task: task), let progressHandler = sessionTask.progressHandler {
3150
progressHandler(Progress((totalBytesSent/totalBytesExpectedToSend)) * 100)
3251
}
3352
}
3453

54+
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
55+
if let sessionTask = self.get(task: dataTask) {
56+
sessionTask.didReceiveData(data: data)
57+
}
58+
}
59+
3560
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
36-
self.remove(task: task)
61+
if let sessionTask = self.get(task: task) {
62+
self.remove(task: task)
63+
64+
sessionTask.completionHandler(sessionTask.data, task.response, error)
65+
}
3766
}
3867
}

0 commit comments

Comments
 (0)