Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Retry file upload FIX #1086

Merged
merged 3 commits into from
Mar 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 23 additions & 33 deletions Sources/Apollo/GraphQLFile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ public struct GraphQLFile {
public let fieldName: String
public let originalName: String
public let mimeType: String
public let inputStream: InputStream
public let data: Data?
public let fileURL: URL?
public let contentLength: UInt64

/// A convenience constant for declaring your mimetype is octet-stream.
Expand All @@ -22,11 +23,12 @@ public struct GraphQLFile {
originalName: String,
mimeType: String = GraphQLFile.octetStreamMimeType,
data: Data) {
self.init(fieldName: fieldName,
originalName: originalName,
mimeType: mimeType,
inputStream: InputStream(data: data),
contentLength: UInt64(data.count))
self.fieldName = fieldName
self.originalName = originalName
self.mimeType = mimeType
self.data = data
self.fileURL = nil
self.contentLength = UInt64(data.count)
}

/// Failable convenience initializer for files in the filesystem
Expand All @@ -41,42 +43,30 @@ public struct GraphQLFile {
originalName: String,
mimeType: String = GraphQLFile.octetStreamMimeType,
fileURL: URL) {
guard let inputStream = InputStream(url: fileURL) else {
return nil
}

guard let contentLength = GraphQLFile.getFileSize(fileURL: fileURL) else {
return nil
}

self.init(fieldName: fieldName,
originalName: originalName,
mimeType: mimeType,
inputStream: inputStream,
contentLength: contentLength)
}

/// Designated Initializer
///
/// - Parameters:
/// - fieldName: The name of the field this file is being sent for
/// - originalName: The original name of the file
/// - mimeType: The mime type of the file to send to the server. Defaults to `GraphQLFile.octetStreamMimeType`.
/// - inputStream: An input stream to use to acccess data
/// - contentLength: The length of the data being sent
public init(fieldName: String,
originalName: String,
mimeType: String = GraphQLFile.octetStreamMimeType,
inputStream: InputStream,
contentLength: UInt64) {

self.fieldName = fieldName
self.originalName = originalName
self.mimeType = mimeType

self.inputStream = inputStream
self.data = nil
self.fileURL = fileURL
self.contentLength = contentLength
}

/// Retrieves the InputStream
///
public func generateInputStream() throws -> InputStream {
if let data = data {
return InputStream(data: data)
} else if let fileURL = fileURL, let inputStream = InputStream(url: fileURL) {
return inputStream
}

throw GraphQLError("InputStream was not created.")
}

private static func getFileSize(fileURL: URL) -> UInt64? {
guard let fileSizeAttribute = try? FileManager.default.attributesOfItem(atPath: fileURL.path)[.size],
let fileSize = fileSizeAttribute as? NSNumber else {
Expand Down
2 changes: 1 addition & 1 deletion Sources/Apollo/RequestCreator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ extension RequestCreator {
formData.appendPart(data: mapData, name: "map")

for (index, file) in files.enumerated() {
formData.appendPart(inputStream: file.inputStream,
formData.appendPart(inputStream: try file.generateInputStream(),
contentLength: file.contentLength,
name: "\(index)",
contentType: file.mimeType,
Expand Down
4 changes: 2 additions & 2 deletions Tests/ApolloTests/TestCustomRequestCreator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ struct TestCustomRequestCreator: RequestCreator {
}
}

files.forEach {
formData.appendPart(inputStream: $0.inputStream, contentLength: $0.contentLength, name: $0.fieldName, contentType: $0.mimeType, filename: $0.originalName)
try files.forEach {
formData.appendPart(inputStream: try $0.generateInputStream(), contentLength: $0.contentLength, name: $0.fieldName, contentType: $0.mimeType, filename: $0.originalName)
}

return formData
Expand Down