@@ -95,7 +95,8 @@ extension AsyncRequestBag {
95
95
96
96
enum FailAction {
97
97
case none
98
- case failContinuation( UnsafeContinuation < HTTPClientResponse , Error > , Error , HTTPRequestScheduler ? , HTTPRequestExecutor ? )
98
+ /// fail response before head received. scheduler and executor are exclusive here.
99
+ case failResponseHead( UnsafeContinuation < HTTPClientResponse , Error > , Error , HTTPRequestScheduler ? , HTTPRequestExecutor ? )
99
100
case failResponseStream( UnsafeContinuation < ByteBuffer ? , Error > , Error , HTTPRequestExecutor )
100
101
}
101
102
@@ -106,15 +107,15 @@ extension AsyncRequestBag {
106
107
107
108
case . waiting( let continuation) :
108
109
self . state = . finished( error: error, nil )
109
- return . failContinuation ( continuation, error, nil , nil )
110
+ return . failResponseHead ( continuation, error, nil , nil )
110
111
111
112
case . queued( let continuation, let scheduler) :
112
113
self . state = . finished( error: error, nil )
113
- return . failContinuation ( continuation, error, scheduler, nil )
114
+ return . failResponseHead ( continuation, error, scheduler, nil )
114
115
115
116
case . executing( let context, _, . initialized) :
116
117
self . state = . finished( error: error, nil )
117
- return . failContinuation ( context. continuation, error, nil , context. executor)
118
+ return . failResponseHead ( context. continuation, error, nil , context. executor)
118
119
119
120
case . executing( _, _, . waitingForStream( _, next: . error) ) ,
120
121
. executing( _, _, . buffering( _, _, next: . error) ) :
@@ -165,8 +166,13 @@ extension AsyncRequestBag {
165
166
}
166
167
167
168
// MARK: - Request -
169
+
170
+ enum StartExecutionAction {
171
+ case cancel( HTTPRequestExecutor )
172
+ case none
173
+ }
168
174
169
- mutating func willExecuteRequest( _ executor: HTTPRequestExecutor ) -> Bool {
175
+ mutating func willExecuteRequest( _ executor: HTTPRequestExecutor ) -> StartExecutionAction {
170
176
switch self . state {
171
177
case . waiting( let continuation) , . queued( let continuation, _) :
172
178
let context = ExecutionContext (
@@ -175,9 +181,9 @@ extension AsyncRequestBag {
175
181
continuation: continuation
176
182
)
177
183
self . state = . executing( context, . initialized, . initialized)
178
- return true
184
+ return . none
179
185
case . finished( error: . some, . none) :
180
- return false
186
+ return . cancel ( executor )
181
187
case . initialized,
182
188
. executing,
183
189
. finished( error: . none, _) ,
0 commit comments