@@ -253,79 +253,82 @@ struct reader_op {
253
253
254
254
Conn* conn_;
255
255
Logger logger_;
256
- std::pair<tribool, std::size_t > res_{std::make_pair (std::make_optional ( false ) , 0 )};
256
+ std::pair<tribool, std::size_t > res_{std::make_pair (std::nullopt , 0 )};
257
257
asio::coroutine coro{};
258
258
259
259
template <class Self >
260
260
void operator ()(Self& self, system::error_code ec = {}, std::size_t n = 0 )
261
261
{
262
- ignore_unused (n);
263
-
264
262
BOOST_ASIO_CORO_REENTER (coro) for (;;)
265
263
{
266
264
// Appends some data to the buffer if necessary.
267
- if (!res_.first .has_value () || conn_->mpx_ .is_data_needed ()) {
268
- if (conn_->use_ssl ()) {
269
- BOOST_ASIO_CORO_YIELD
270
- async_append_some (
271
- conn_->next_layer (),
272
- dyn_buffer_type{conn_->mpx_ .get_read_buffer (), conn_->cfg_ .max_read_size },
273
- conn_->mpx_ .get_parser ().get_suggested_buffer_growth (buffer_growth_hint),
274
- std::move (self));
275
- } else {
276
- BOOST_ASIO_CORO_YIELD
277
- async_append_some (
278
- conn_->next_layer ().next_layer (),
279
- dyn_buffer_type{conn_->mpx_ .get_read_buffer (), conn_->cfg_ .max_read_size },
280
- conn_->mpx_ .get_parser ().get_suggested_buffer_growth (buffer_growth_hint),
281
- std::move (self));
282
- }
283
-
284
- logger_.on_read (ec, n);
285
-
286
- // The connection is not viable after an error.
287
- if (ec) {
288
- logger_.trace (" reader_op (1)" , ec);
289
- conn_->cancel (operation::run);
290
- self.complete (ec);
291
- return ;
292
- }
293
-
294
- // Somebody might have canceled implicitly or explicitly
295
- // while we were suspended and after queueing so we have to
296
- // check.
297
- if (!conn_->is_open ()) {
298
- logger_.trace (" reader_op (2): connection is closed." );
299
- self.complete (ec);
300
- return ;
301
- }
265
+ if (conn_->use_ssl ()) {
266
+ BOOST_ASIO_CORO_YIELD
267
+ async_append_some (
268
+ conn_->next_layer (),
269
+ dyn_buffer_type{conn_->mpx_ .get_read_buffer (), conn_->cfg_ .max_read_size },
270
+ conn_->mpx_ .get_parser ().get_suggested_buffer_growth (buffer_growth_hint),
271
+ std::move (self));
272
+ } else {
273
+ BOOST_ASIO_CORO_YIELD
274
+ async_append_some (
275
+ conn_->next_layer ().next_layer (),
276
+ dyn_buffer_type{conn_->mpx_ .get_read_buffer (), conn_->cfg_ .max_read_size },
277
+ conn_->mpx_ .get_parser ().get_suggested_buffer_growth (buffer_growth_hint),
278
+ std::move (self));
302
279
}
303
280
304
- res_ = conn_->mpx_ .commit_read (ec);
281
+ logger_.on_read (ec, n);
282
+
283
+ // The connection is not viable after an error.
305
284
if (ec) {
306
- logger_.trace (" reader_op (3 )" , ec);
285
+ logger_.trace (" reader_op (1 )" , ec);
307
286
conn_->cancel (operation::run);
308
287
self.complete (ec);
309
288
return ;
310
289
}
311
290
312
- if (res_.first .has_value () && res_.first .value ()) {
313
- if (!conn_->receive_channel_ .try_send (ec, res_.second )) {
314
- BOOST_ASIO_CORO_YIELD
315
- conn_->receive_channel_ .async_send (ec, res_.second , std::move (self));
316
- }
291
+ // The connection might have been canceled while this op was
292
+ // suspended or after queueing so we have to check.
293
+ if (!conn_->is_open ()) {
294
+ logger_.trace (" reader_op (2): connection is closed." );
295
+ self.complete (ec);
296
+ return ;
297
+ }
298
+
299
+ while (!conn_->mpx_ .get_read_buffer ().empty ()) {
300
+ res_ = conn_->mpx_ .consume_next (ec);
317
301
318
302
if (ec) {
319
- logger_.trace (" reader_op (4 )" , ec);
303
+ logger_.trace (" reader_op (3 )" , ec);
320
304
conn_->cancel (operation::run);
321
305
self.complete (ec);
322
306
return ;
323
307
}
324
308
325
- if (!conn_->is_open ()) {
326
- logger_.trace (" reader_op (5): connection is closed." );
327
- self.complete (asio::error::operation_aborted);
328
- return ;
309
+ if (!res_.first .has_value ()) {
310
+ // More data is needed.
311
+ break ;
312
+ }
313
+
314
+ if (res_.first .value ()) {
315
+ if (!conn_->receive_channel_ .try_send (ec, res_.second )) {
316
+ BOOST_ASIO_CORO_YIELD
317
+ conn_->receive_channel_ .async_send (ec, res_.second , std::move (self));
318
+ }
319
+
320
+ if (ec) {
321
+ logger_.trace (" reader_op (4)" , ec);
322
+ conn_->cancel (operation::run);
323
+ self.complete (ec);
324
+ return ;
325
+ }
326
+
327
+ if (!conn_->is_open ()) {
328
+ logger_.trace (" reader_op (5): connection is closed." );
329
+ self.complete (asio::error::operation_aborted);
330
+ return ;
331
+ }
329
332
}
330
333
}
331
334
}
0 commit comments