Skip to content

Commit a8d9370

Browse files
Pushkar N Kulkarniianpartridge
authored andcommitted
Use URLSessionTask.count* properties instead of custom private properties (swiftlang#1138)
1 parent a64dc48 commit a8d9370

File tree

4 files changed

+24
-26
lines changed

4 files changed

+24
-26
lines changed

Foundation/NSURLSession/NSURLSession.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ fileprivate func nextSessionIdentifier() -> Int32 {
178178
sessionCounter += 1
179179
return sessionCounter
180180
}
181-
public let URLSessionTransferSizeUnknown: Int64 = -1
181+
public let NSURLSessionTransferSizeUnknown: Int64 = -1
182182

183183
open class URLSession : NSObject {
184184
fileprivate let _configuration: _Configuration

Foundation/NSURLSession/NSURLSessionTask.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ open class URLSessionTask : NSObject, NSCopying {
143143
*/
144144

145145
/// Number of body bytes already received
146-
open fileprivate(set) var countOfBytesReceived: Int64 {
146+
open internal(set) var countOfBytesReceived: Int64 {
147147
get {
148148
semaphore.wait()
149149
defer {
@@ -160,7 +160,7 @@ open class URLSessionTask : NSObject, NSCopying {
160160
fileprivate var _countOfBytesReceived: Int64 = 0
161161

162162
/// Number of body bytes already sent */
163-
open fileprivate(set) var countOfBytesSent: Int64 {
163+
open internal(set) var countOfBytesSent: Int64 {
164164
get {
165165
semaphore.wait()
166166
defer {
@@ -178,10 +178,10 @@ open class URLSessionTask : NSObject, NSCopying {
178178
fileprivate var _countOfBytesSent: Int64 = 0
179179

180180
/// Number of body bytes we expect to send, derived from the Content-Length of the HTTP request */
181-
open fileprivate(set) var countOfBytesExpectedToSend: Int64 = 0
181+
open internal(set) var countOfBytesExpectedToSend: Int64 = 0
182182

183183
/// Number of byte bytes we expect to receive, usually derived from the Content-Length header of an HTTP response. */
184-
open fileprivate(set) var countOfBytesExpectedToReceive: Int64 = 0
184+
open internal(set) var countOfBytesExpectedToReceive: Int64 = 0
185185

186186
/// The taskDescription property is available for the developer to
187187
/// provide a descriptive label for the task.

Foundation/NSURLSession/http/EasyHandle.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ internal final class _EasyHandle {
5555
weak var delegate: _EasyHandleDelegate?
5656
fileprivate var headerList: _CurlStringList?
5757
fileprivate var pauseState: _PauseState = []
58-
internal var fileLength: Int64 = 0
5958
internal var timeoutTimer: _TimeoutSource!
6059
#if os(Android)
6160
static fileprivate var _CAInfoFile: UnsafeMutablePointer<Int8>?
@@ -100,7 +99,7 @@ internal protocol _EasyHandleDelegate: class {
10099
func didReceive(data: Data) -> _EasyHandle._Action
101100
/// Handle header data read from the network.
102101
/// - returns: the action to be taken: abort, proceed, or pause.
103-
func didReceive(headerData data: Data) -> _EasyHandle._Action
102+
func didReceive(headerData data: Data, contentLength: Int64) -> _EasyHandle._Action
104103
/// Fill a buffer with data to be sent.
105104
///
106105
/// - parameter data: The buffer to fill
@@ -454,7 +453,7 @@ fileprivate extension _EasyHandle {
454453
}
455454
var length = Double()
456455
try! CFURLSession_easy_getinfo_double(handle.rawHandle, CFURLSessionInfoCONTENT_LENGTH_DOWNLOAD, &length).asError()
457-
return handle.didReceive(headerData: data, size: size, nmemb: nmemb, fileLength: length)
456+
return handle.didReceive(headerData: data, size: size, nmemb: nmemb, contentLength: length)
458457
}.asError()
459458

460459
// socket options
@@ -513,11 +512,10 @@ fileprivate extension _EasyHandle {
513512
/// data.
514513
///
515514
/// - SeeAlso: <https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html>
516-
func didReceive(headerData data: UnsafeMutablePointer<Int8>, size: Int, nmemb: Int, fileLength: Double) -> Int {
517-
self.fileLength = Int64(fileLength)
515+
func didReceive(headerData data: UnsafeMutablePointer<Int8>, size: Int, nmemb: Int, contentLength: Double) -> Int {
518516
let d: Int = {
519517
let buffer = Data(bytes: data, count: size*nmemb)
520-
switch delegate?.didReceive(headerData: buffer) {
518+
switch delegate?.didReceive(headerData: buffer, contentLength: Int64(contentLength)) {
521519
case .some(.proceed): return size * nmemb
522520
case .some(.abort): return 0
523521
case .some(.pause):

Foundation/NSURLSession/http/HTTPURLProtocol.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ import Dispatch
1313
internal class _HTTPURLProtocol: URLProtocol {
1414

1515
fileprivate var easyHandle: _EasyHandle!
16-
fileprivate var totalDownloaded = 0
17-
fileprivate var totalUploaded: Int64 = 0
18-
fileprivate var requestBodyLength: Int64 = 0
1916
fileprivate var tempFileURL: URL
2017

2118
public required init(task: URLSessionTask, cachedResponse: CachedURLResponse?, client: URLProtocolClient?) {
@@ -129,7 +126,7 @@ fileprivate extension _HTTPURLProtocol {
129126
set(requestBodyLength: .noBody)
130127
case (_, .some(let length)):
131128
set(requestBodyLength: .length(length))
132-
requestBodyLength = Int64(length)
129+
task!.countOfBytesExpectedToSend = Int64(length)
133130
case (_, .none):
134131
set(requestBodyLength: .unknown)
135132
}
@@ -469,21 +466,23 @@ extension _HTTPURLProtocol: _EasyHandleDelegate {
469466
let fileHandle = try! FileHandle(forWritingTo: self.tempFileURL)
470467
_ = fileHandle.seekToEndOfFile()
471468
fileHandle.write(data)
472-
self.totalDownloaded += data.count
469+
task.countOfBytesReceived += Int64(data.count)
473470

474471
s.delegateQueue.addOperation {
475-
downloadDelegate.urlSession(s, downloadTask: task, didWriteData: Int64(data.count), totalBytesWritten: Int64(self.totalDownloaded),
476-
totalBytesExpectedToWrite: Int64(self.easyHandle.fileLength))
472+
downloadDelegate.urlSession(s, downloadTask: task, didWriteData: Int64(data.count), totalBytesWritten: task.countOfBytesReceived,
473+
totalBytesExpectedToWrite: task.countOfBytesExpectedToReceive)
477474
}
478-
if Int(self.easyHandle.fileLength) == self.totalDownloaded {
475+
if task.countOfBytesExpectedToReceive == task.countOfBytesReceived {
479476
fileHandle.closeFile()
480477
self.properties[.temporaryFileURL] = self.tempFileURL
481478
}
482479
}
483480
}
484481

485-
func didReceive(headerData data: Data) -> _EasyHandle._Action {
486-
guard case .transferInProgress(let ts) = internalState else { fatalError("Received body data, but no transfer in progress.") }
482+
func didReceive(headerData data: Data, contentLength: Int64) -> _EasyHandle._Action {
483+
guard case .transferInProgress(let ts) = internalState else { fatalError("Received header data, but no transfer in progress.") }
484+
guard let task = task else { fatalError("Received header data but no task available.") }
485+
task.countOfBytesExpectedToReceive = contentLength > 0 ? contentLength : NSURLSessionTransferSizeUnknown
487486
do {
488487
let newTS = try ts.byAppending(headerLine: data)
489488
internalState = .transferInProgress(newTS)
@@ -499,12 +498,13 @@ extension _HTTPURLProtocol: _EasyHandleDelegate {
499498
}
500499

501500
fileprivate func notifyDelegate(aboutUploadedData count: Int64) {
502-
let session = self.task?.session as! URLSession
503-
guard case .taskDelegate(let delegate) = session.behaviour(for: self.task!), self.task is URLSessionUploadTask else { return }
504-
totalUploaded += count
501+
guard let task = self.task as? URLSessionUploadTask,
502+
let session = self.task?.session as? URLSession,
503+
case .taskDelegate(let delegate) = session.behaviour(for: task) else { return }
504+
task.countOfBytesSent += count
505505
session.delegateQueue.addOperation {
506-
delegate.urlSession(session, task: self.task!, didSendBodyData: count,
507-
totalBytesSent: self.totalUploaded, totalBytesExpectedToSend: self.requestBodyLength)
506+
delegate.urlSession(session, task: task, didSendBodyData: count,
507+
totalBytesSent: task.countOfBytesSent, totalBytesExpectedToSend: task.countOfBytesExpectedToSend)
508508
}
509509
}
510510

0 commit comments

Comments
 (0)