diff --git a/fio-stl.h b/fio-stl.h index ed1dcd1..cbc7aab 100644 --- a/fio-stl.h +++ b/fio-stl.h @@ -45169,6 +45169,7 @@ struct fio___http_connection_http_s { void (*on_http)(fio_http_s *h); void (*on_finish)(fio_http_s *h); fio_http1_parser_s parser; + fio_str_info_s buf; uint32_t max_header; }; struct fio___http_connection_ws_s { @@ -46118,7 +46119,9 @@ FIO_SFUNC void fio___http_controller_http1_send_headers(fio_http_s *h) { "transfer-encoding: chunked\r\n", 28); fio_string_write(&buf, FIO_STRING_REALLOC, "\r\n", 2); - /* send data (move memory ownership) */ + /* send data (move memory ownership)? */ + c->state.http.buf = buf; + return; fio_io_write2(c->io, .buf = buf.buf, .len = buf.len, @@ -46134,6 +46137,21 @@ FIO_SFUNC void fio___http_controller_http1_write_body( goto no_write_err; if (fio_http_is_streaming(h)) goto stream_chunk; + if (c->state.http.buf.len && args.buf && args.len) { + fio_string_write(&c->state.http.buf, + FIO_STRING_REALLOC, + (char *)args.buf + args.offset, + args.len); + if (args.dealloc) + args.dealloc((void *)args.buf); + fio_io_write2(c->io, + .buf = (void *)c->state.http.buf.buf, + .len = c->state.http.buf.len, + .dealloc = FIO_STRING_FREE); + c->state.http.buf = FIO_STR_INFO0; + return; + } + fio_io_write2(c->io, .buf = (void *)args.buf, .fd = args.fd, @@ -46180,6 +46198,14 @@ FIO_SFUNC void fio___http_controller_http1_on_finish_task(void *c_, void *upgraded) { fio___http_connection_s *c = (fio___http_connection_s *)c_; c->suspend = 0; + if (c->state.http.buf.len) { + fio_io_write2(c->io, + .buf = (void *)c->state.http.buf.buf, + .len = c->state.http.buf.len, + .dealloc = FIO_STRING_FREE); + c->state.http.buf = FIO_STR_INFO0; + } + if (upgraded) goto upgraded; @@ -46938,6 +46964,10 @@ FIO_SFUNC void fio__http_controller_on_destroyed(fio_http_s *h) { fio_http_write_args_s args = {.finish = 1}; /* never sets upgrade flag */ fio_http_write FIO_NOOP(h, args); } + fio___http_connection_s *c = (fio___http_connection_s *)fio_http_cdata(h); + if (c->state.http.buf.buf) + FIO_STRING_FREE2(c->state.http.buf); + c->state.http.buf = FIO_STR_INFO0; fio_queue_push(fio_io_queue(), fio___http_controller_on_destroyed_task, fio_http_cdata(h)); diff --git a/fio-stl/249 reference counter.h b/fio-stl/249 reference counter.h index ebba4d5..5ffd11b 100644 --- a/fio-stl/249 reference counter.h +++ b/fio-stl/249 reference counter.h @@ -182,7 +182,7 @@ IFUNC FIO_REF_TYPE_PTR FIO_NAME(FIO_REF_NAME, FIO_REF_CONSTRUCTOR)(void) { FIO_LEAK_COUNTER_ON_ALLOC(FIO_REF_NAME); o->ref = 1; #ifdef FIO_REF_FLEX_TYPE - o->flx_size = members; + o->flx_size = (uint32_t)members; #endif FIO_REF_METADATA_INIT((o->metadata)); FIO_REF_TYPE *ret = (FIO_REF_TYPE *)(o + 1); diff --git a/fio-stl/431 http handle.h b/fio-stl/431 http handle.h index aa70baf..940390a 100644 --- a/fio-stl/431 http handle.h +++ b/fio-stl/431 http handle.h @@ -1119,7 +1119,7 @@ static void fio___http_str_cached_init(void) { FIO___HTTP_STATIC_CACHE_IMAP, FIO___HTTP_STATIC_CACHE_CAPA_BITS, (void *)&obj, - hash, + (uint32_t)hash, fio___http_str_cached_cmp, FIO___HTTP_STATIC_CACHE_STEP_LIMIT); FIO_ASSERT(!pos.is_valid && pos.ipos < FIO___HTTP_STATIC_CACHE_CAPA && diff --git a/fio-stl/439 http.h b/fio-stl/439 http.h index 2c040bc..9fe5362 100644 --- a/fio-stl/439 http.h +++ b/fio-stl/439 http.h @@ -444,6 +444,7 @@ struct fio___http_connection_http_s { void (*on_http)(fio_http_s *h); void (*on_finish)(fio_http_s *h); fio_http1_parser_s parser; + fio_str_info_s buf; uint32_t max_header; }; struct fio___http_connection_ws_s { @@ -1393,7 +1394,9 @@ FIO_SFUNC void fio___http_controller_http1_send_headers(fio_http_s *h) { "transfer-encoding: chunked\r\n", 28); fio_string_write(&buf, FIO_STRING_REALLOC, "\r\n", 2); - /* send data (move memory ownership) */ + /* send data (move memory ownership)? */ + c->state.http.buf = buf; + return; fio_io_write2(c->io, .buf = buf.buf, .len = buf.len, @@ -1409,6 +1412,21 @@ FIO_SFUNC void fio___http_controller_http1_write_body( goto no_write_err; if (fio_http_is_streaming(h)) goto stream_chunk; + if (c->state.http.buf.len && args.buf && args.len) { + fio_string_write(&c->state.http.buf, + FIO_STRING_REALLOC, + (char *)args.buf + args.offset, + args.len); + if (args.dealloc) + args.dealloc((void *)args.buf); + fio_io_write2(c->io, + .buf = (void *)c->state.http.buf.buf, + .len = c->state.http.buf.len, + .dealloc = FIO_STRING_FREE); + c->state.http.buf = FIO_STR_INFO0; + return; + } + fio_io_write2(c->io, .buf = (void *)args.buf, .fd = args.fd, @@ -1455,6 +1473,14 @@ FIO_SFUNC void fio___http_controller_http1_on_finish_task(void *c_, void *upgraded) { fio___http_connection_s *c = (fio___http_connection_s *)c_; c->suspend = 0; + if (c->state.http.buf.len) { + fio_io_write2(c->io, + .buf = (void *)c->state.http.buf.buf, + .len = c->state.http.buf.len, + .dealloc = FIO_STRING_FREE); + c->state.http.buf = FIO_STR_INFO0; + } + if (upgraded) goto upgraded; @@ -2213,6 +2239,10 @@ FIO_SFUNC void fio__http_controller_on_destroyed(fio_http_s *h) { fio_http_write_args_s args = {.finish = 1}; /* never sets upgrade flag */ fio_http_write FIO_NOOP(h, args); } + fio___http_connection_s *c = (fio___http_connection_s *)fio_http_cdata(h); + if (c->state.http.buf.buf) + FIO_STRING_FREE2(c->state.http.buf); + c->state.http.buf = FIO_STR_INFO0; fio_queue_push(fio_io_queue(), fio___http_controller_on_destroyed_task, fio_http_cdata(h));