2025-03-07 22:15:36 +01:00

147 lines
2.4 KiB
C++

#include <seafire/server/response.hxx>
namespace seafire::server
{
/// Access the response message.
///
protocol::response_t&
response_t::
get_message()
{
return get_response();
}
/// Access the response message.
///
protocol::response_t const&
response_t::
get_message() const
{
return get_response();
}
/// Send response.
///
void
response_t::
send(protocol::status_code_t s)
{
send(s, common::io::const_buffers_t{});
}
/// Send response.
///
void
response_t::
send(protocol::status_code_t s, common::io::const_buffer_t const& content)
{
send(s, common::io::const_buffers_t{content});
}
/// Send response.
///
void
response_t::
send(protocol::status_code_t s, common::io::const_buffers_t const& content)
{
do_send_response(s, content);
}
/// Send response.
///
void
response_t::
send(protocol::status_code_t s, stream_t const& content)
{
send(s, content.rdbuf()->data());
}
/// Send error.
///
void
response_t::
send(common_error_t error)
{
do_send_error(error);
}
/// Allocate a new stream.
///
response_t::stream_t
response_t::
allocate_stream()
{
return stream_t{&memory().alloc_emplace<asio::streambuf>()};
}
/// Access response extensions.
///
common::extension_context_t&
response_t::
extensions()
{
return get_response_extensions();
}
void
response_t::
invoke_finalizer(finalizer_t* f, request_t& r)
{
if (f) {
f->invoke(r, *this);
}
}
response_t::
response_t() = default;
response_t::
~response_t() noexcept = default;
asio::streambuf*
response_t::stream_t::
rdbuf() const
{
return rdbuf_;
}
std::size_t
response_t::stream_t::
size() const
{
return rdbuf_->data().size();
}
response_t::stream_t::
stream_t(asio::streambuf* rdbuf)
: std::iostream{rdbuf ? rdbuf : throw std::invalid_argument{"buf"}},
rdbuf_{rdbuf}
{}
/// Construct a new finalizer.
///
response_t::finalizer_t::
finalizer_t(response_t& r, function_t f)
: response_{r}, f_{f}
{
response_.register_finalizer(this);
}
/// Destroy this finalizer.
///
response_t::finalizer_t::
~finalizer_t() noexcept
{
response_.deregister_finalizer(this);
}
void
response_t::finalizer_t::
invoke(request_t& req, response_t& res)
{
f_(req, res);
}
} // namespace seafire::server