0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 15:33:54 +01:00

ircd::resource::response::chunked: Further elaborate the class.

This commit is contained in:
Jason Volk 2019-09-23 17:09:51 -07:00
parent 35f9810dbd
commit 8ec205b4b5
3 changed files with 37 additions and 13 deletions

View file

@ -88,6 +88,10 @@ struct ircd::resource::response::chunked
client *c {nullptr}; client *c {nullptr};
unique_buffer<mutable_buffer> buf; unique_buffer<mutable_buffer> buf;
size_t flushed {0};
size_t wrote {0};
uint count {0};
bool finished {false};
size_t write(const const_buffer &chunk, const bool &ignore_empty = true); size_t write(const const_buffer &chunk, const bool &ignore_empty = true);
const_buffer flush(const const_buffer &); const_buffer flush(const const_buffer &);
@ -99,8 +103,10 @@ struct ircd::resource::response::chunked
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 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 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 size_t &buffer_size = default_buffer_size);
chunked(const chunked &) = delete;
chunked(chunked &&) = delete;
chunked() = default; chunked() = default;
chunked(chunked &&) = delete;
chunked(const chunked &) = delete;
chunked &operator=(chunked &&) = delete;
chunked &operator=(const chunked &&) = delete;
~chunked() noexcept; ~chunked() noexcept;
}; };

View file

@ -933,7 +933,8 @@ void
ircd::http::writechunk(window_buffer &buf, ircd::http::writechunk(window_buffer &buf,
const uint32_t &chunk_size) const uint32_t &chunk_size)
{ {
writeline(buf, [&chunk_size](const mutable_buffer &out) -> size_t writeline(buf, [&chunk_size]
(const mutable_buffer &out) -> size_t
{ {
return ::snprintf(data(out), size(out), "%08x", chunk_size); return ::snprintf(data(out), size(out), "%08x", chunk_size);
}); });

View file

@ -970,6 +970,7 @@ ircd::resource::response::chunked::finish()
return false; return false;
write(const_buffer{}, false); write(const_buffer{}, false);
assert(finished);
c = nullptr; c = nullptr;
return true; return true;
} }
@ -990,6 +991,8 @@ ircd::resource::response::chunked::flush(const const_buffer &buf)
}; };
assert(flushed <= size(buf)); assert(flushed <= size(buf));
this->flushed += flushed;
assert(this->flushed <= this->wrote);
return const_buffer return const_buffer
{ {
data(buf), flushed data(buf), flushed
@ -1002,20 +1005,34 @@ ircd::resource::response::chunked::write(const const_buffer &chunk,
try try
{ {
assert(size(chunk) <= size(this->buf) || empty(this->buf)); assert(size(chunk) <= size(this->buf) || empty(this->buf));
size_t ret{0}; assert(!finished);
if(!c) if(!c)
return ret; return 0UL;
if(ignore_empty && empty(chunk)) if(empty(chunk) && ignore_empty)
return ret; return 0UL;
char headbuf[32];
const size_t wrote
{
this->wrote
};
//TODO: bring iov from net::socket -> net::write_() -> client::write_() //TODO: bring iov from net::socket -> net::write_() -> client::write_()
char headbuf[32]; const auto head
ret += c->write_all(http::writechunk(headbuf, size(chunk))); {
ret += size(chunk)? c->write_all(chunk) : 0UL; http::writechunk(headbuf, size(chunk))
ret += c->write_all("\r\n"_sv); };
return ret;
this->wrote += c->write_all(head);
this->wrote += !empty(chunk)? c->write_all(chunk) : 0UL;
this->wrote += c->write_all("\r\n"_sv);
finished |= empty(chunk);
count++;
assert(this->wrote >= wrote);
assert(this->wrote >= 2 || !finished);
return this->wrote - wrote;
} }
catch(...) catch(...)
{ {