diff --git a/Sources/Apollo/RequestChainNetworkTransport.swift b/Sources/Apollo/RequestChainNetworkTransport.swift index 1db56f148e..8a07bff866 100644 --- a/Sources/Apollo/RequestChainNetworkTransport.swift +++ b/Sources/Apollo/RequestChainNetworkTransport.swift @@ -69,7 +69,7 @@ open class RequestChainNetworkTransport: NetworkTransport { contextIdentifier: contextIdentifier, clientName: self.clientName, clientVersion: self.clientVersion, - additionalHeaders: additionalHeaders, + additionalHeaders: self.additionalHeaders, cachePolicy: cachePolicy, autoPersistQueries: self.autoPersistQueries, useGETForQueries: self.useGETForQueries, @@ -110,16 +110,20 @@ extension RequestChainNetworkTransport: UploadingNetworkTransport { /// - Parameters: /// - operation: The operation to create a request for /// - files: The files you wish to upload + /// - manualBoundary: [optional] A manually set boundary for your upload request. Defaults to nil. /// - Returns: The created request. open func constructUploadRequest( for operation: Operation, - with files: [GraphQLFile]) -> HTTPRequest { + with files: [GraphQLFile], + manualBoundary: String? = nil) -> HTTPRequest { UploadRequest(graphQLEndpoint: self.endpointURL, operation: operation, clientName: self.clientName, clientVersion: self.clientVersion, + additionalHeaders: self.additionalHeaders, files: files, + manualBoundary: manualBoundary, requestBodyCreator: self.requestBodyCreator) } diff --git a/Tests/ApolloTests/UploadTests.swift b/Tests/ApolloTests/UploadTests.swift index 27c0ac1f20..7bdb704a51 100644 --- a/Tests/ApolloTests/UploadTests.swift +++ b/Tests/ApolloTests/UploadTests.swift @@ -12,7 +12,10 @@ class UploadTests: XCTestCase { let store = ApolloStore() let provider = LegacyInterceptorProvider(store: store) let transport = RequestChainNetworkTransport(interceptorProvider: provider, - endpointURL: self.uploadClientURL) + endpointURL: self.uploadClientURL, + additionalHeaders: ["headerKey": "headerValue"]) + transport.clientName = "test" + transport.clientVersion = "test" return ApolloClient(networkTransport: transport, store: store) }() @@ -295,12 +298,17 @@ class UploadTests: XCTestCase { mimeType: "text/plain", fileURL: alphaFileUrl) let operation = UploadOneFileMutation(file: alphaFile.originalName) - let uploadRequest = UploadRequest(graphQLEndpoint: TestURL.mockServer.url, - operation: operation, - clientName: "test", - clientVersion: "test", - files: [alphaFile], - manualBoundary: "TEST.BOUNDARY") + + let transport = try XCTUnwrap(self.client.networkTransport as? RequestChainNetworkTransport) + + let httpRequest = transport.constructUploadRequest(for: operation, + with: [alphaFile], + manualBoundary: "TEST.BOUNDARY") + let uploadRequest = try XCTUnwrap(httpRequest as? UploadRequest) + + let urlRequest = try uploadRequest.toURLRequest() + XCTAssertEqual(urlRequest.allHTTPHeaderFields?["headerKey"], "headerValue") + let formData = try uploadRequest.requestMultipartFormData() let stringToCompare = try formData.toTestString() @@ -340,12 +348,16 @@ Alpha file content. let files = [alphaFile, betaFile] let operation = UploadMultipleFilesToTheSameParameterMutation(files: files.map { $0.originalName }) - let uploadRequest = UploadRequest(graphQLEndpoint: TestURL.mockServer.url, - operation: operation, - clientName: "test", - clientVersion: "test", - files: files, - manualBoundary: "TEST.BOUNDARY") + let transport = try XCTUnwrap(self.client.networkTransport as? RequestChainNetworkTransport) + + let httpRequest = transport.constructUploadRequest(for: operation, + with: [alphaFile, betaFile], + manualBoundary: "TEST.BOUNDARY") + let uploadRequest = try XCTUnwrap(httpRequest as? UploadRequest) + + let urlRequest = try uploadRequest.toURLRequest() + XCTAssertEqual(urlRequest.allHTTPHeaderFields?["headerKey"], "headerValue") + let multipartData = try uploadRequest.requestMultipartFormData() let stringToCompare = try multipartData.toTestString() @@ -394,12 +406,15 @@ Bravo file content. mimeType: "text/plain", fileURL: charlieFileUrl) - let uploadRequest = UploadRequest(graphQLEndpoint: TestURL.mockServer.url, - operation: HeroNameQuery(), - clientName: "test", - clientVersion: "test", - files: [alphaFile, betaFile, charlieFile], - manualBoundary: "TEST.BOUNDARY") + let transport = try XCTUnwrap(self.client.networkTransport as? RequestChainNetworkTransport) + + let httpRequest = transport.constructUploadRequest(for: HeroNameQuery(), + with: [alphaFile, betaFile, charlieFile], + manualBoundary: "TEST.BOUNDARY") + let uploadRequest = try XCTUnwrap(httpRequest as? UploadRequest) + + let urlRequest = try uploadRequest.toURLRequest() + XCTAssertEqual(urlRequest.allHTTPHeaderFields?["headerKey"], "headerValue") let multipartData = try uploadRequest.requestMultipartFormData() let stringToCompare = try multipartData.toTestString()