@@ -1149,23 +1149,144 @@ struct CollectEverythingLogHandler: LogHandler {
1149
1149
}
1150
1150
}
1151
1151
1152
+ class StreamDelegate : HTTPClientResponseDelegate {
1153
+ typealias Response = Void
1154
+
1155
+ enum State {
1156
+ case idle
1157
+ case waitingForBytes( EventLoopPromise < ByteBuffer ? > )
1158
+ case buffering( ByteBuffer , done: Bool )
1159
+ case failed( Error )
1160
+ case finished
1161
+ }
1162
+
1163
+ let eventLoop : EventLoop
1164
+ private var state : State = . idle
1165
+
1166
+ init ( eventLoop: EventLoop ) {
1167
+ self . eventLoop = eventLoop
1168
+ }
1169
+
1170
+ func next( ) -> EventLoopFuture < ByteBuffer ? > {
1171
+ if self . eventLoop. inEventLoop {
1172
+ return self . next0 ( )
1173
+ } else {
1174
+ return self . eventLoop. flatSubmit {
1175
+ self . next0 ( )
1176
+ }
1177
+ }
1178
+ }
1179
+
1180
+ private func next0( ) -> EventLoopFuture < ByteBuffer ? > {
1181
+ switch self . state {
1182
+ case . idle:
1183
+ let promise = self . eventLoop. makePromise ( of: ByteBuffer ? . self)
1184
+ self . state = . waitingForBytes( promise)
1185
+ return promise. futureResult
1186
+
1187
+ case . buffering( let byteBuffer, done: false ) :
1188
+ self . state = . idle
1189
+ return self . eventLoop. makeSucceededFuture ( byteBuffer)
1190
+
1191
+ case . buffering( let byteBuffer, done: true ) :
1192
+ self . state = . finished
1193
+ return self . eventLoop. makeSucceededFuture ( byteBuffer)
1194
+
1195
+ case . waitingForBytes:
1196
+ preconditionFailure ( " Don't call `.next` twice " )
1197
+
1198
+ case . failed( let error) :
1199
+ self . state = . finished
1200
+ return self . eventLoop. makeFailedFuture ( error)
1201
+
1202
+ case . finished:
1203
+ return self . eventLoop. makeSucceededFuture ( nil )
1204
+ }
1205
+ }
1206
+
1207
+ // MARK: HTTPClientResponseDelegate
1208
+
1209
+ func didSendRequestHead( task: HTTPClient . Task < Response > , _ head: HTTPRequestHead ) {
1210
+ XCTAssert ( self . eventLoop. inEventLoop)
1211
+ }
1212
+
1213
+ func didSendRequestPart( task: HTTPClient . Task < Response > , _ part: IOData ) {
1214
+ XCTAssert ( self . eventLoop. inEventLoop)
1215
+ }
1216
+
1217
+ func didSendRequest( task: HTTPClient . Task < Response > ) {
1218
+ XCTAssert ( self . eventLoop. inEventLoop)
1219
+ }
1220
+
1221
+ func didReceiveHead( task: HTTPClient . Task < Response > , _ head: HTTPResponseHead ) -> EventLoopFuture < Void > {
1222
+ XCTAssert ( self . eventLoop. inEventLoop)
1223
+ return task. eventLoop. makeSucceededVoidFuture ( )
1224
+ }
1225
+
1226
+ func didReceiveBodyPart( task: HTTPClient . Task < Response > , _ buffer: ByteBuffer ) -> EventLoopFuture < Void > {
1227
+ XCTAssert ( self . eventLoop. inEventLoop)
1228
+
1229
+ switch self . state {
1230
+ case . idle:
1231
+ self . state = . buffering( buffer, done: false )
1232
+ case . waitingForBytes( let promise) :
1233
+ self . state = . idle
1234
+ promise. succeed ( buffer)
1235
+ case . buffering( var byteBuffer, done: false ) :
1236
+ var buffer = buffer
1237
+ byteBuffer. writeBuffer ( & buffer)
1238
+ self . state = . buffering( byteBuffer, done: false )
1239
+ case . buffering( _, done: true ) , . finished, . failed:
1240
+ preconditionFailure ( " Invalid state: \( self . state) " )
1241
+ }
1242
+
1243
+ return task. eventLoop. makeSucceededVoidFuture ( )
1244
+ }
1245
+
1246
+ func didReceiveError( task: HTTPClient . Task < Response > , _ error: Error ) {
1247
+ XCTAssert ( self . eventLoop. inEventLoop)
1248
+
1249
+ switch self . state {
1250
+ case . idle:
1251
+ self . state = . failed( error)
1252
+ case . waitingForBytes( let promise) :
1253
+ self . state = . finished
1254
+ promise. fail ( error)
1255
+ case . buffering( _, done: false ) :
1256
+ self . state = . failed( error)
1257
+ case . buffering( _, done: true ) , . finished, . failed:
1258
+ preconditionFailure ( " Invalid state: \( self . state) " )
1259
+ }
1260
+ }
1261
+
1262
+ func didFinishRequest( task: HTTPClient . Task < Response > ) throws {
1263
+ XCTAssert ( self . eventLoop. inEventLoop)
1264
+
1265
+ switch self . state {
1266
+ case . idle:
1267
+ self . state = . finished
1268
+ case . waitingForBytes( let promise) :
1269
+ self . state = . finished
1270
+ promise. succeed ( nil )
1271
+ case . buffering( let byteBuffer, done: false ) :
1272
+ self . state = . buffering( byteBuffer, done: true )
1273
+ case . buffering( _, done: true ) , . finished, . failed:
1274
+ preconditionFailure ( " Invalid state: \( self . state) " )
1275
+ }
1276
+ }
1277
+ }
1278
+
1152
1279
class HTTPEchoHandler : ChannelInboundHandler {
1153
1280
typealias InboundIn = HTTPServerRequestPart
1154
1281
typealias OutboundOut = HTTPServerResponsePart
1155
1282
1156
- var promises : CircularBuffer < EventLoopPromise < Void > > = CircularBuffer ( )
1157
-
1158
1283
func channelRead( context: ChannelHandlerContext , data: NIOAny ) {
1159
1284
let request = self . unwrapInboundIn ( data)
1160
1285
switch request {
1161
1286
case . head:
1162
- context. writeAndFlush ( self . wrapOutboundOut ( . head( . init( version: . init ( major : 1 , minor : 1 ) , status: . ok) ) ) , promise: nil )
1287
+ context. writeAndFlush ( self . wrapOutboundOut ( . head( . init( version: . http1_1 , status: . ok) ) ) , promise: nil )
1163
1288
case . body( let bytes) :
1164
- context. writeAndFlush ( self . wrapOutboundOut ( . body( . byteBuffer( bytes) ) ) ) . whenSuccess {
1165
- if let promise = self . promises. popFirst ( ) {
1166
- promise. succeed ( ( ) )
1167
- }
1168
- }
1289
+ context. writeAndFlush ( self . wrapOutboundOut ( . body( . byteBuffer( bytes) ) ) , promise: nil )
1169
1290
case . end:
1170
1291
context. writeAndFlush ( self . wrapOutboundOut ( . end( nil ) ) , promise: nil )
1171
1292
context. close ( promise: nil )
0 commit comments