in Sources/NIOPosix/NonBlockingFileIO.swift [181:217]
func _read(remainingReads: Int, bytesReadSoFar: Int64) {
if remainingReads > 1 || (remainingReads == 1 && lastReadSize > 0) {
let readSize = remainingReads > 1 ? chunkSize : lastReadSize
assert(readSize > 0)
let readFuture = self.read0(fileHandle: fileHandle,
fromOffset: fromOffset.map { $0 + bytesReadSoFar },
byteCount: readSize,
allocator: allocator,
eventLoop: eventLoop)
readFuture.whenComplete { (result) in
switch result {
case .success(let buffer):
guard buffer.readableBytes > 0 else {
// EOF, call `chunkHandler` one more time.
let handlerFuture = chunkHandler(buffer)
handlerFuture.cascade(to: promise)
return
}
let bytesRead = Int64(buffer.readableBytes)
chunkHandler(buffer).whenComplete { result in
switch result {
case .success(_):
eventLoop.assertInEventLoop()
_read(remainingReads: remainingReads - 1,
bytesReadSoFar: bytesReadSoFar + bytesRead)
case .failure(let error):
promise.fail(error)
}
}
case .failure(let error):
promise.fail(error)
}
}
} else {
promise.succeed(())
}
}