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