Skip to content

Commit 1ffda32

Browse files
committed
Improving handling to hang on fileUrl on GraphQLFile.
1 parent 0118b47 commit 1ffda32

3 files changed

Lines changed: 30 additions & 11 deletions

File tree

Sources/Apollo/GraphQLFile.swift

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ public struct GraphQLFile {
55
public let fieldName: String
66
public let originalName: String
77
public let mimeType: String
8-
public let data: Data
8+
public let data: Data?
9+
public let fileURL: URL?
910
public let contentLength: UInt64
1011

1112
/// A convenience constant for declaring your mimetype is octet-stream.
@@ -26,6 +27,7 @@ public struct GraphQLFile {
2627
self.originalName = originalName
2728
self.mimeType = mimeType
2829
self.data = data
30+
self.fileURL = nil
2931
self.contentLength = UInt64(data.count)
3032
}
3133

@@ -41,19 +43,36 @@ public struct GraphQLFile {
4143
originalName: String,
4244
mimeType: String = GraphQLFile.octetStreamMimeType,
4345
fileURL: URL) {
44-
guard let fileData = try? Data(contentsOf: fileURL) else {
45-
return nil
46+
guard let contentLength = GraphQLFile.getFileSize(fileURL: fileURL) else {
47+
return nil
4648
}
4749

48-
self.init(fieldName: fieldName,
49-
originalName: originalName,
50-
mimeType: mimeType,
51-
data: fileData)
50+
self.fieldName = fieldName
51+
self.originalName = originalName
52+
self.mimeType = mimeType
53+
self.data = nil
54+
self.fileURL = fileURL
55+
self.contentLength = contentLength
5256
}
5357

5458
/// Retrieves the InputStream
5559
///
56-
public func generateInputStream() -> InputStream {
60+
public func generateInputStream() throws -> InputStream {
61+
if let data = data {
5762
return InputStream(data: data)
63+
} else if let fileURL = fileURL, let inputStream = InputStream(url: fileURL) {
64+
return inputStream
65+
}
66+
67+
throw GraphQLError("InputStream was not created.")
68+
}
69+
70+
private static func getFileSize(fileURL: URL) -> UInt64? {
71+
guard let fileSizeAttribute = try? FileManager.default.attributesOfItem(atPath: fileURL.path)[.size],
72+
let fileSize = fileSizeAttribute as? NSNumber else {
73+
return nil
74+
}
75+
76+
return fileSize.uint64Value
5877
}
5978
}

Sources/Apollo/RequestCreator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ extension RequestCreator {
138138
formData.appendPart(data: mapData, name: "map")
139139

140140
for (index, file) in files.enumerated() {
141-
formData.appendPart(inputStream: file.generateInputStream(),
141+
formData.appendPart(inputStream: try file.generateInputStream(),
142142
contentLength: file.contentLength,
143143
name: "\(index)",
144144
contentType: file.mimeType,

Tests/ApolloTests/TestCustomRequestCreator.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ struct TestCustomRequestCreator: RequestCreator {
5353
}
5454
}
5555

56-
files.forEach {
57-
formData.appendPart(inputStream: $0.generateInputStream(), contentLength: $0.contentLength, name: $0.fieldName, contentType: $0.mimeType, filename: $0.originalName)
56+
try files.forEach {
57+
formData.appendPart(inputStream: try $0.generateInputStream(), contentLength: $0.contentLength, name: $0.fieldName, contentType: $0.mimeType, filename: $0.originalName)
5858
}
5959

6060
return formData

0 commit comments

Comments
 (0)