102 lines
2.5 KiB
C++
102 lines
2.5 KiB
C++
#include <seafire/protocol/response.hxx>
|
|
|
|
#include <asio.hpp>
|
|
|
|
namespace seafire::protocol
|
|
{
|
|
|
|
/// Construct a new response message.
|
|
///
|
|
response_t::
|
|
response_t() = default;
|
|
|
|
/// Construct a new response message.
|
|
///
|
|
/// \param version The HTTP version of this response message.
|
|
/// \param status The HTTP status of this response message.
|
|
///
|
|
response_t::
|
|
response_t(version_t version, status_code_t status)
|
|
: message_t{version},
|
|
status_{status}
|
|
{}
|
|
|
|
/// Access the message status.
|
|
///
|
|
status_code_t const&
|
|
response_t::
|
|
status() const
|
|
{
|
|
return status_;
|
|
}
|
|
|
|
/// Set the message status.
|
|
///
|
|
void
|
|
response_t::
|
|
set_status(status_code_t status)
|
|
{
|
|
status_ = std::move(status);
|
|
}
|
|
|
|
/// Convert an HTTP response message to byte buffers.
|
|
///
|
|
/// The buffers are invalidated when the response message is destroyed
|
|
/// or any of its properties are modified.
|
|
///
|
|
/// The buffers are added to the \a buffers vector.
|
|
///
|
|
/// \relatesalso response_t
|
|
///
|
|
void
|
|
to_buffers(common::io::const_buffers_t& buffers, response_t const& r)
|
|
{
|
|
static char const colon_space[]{':', ' '};
|
|
static char const crlf[]{'\r', '\n'};
|
|
static char const digits[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
|
|
static char const space[]{' '};
|
|
|
|
using common::io::buffer;
|
|
|
|
to_buffers(buffers, r.version());
|
|
buffers.emplace_back(buffer(space));
|
|
|
|
auto code = r.status();
|
|
|
|
buffers.emplace_back(buffer(&digits[code / 100], 1));
|
|
buffers.emplace_back(buffer(&digits[code % 100 / 10], 1));
|
|
buffers.emplace_back(buffer(&digits[code % 10], 1));
|
|
buffers.emplace_back(buffer(" ", 1));
|
|
|
|
buffers.emplace_back(buffer(r.status().reason()));
|
|
buffers.emplace_back(buffer(crlf));
|
|
|
|
for (auto const& header : r.headers()) {
|
|
buffers.emplace_back(buffer(header.first));
|
|
buffers.emplace_back(buffer(colon_space));
|
|
buffers.emplace_back(buffer(header.second));
|
|
buffers.emplace_back(buffer(crlf));
|
|
}
|
|
|
|
buffers.emplace_back(buffer(crlf));
|
|
}
|
|
|
|
/// Convert an HTTP response message to byte buffers.
|
|
///
|
|
/// The buffers are invalidated when the response message is destroyed
|
|
/// or any of its properties are modified.
|
|
///
|
|
/// The buffers are returned as an array of buffers.
|
|
///
|
|
/// \relatesalso response_t
|
|
///
|
|
common::io::const_buffers_t
|
|
to_buffers(response_t const& r)
|
|
{
|
|
common::io::const_buffers_t buffers;
|
|
to_buffers(buffers, r);
|
|
return buffers;
|
|
}
|
|
|
|
} // namespace seafire::protocol
|