0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-11 14:38:57 +02:00

ircd::resource::response::chunked: Support user-supplied buffer constructions.

This commit is contained in:
Jason Volk 2020-12-15 11:44:46 -08:00
parent 853064120d
commit 6f66ff5bac
2 changed files with 43 additions and 14 deletions

View file

@ -87,7 +87,8 @@ struct ircd::resource::response::chunked
static conf::item<size_t> default_buffer_size;
client *c {nullptr};
unique_buffer<mutable_buffer> buf;
unique_mutable_buffer _buf;
mutable_buffer buf;
size_t flushed {0};
size_t wrote {0};
uint count {0};
@ -99,10 +100,10 @@ struct ircd::resource::response::chunked
std::function<const_buffer (const const_buffer &)> flusher();
chunked(client &, const http::code &, const string_view &content_type, const string_view &headers = {}, const size_t &buffer_size = default_buffer_size);
chunked(client &, const http::code &, const string_view &content_type, const vector_view<const http::header> &, const size_t &buffer_size = default_buffer_size);
chunked(client &, const http::code &, const vector_view<const http::header> &, const size_t &buffer_size = default_buffer_size);
chunked(client &, const http::code &, const size_t &buffer_size = default_buffer_size);
chunked(client &, const http::code &, const string_view &content_type, const string_view &headers = {}, const size_t &buffer_size = default_buffer_size, const mutable_buffer & = {});
chunked(client &, const http::code &, const string_view &content_type, const vector_view<const http::header> &, const size_t &buffer_size = default_buffer_size, const mutable_buffer & = {});
chunked(client &, const http::code &, const vector_view<const http::header> &, const size_t &buffer_size = default_buffer_size, const mutable_buffer & = {});
chunked(client &, const http::code &, const size_t &buffer_size = default_buffer_size, const mutable_buffer & = {});
chunked() = default;
chunked(chunked &&) = delete;
chunked(const chunked &) = delete;

View file

@ -692,10 +692,16 @@ const
ircd::resource::response::chunked::chunked(client &client,
const http::code &code,
const size_t &buffer_size)
const size_t &buffer_size,
const mutable_buffer &buf)
:chunked
{
client, code, "application/json; charset=utf-8"_sv, string_view{}, buffer_size
client,
code,
"application/json; charset=utf-8"_sv,
string_view{},
buffer_size,
buf,
}
{
}
@ -703,10 +709,16 @@ ircd::resource::response::chunked::chunked(client &client,
ircd::resource::response::chunked::chunked(client &client,
const http::code &code,
const vector_view<const http::header> &headers,
const size_t &buffer_size)
const size_t &buffer_size,
const mutable_buffer &buf)
:chunked
{
client, code, "application/json; charset=utf-8"_sv, headers, buffer_size
client,
code,
"application/json; charset=utf-8"_sv,
headers,
buffer_size,
buf,
}
{
}
@ -715,7 +727,8 @@ ircd::resource::response::chunked::chunked(client &client,
const http::code &code,
const string_view &content_type,
const vector_view<const http::header> &headers,
const size_t &buffer_size)
const size_t &buffer_size,
const mutable_buffer &buf)
:chunked
{
client,
@ -727,13 +740,15 @@ ircd::resource::response::chunked::chunked(client &client,
// copied again before the response goes out from resource::response.
// There must not be any context switch between now and that copy so
// we can return a string_view of this TLS buffer.
const critical_assertion ca;
thread_local char buffer[4_KiB];
window_buffer sb{buffer};
http::write(sb, headers);
return string_view{sb.completed()};
}(),
buffer_size
buffer_size,
buf,
}
{
}
@ -749,21 +764,34 @@ ircd::resource::response::chunked::chunked(client &client,
const http::code &code,
const string_view &content_type,
const string_view &headers,
const size_t &buffer_size)
const size_t &buffer_size,
const mutable_buffer &buf)
:response
{
client, code, content_type, size_t(-1), headers
client,
code,
content_type,
size_t(-1),
headers
}
,c
{
&client
}
,buf
,_buf
{
buffer_size
}
,buf
{
buffer_size? _buf: buf
}
{
assert(!empty(content_type));
assert(buffer_size > 0 || empty(_buf));
assert(buffer_size > 0 || !empty(buf));
assert(buffer_size == 0 || empty(buf));
assert(buffer_size == 0 || !empty(_buf));
}
ircd::resource::response::chunked::~chunked()