13
13
//===----------------------------------------------------------------------===//
14
14
15
15
import Logging
16
- import NIOCore
17
16
import NIOConcurrencyHelpers
18
- import NIOSSL
17
+ import NIOCore
19
18
import NIOHTTP1
19
+ import NIOSSL
20
20
21
21
@available ( macOS 12 . 0 , iOS 15 . 0 , watchOS 8 . 0 , tvOS 15 . 0 , * )
22
22
class AsyncRequestBag {
23
-
24
-
25
23
let logger : Logger
26
24
// TODO: We should drop the request after sending to free up resource ASAP
27
25
let requestHead : HTTPRequestHead
@@ -80,7 +78,7 @@ class AsyncRequestBag {
80
78
let action = self . stateLock. withLock {
81
79
self . state. fail ( error)
82
80
}
83
-
81
+
84
82
switch action {
85
83
case . none:
86
84
break
@@ -89,7 +87,7 @@ class AsyncRequestBag {
89
87
continuation. resume ( throwing: error)
90
88
scheduler? . cancelRequest ( self ) // NOTE: scheduler and executor are exclusive here
91
89
executor? . cancelRequest ( self )
92
-
90
+
93
91
case . failResponseStream( let continuation, let error, let executor) :
94
92
continuation. resume ( throwing: error)
95
93
executor. cancelRequest ( self )
@@ -102,20 +100,20 @@ class AsyncRequestBag {
102
100
let action = self . stateLock. withLock {
103
101
self . state. willExecuteRequest ( executor)
104
102
}
105
-
103
+
106
104
switch action {
107
105
case . cancel( let executor) :
108
106
executor. cancelRequest ( self )
109
107
case . none:
110
108
break
111
109
}
112
110
}
113
-
111
+
114
112
func resumeRequestBodyStream( ) {
115
113
let action = self . stateLock. withLock {
116
114
self . state. resumeRequestBodyStream ( )
117
115
}
118
-
116
+
119
117
switch action {
120
118
case . none:
121
119
break
@@ -137,7 +135,7 @@ class AsyncRequestBag {
137
135
}
138
136
}
139
137
}
140
-
138
+
141
139
private func writeOnceAndOneTimeOnly( byteBuffer: ByteBuffer ) {
142
140
#warning("TODO: @fabianfett")
143
141
let writeAction = self . stateLock. withLock {
@@ -151,23 +149,23 @@ class AsyncRequestBag {
151
149
let finishAction = self . stateLock. withLock {
152
150
self . state. finishRequestBodyStream ( )
153
151
}
154
-
152
+
155
153
guard case . forwardStreamFinished( let executor) = finishAction else {
156
154
preconditionFailure ( " " )
157
155
}
158
156
executor. finishRequestBodyStream ( self )
159
157
}
160
-
158
+
161
159
enum AfterNextBodyPartAction {
162
160
case `continue`
163
161
case pause
164
162
}
165
-
163
+
166
164
private func requestBodyStreamNextPart( _ part: IOData ) -> AfterNextBodyPartAction {
167
165
let writeAction = self . stateLock. withLock {
168
166
self . state. producedNextRequestPart ( part)
169
167
}
170
-
168
+
171
169
switch writeAction {
172
170
case . write( let part, let executor, let continueAfter) :
173
171
executor. writeRequestBodyPart ( part, request: self )
@@ -176,14 +174,14 @@ class AsyncRequestBag {
176
174
} else {
177
175
return . pause
178
176
}
179
-
177
+
180
178
case . ignore:
181
179
// we only ignore reads, if the request has failed anyway. we should leave
182
180
// the reader loop
183
181
return . pause
184
182
}
185
183
}
186
-
184
+
187
185
private func requestBodyStreamFinished( ) {
188
186
let finishAction = self . stateLock. withLock {
189
187
self . state. finishRequestBodyStream ( )
@@ -197,12 +195,12 @@ class AsyncRequestBag {
197
195
}
198
196
return
199
197
}
200
-
198
+
201
199
private func requestBodyStreamFailed( _ error: Error ) {
202
200
let failAction = self . stateLock. withLock {
203
201
self . state. failedToProduceNextRequestPart ( error)
204
202
}
205
-
203
+
206
204
switch failAction {
207
205
case . none:
208
206
break
@@ -275,7 +273,7 @@ class AsyncRequestBag {
275
273
guard let part = try await next ( allocator) else { // <---- dispatch point!
276
274
return self . requestBodyStreamFinished ( )
277
275
}
278
-
276
+
279
277
switch self . requestBodyStreamNextPart ( part) {
280
278
case . pause:
281
279
return
@@ -298,7 +296,7 @@ extension AsyncRequestBag: HTTPSchedulableRequest {
298
296
var tlsConfiguration : TLSConfiguration ? {
299
297
return nil
300
298
}
301
-
299
+
302
300
var requiredEventLoop : EventLoop ? {
303
301
return nil
304
302
}
0 commit comments