Skip to content

Commit a2473e2

Browse files
authored
Merge pull request #1387 from saiHemak/nativeprotocol-transferstate
2 parents 160cc35 + b6b9d06 commit a2473e2

File tree

2 files changed

+41
-33
lines changed

2 files changed

+41
-33
lines changed

Foundation/URLSession/TransferState.swift

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import CoreFoundation
2121

2222

2323

24-
extension _HTTPURLProtocol {
24+
extension _NativeProtocol {
2525
/// State related to an ongoing transfer.
2626
///
2727
/// This contains headers received so far, body data received so far, etc.
@@ -31,13 +31,13 @@ extension _HTTPURLProtocol {
3131
///
3232
/// - TODO: Might move the `EasyHandle` into this `struct` ?
3333
/// - SeeAlso: `URLSessionTask.EasyHandle`
34-
internal struct _HTTPTransferState {
34+
internal struct _TransferState {
3535
/// The URL that's being requested
3636
let url: URL
3737
/// Raw headers received.
3838
let parsedResponseHeader: _ParsedResponseHeader
3939
/// Once the headers is complete, this will contain the response
40-
var response: HTTPURLResponse?
40+
var response: URLResponse?
4141
/// The body data to be sent in the request
4242
let requestBodySource: _BodySource?
4343
/// Body data received
@@ -46,7 +46,7 @@ extension _HTTPURLProtocol {
4646
}
4747
}
4848

49-
extension _HTTPURLProtocol {
49+
extension _NativeProtocol {
5050
enum _DataDrain {
5151
/// Concatenate in-memory
5252
case inMemory(NSMutableData?)
@@ -57,37 +57,33 @@ extension _HTTPURLProtocol {
5757
}
5858
}
5959

60-
extension _HTTPURLProtocol._HTTPTransferState {
60+
extension _NativeProtocol._TransferState {
6161
/// Transfer state that can receive body data, but will not send body data.
62-
init(url: URL, bodyDataDrain: _HTTPURLProtocol._DataDrain) {
62+
init(url: URL, bodyDataDrain: _NativeProtocol._DataDrain) {
6363
self.url = url
64-
self.parsedResponseHeader = _HTTPURLProtocol._ParsedResponseHeader()
64+
self.parsedResponseHeader = _NativeProtocol._ParsedResponseHeader()
6565
self.response = nil
6666
self.requestBodySource = nil
6767
self.bodyDataDrain = bodyDataDrain
6868
}
6969
/// Transfer state that sends body data and can receive body data.
70-
init(url: URL, bodyDataDrain: _HTTPURLProtocol._DataDrain, bodySource: _BodySource) {
70+
init(url: URL, bodyDataDrain: _NativeProtocol._DataDrain, bodySource: _BodySource) {
7171
self.url = url
72-
self.parsedResponseHeader = _HTTPURLProtocol._ParsedResponseHeader()
72+
self.parsedResponseHeader = _NativeProtocol._ParsedResponseHeader()
7373
self.response = nil
7474
self.requestBodySource = bodySource
7575
self.bodyDataDrain = bodyDataDrain
7676
}
7777
}
78-
79-
extension _HTTPURLProtocol._HTTPTransferState {
80-
enum _Error: Error {
81-
case parseSingleLineError
82-
case parseCompleteHeaderError
83-
}
78+
// specific to HTTP protocol
79+
extension _HTTPURLProtocol._TransferState {
8480
/// Appends a header line
8581
///
8682
/// Will set the complete response once the header is complete, i.e. the
8783
/// return value's `isHeaderComplete` will then by `true`.
8884
///
8985
/// - Throws: When a parsing error occurs
90-
func byAppending(headerLine data: Data) throws -> _HTTPURLProtocol._HTTPTransferState {
86+
func byAppending(headerLine data: Data) throws -> _NativeProtocol._TransferState {
9187
guard let h = parsedResponseHeader.byAppending(headerLine: data) else {
9288
throw _Error.parseSingleLineError
9389
}
@@ -97,11 +93,20 @@ extension _HTTPURLProtocol._HTTPTransferState {
9793
guard response != nil else {
9894
throw _Error.parseCompleteHeaderError
9995
}
100-
return _HTTPURLProtocol._HTTPTransferState(url: url, parsedResponseHeader: _HTTPURLProtocol._ParsedResponseHeader(), response: response, requestBodySource: requestBodySource, bodyDataDrain: bodyDataDrain)
96+
return _NativeProtocol._TransferState(url: url, parsedResponseHeader: _NativeProtocol._ParsedResponseHeader(), response: response, requestBodySource: requestBodySource, bodyDataDrain: bodyDataDrain)
10197
} else {
102-
return _HTTPURLProtocol._HTTPTransferState(url: url, parsedResponseHeader: h, response: nil, requestBodySource: requestBodySource, bodyDataDrain: bodyDataDrain)
98+
return _NativeProtocol._TransferState(url: url, parsedResponseHeader: h, response: nil, requestBodySource: requestBodySource, bodyDataDrain: bodyDataDrain)
10399
}
104100
}
101+
}
102+
103+
extension _NativeProtocol._TransferState {
104+
105+
enum _Error: Error {
106+
case parseSingleLineError
107+
case parseCompleteHeaderError
108+
}
109+
105110
var isHeaderComplete: Bool {
106111
return response != nil
107112
}
@@ -110,13 +115,13 @@ extension _HTTPURLProtocol._HTTPTransferState {
110115
/// - Important: This will mutate the existing `NSMutableData` that the
111116
/// struct may already have in place -- copying the data is too
112117
/// expensive. This behaviour
113-
func byAppending(bodyData buffer: Data) -> _HTTPURLProtocol._HTTPTransferState {
118+
func byAppending(bodyData buffer: Data) -> _NativeProtocol._TransferState {
114119
switch bodyDataDrain {
115120
case .inMemory(let bodyData):
116121
let data: NSMutableData = bodyData ?? NSMutableData()
117122
data.append(buffer)
118-
let drain = _HTTPURLProtocol._DataDrain.inMemory(data)
119-
return _HTTPURLProtocol._HTTPTransferState(url: url, parsedResponseHeader: parsedResponseHeader, response: response, requestBodySource: requestBodySource, bodyDataDrain: drain)
123+
let drain = _NativeProtocol._DataDrain.inMemory(data)
124+
return _NativeProtocol._TransferState(url: url, parsedResponseHeader: parsedResponseHeader, response: response, requestBodySource: requestBodySource, bodyDataDrain: drain)
120125
case .toFile(_, let fileHandle):
121126
//TODO: Create / open the file for writing
122127
// Append to the file
@@ -131,7 +136,7 @@ extension _HTTPURLProtocol._HTTPTransferState {
131136
///
132137
/// This can be used to either set the initial body source, or to reset it
133138
/// e.g. when restarting a transfer.
134-
func bySetting(bodySource newSource: _BodySource) -> _HTTPURLProtocol._HTTPTransferState {
135-
return _HTTPURLProtocol._HTTPTransferState(url: url, parsedResponseHeader: parsedResponseHeader, response: response, requestBodySource: newSource, bodyDataDrain: bodyDataDrain)
139+
func bySetting(bodySource newSource: _BodySource) -> _NativeProtocol._TransferState {
140+
return _NativeProtocol._TransferState(url: url, parsedResponseHeader: parsedResponseHeader, response: response, requestBodySource: newSource, bodyDataDrain: bodyDataDrain)
136141
}
137142
}

Foundation/URLSession/http/HTTPURLProtocol.swift

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -416,21 +416,21 @@ internal extension _HTTPURLProtocol {
416416
extension _HTTPURLProtocol {
417417

418418
/// Creates a new transfer state with the given behaviour:
419-
func createTransferState(url: URL, workQueue: DispatchQueue) -> _HTTPTransferState {
419+
func createTransferState(url: URL, workQueue: DispatchQueue) -> _TransferState {
420420
let drain = createTransferBodyDataDrain()
421421
guard let t = task else { fatalError("Cannot create transfer state") }
422422
switch t.body {
423423
case .none:
424-
return _HTTPTransferState(url: url, bodyDataDrain: drain)
424+
return _TransferState(url: url, bodyDataDrain: drain)
425425
case .data(let data):
426426
let source = _BodyDataSource(data: data)
427-
return _HTTPTransferState(url: url, bodyDataDrain: drain, bodySource: source)
427+
return _TransferState(url: url, bodyDataDrain: drain, bodySource: source)
428428
case .file(let fileURL):
429429
let source = _BodyFileSource(fileURL: fileURL, workQueue: workQueue, dataAvailableHandler: { [weak self] in
430430
// Unpause the easy handle
431431
self?.easyHandle.unpauseSend()
432432
})
433-
return _HTTPTransferState(url: url, bodyDataDrain: drain, bodySource: source)
433+
return _TransferState(url: url, bodyDataDrain: drain, bodySource: source)
434434
case .stream:
435435
NSUnimplemented()
436436
}
@@ -585,9 +585,9 @@ extension _HTTPURLProtocol {
585585
case initial
586586
/// The easy handle has been fully configured. But it is not added to
587587
/// the multi handle.
588-
case transferReady(_HTTPTransferState)
588+
case transferReady(_TransferState)
589589
/// The easy handle is currently added to the multi handle
590-
case transferInProgress(_HTTPTransferState)
590+
case transferInProgress(_TransferState)
591591
/// The transfer completed.
592592
///
593593
/// The easy handle has been removed from the multi handle. This does
@@ -610,7 +610,7 @@ extension _HTTPURLProtocol {
610610
/// we received a complete header), we need to wait for the delegate to
611611
/// let us know what action to take. In this state the easy handle is
612612
/// paused in order to suspend delegate callbacks.
613-
case waitingForResponseCompletionHandler(_HTTPTransferState)
613+
case waitingForResponseCompletionHandler(_TransferState)
614614
/// The task is completed
615615
///
616616
/// Contrast this with `.transferCompleted`.
@@ -779,7 +779,7 @@ internal extension _HTTPURLProtocol {
779779
func didReceiveResponse() {
780780
guard let _ = task as? URLSessionDataTask else { return }
781781
guard case .transferInProgress(let ts) = self.internalState else { fatalError("Transfer not in progress.") }
782-
guard let response = ts.response else { fatalError("Header complete, but not URL response.") }
782+
guard let response = ts.response as? HTTPURLResponse else { fatalError("Header complete, but not URL response.") }
783783
guard let session = task?.session as? URLSession else { fatalError() }
784784
switch session.behaviour(for: self.task!) {
785785
case .noDelegate:
@@ -857,9 +857,12 @@ internal extension _HTTPURLProtocol {
857857
}
858858

859859
/// What action to take
860-
func completionAction(forCompletedRequest request: URLRequest, response: HTTPURLResponse) -> _CompletionAction {
860+
func completionAction(forCompletedRequest request: URLRequest, response: URLResponse) -> _CompletionAction {
861+
guard let httpURLResponse = response as? HTTPURLResponse else {
862+
fatalError("Reponse was not HTTPURLResponse")
863+
}
861864
// Redirect:
862-
if let request = redirectRequest(for: response, fromRequest: request) {
865+
if let request = redirectRequest(for: httpURLResponse, fromRequest: request) {
863866
return .redirectWithRequest(request)
864867
}
865868
return .completeTask

0 commit comments

Comments
 (0)