@@ -346,9 +346,8 @@ manapi::future<void> manapi::net::http::internal::send_response_proxy(uq_handle_
346
346
auto rhs = co_await cdata->worker ->fwrite (cdata->conn , buffer,
347
347
size, content_length <= size);
348
348
349
- if (rhs < 0 ) {
349
+ if (rhs < 0 )
350
350
co_return -1 ;
351
- }
352
351
353
352
content_length -= rhs;
354
353
co_return rhs;
@@ -452,22 +451,28 @@ void manapi::net::http::internal::send_response_sync_cb(uq_handle_data_t cdata,
452
451
}
453
452
454
453
if (result && *result >= 0 ) {
455
- const ssize_t reserved = res->config ()->buffer_size ;
456
454
auto cb_sync = std::make_unique<http::response::resp_callback_sync>(std::move (res->callback_sync ()));
457
- manapi::async::run ([res = std::move (res), cb_sync = std::move (cb_sync), reserved, cdata = std::move (cdata)] () mutable
455
+ manapi::async::run ([res = std::move (res), cb_sync = std::move (cb_sync), cdata = std::move (cdata)] () mutable
458
456
-> manapi::future<> {
459
- // TODO: speed up
460
- std::string buffer;
461
- buffer.reserve (reserved);
457
+ auto buffer = manapi::async::current ()->memory_fabric ().buffer (res->config ()->buffer_size );
462
458
463
459
bool finish = false ;
460
+ std::size_t cursor = 0 ;
464
461
465
462
while (!finish) {
466
- auto rhs = cb_sync->operator ()(buffer.data (), reserved , finish);
463
+ auto rhs = cb_sync->operator ()(buffer.data () + cursor, buffer. size () - cursor , finish);
467
464
if (rhs < 0 ) {
468
465
THROW_MANAPIHTTP_EXCEPTION2 (ERR_INVALID_ARGUMENT, " The callback returned an invalid length" );
469
466
}
470
- co_await cdata->worker ->fwrite (cdata->conn , buffer.data (), rhs, finish);
467
+ rhs = co_await cdata->worker ->write (cdata->conn , buffer.data () + cursor, rhs, finish);
468
+
469
+ if (rhs <= 0 )
470
+ co_return ;
471
+
472
+ cursor += rhs;
473
+
474
+ if (buffer.size () == cursor)
475
+ cursor = 0 ;
471
476
}
472
477
});
473
478
}
@@ -526,25 +531,27 @@ void manapi::net::http::internal::send_response_async_cb(uq_handle_data_t cdata,
526
531
}
527
532
528
533
if (result && *result >= 0 ) {
529
- auto reserved = res->config ()->buffer_size ;
530
534
auto cb_async = std::make_unique<http::response::resp_callback_async>(std::move (res->callback_async ()));
531
- manapi::async::run ([reserved , cb_async = std::move (cb_async), cdata = std::move (cdata)] () mutable
535
+ manapi::async::run ([res = std::move (res) , cb_async = std::move (cb_async), cdata = std::move (cdata)] () mutable
532
536
-> manapi::future<> {
533
- // TODO: speed up
534
- std::string buffer;
535
- buffer.reserve (reserved);
536
-
537
+ auto buffer = manapi::async::current ()->memory_fabric ().buffer (res->config ()->buffer_size );
537
538
539
+ std::size_t cursor = 0 ;
538
540
bool finish = false ;
539
541
540
542
while (!finish) {
541
- auto rhs = co_await cb_async->operator ()(buffer.data (), reserved , finish);
542
- if (rhs < 0 ) {
543
+ auto rhs = co_await cb_async->operator ()(buffer.data () + cursor, buffer. size () - cursor , finish);
544
+ if (rhs < 0 )
543
545
THROW_MANAPIHTTP_EXCEPTION2 (ERR_INVALID_ARGUMENT, " The callback returned an invalid length" );
544
- }
545
- if (rhs != co_await cdata->worker ->fwrite (cdata->conn , buffer.data (), rhs, finish)) {
546
- THROW_MANAPIHTTP_EXCEPTION2 (ERR_ABORTED, " Write failed" );
547
- }
546
+
547
+ rhs = co_await cdata->worker ->write (cdata->conn , buffer.data () + cursor, rhs, finish);
548
+ if (rhs <= 0 )
549
+ co_return ;
550
+
551
+ cursor += rhs;
552
+
553
+ if (cursor == buffer.size ())
554
+ cursor = 0 ;
548
555
}
549
556
});
550
557
}
0 commit comments