forked from boostorg/beast
Refine message class hierarchy:
Two new objects, request_headers and response_headers, represent the portion of HTTP messages excluding the body.
This commit is contained in:
1 parent
cf43f516d2
commit
ada1f60e3e
31 files changed
+569
-487
No files matched your search
@@ -5,13 +5,14 @@
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
#ifndef BEAST_HTTP_IMPL_MESSAGE_V1_IPP
|
||||
#define BEAST_HTTP_IMPL_MESSAGE_V1_IPP
|
||||
#ifndef BEAST_HTTP_IMPL_MESSAGE_IPP
|
||||
#define BEAST_HTTP_IMPL_MESSAGE_IPP
|
||||
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/http/concepts.hpp>
|
||||
#include <beast/http/rfc7230.hpp>
|
||||
#include <beast/core/detail/ci_char_traits.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
@@ -20,9 +21,10 @@ namespace http {
|
||||
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
bool
|
||||
is_keep_alive(message_v1<isRequest, Body, Headers> const& msg)
|
||||
is_keep_alive(message<isRequest, Body, Headers> const& msg)
|
||||
{
|
||||
if(msg.version >= 11)
|
||||
BOOST_ASSERT(msg.version == 10 || msg.version == 11);
|
||||
if(msg.version == 11)
|
||||
{
|
||||
if(token_list{msg.headers["Connection"]}.exists("close"))
|
||||
return false;
|
||||
@@ -35,9 +37,10 @@ is_keep_alive(message_v1<isRequest, Body, Headers> const& msg)
|
||||
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
bool
|
||||
is_upgrade(message_v1<isRequest, Body, Headers> const& msg)
|
||||
is_upgrade(message<isRequest, Body, Headers> const& msg)
|
||||
{
|
||||
if(msg.version < 11)
|
||||
BOOST_ASSERT(msg.version == 10 || msg.version == 11);
|
||||
if(msg.version == 10)
|
||||
return false;
|
||||
if(token_list{msg.headers["Connection"]}.exists("upgrade"))
|
||||
return true;
|
||||
@@ -56,14 +59,14 @@ template<bool isRequest, class Body, class Headers>
|
||||
inline
|
||||
void
|
||||
prepare_options(prepare_info& pi,
|
||||
message_v1<isRequest, Body, Headers>& msg)
|
||||
message<isRequest, Body, Headers>& msg)
|
||||
{
|
||||
}
|
||||
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
void
|
||||
prepare_option(prepare_info& pi,
|
||||
message_v1<isRequest, Body, Headers>& msg,
|
||||
message<isRequest, Body, Headers>& msg,
|
||||
connection value)
|
||||
{
|
||||
pi.connection_value = value;
|
||||
@@ -74,7 +77,7 @@ template<
|
||||
class Opt, class... Opts>
|
||||
void
|
||||
prepare_options(prepare_info& pi,
|
||||
message_v1<isRequest, Body, Headers>& msg,
|
||||
message<isRequest, Body, Headers>& msg,
|
||||
Opt&& opt, Opts&&... opts)
|
||||
{
|
||||
prepare_option(pi, msg, opt);
|
||||
@@ -85,7 +88,7 @@ prepare_options(prepare_info& pi,
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
void
|
||||
prepare_content_length(prepare_info& pi,
|
||||
message_v1<isRequest, Body, Headers> const& msg,
|
||||
message<isRequest, Body, Headers> const& msg,
|
||||
std::true_type)
|
||||
{
|
||||
typename Body::writer w(msg);
|
||||
@@ -100,7 +103,7 @@ prepare_content_length(prepare_info& pi,
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
void
|
||||
prepare_content_length(prepare_info& pi,
|
||||
message_v1<isRequest, Body, Headers> const& msg,
|
||||
message<isRequest, Body, Headers> const& msg,
|
||||
std::false_type)
|
||||
{
|
||||
pi.content_length = boost::none;
|
||||
@@ -112,7 +115,7 @@ template<
|
||||
bool isRequest, class Body, class Headers,
|
||||
class... Options>
|
||||
void
|
||||
prepare(message_v1<isRequest, Body, Headers>& msg,
|
||||
prepare(message<isRequest, Body, Headers>& msg,
|
||||
Options&&... options)
|
||||
{
|
||||
// VFALCO TODO
|
||||
@@ -121,7 +124,7 @@ prepare(message_v1<isRequest, Body, Headers>& msg,
|
||||
static_assert(has_writer<Body>::value,
|
||||
"Body has no writer");
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Writer requirements not met");
|
||||
detail::prepare_info pi;
|
||||
detail::prepare_content_length(pi, msg,
|
||||
@@ -148,7 +151,7 @@ prepare(message_v1<isRequest, Body, Headers>& msg,
|
||||
struct set_field
|
||||
{
|
||||
void
|
||||
operator()(message_v1<true, Body, Headers>& msg,
|
||||
operator()(message<true, Body, Headers>& msg,
|
||||
detail::prepare_info const& pi) const
|
||||
{
|
||||
using beast::detail::ci_equal;
|
||||
@@ -161,7 +164,7 @@ prepare(message_v1<isRequest, Body, Headers>& msg,
|
||||
}
|
||||
|
||||
void
|
||||
operator()(message_v1<false, Body, Headers>& msg,
|
||||
operator()(message<false, Body, Headers>& msg,
|
||||
detail::prepare_info const& pi) const
|
||||
{
|
||||
if((msg.status / 100 ) != 1 &&
|
||||
@@ -33,7 +33,7 @@ class read_op
|
||||
parser_v1<isRequest, Body, Headers>;
|
||||
|
||||
using message_type =
|
||||
message_v1<isRequest, Body, Headers>;
|
||||
message<isRequest, Body, Headers>;
|
||||
|
||||
struct data
|
||||
{
|
||||
@@ -144,7 +144,7 @@ template<class SyncReadStream, class DynamicBuffer,
|
||||
bool isRequest, class Body, class Headers>
|
||||
void
|
||||
read(SyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
message_v1<isRequest, Body, Headers>& msg)
|
||||
message<isRequest, Body, Headers>& msg)
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
@@ -155,7 +155,7 @@ read(SyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
static_assert(has_reader<Body>::value,
|
||||
"Body has no reader");
|
||||
static_assert(is_Reader<typename Body::reader,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Reader requirements not met");
|
||||
error_code ec;
|
||||
beast::http::read(stream, dynabuf, msg, ec);
|
||||
@@ -167,7 +167,7 @@ template<class SyncReadStream, class DynamicBuffer,
|
||||
bool isRequest, class Body, class Headers>
|
||||
void
|
||||
read(SyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
message_v1<isRequest, Body, Headers>& m,
|
||||
message<isRequest, Body, Headers>& m,
|
||||
error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
@@ -179,7 +179,7 @@ read(SyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
static_assert(has_reader<Body>::value,
|
||||
"Body has no reader");
|
||||
static_assert(is_Reader<typename Body::reader,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Reader requirements not met");
|
||||
parser_v1<isRequest, Body, Headers> p;
|
||||
beast::http::parse(stream, dynabuf, p, ec);
|
||||
@@ -195,7 +195,7 @@ template<class AsyncReadStream, class DynamicBuffer,
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
async_read(AsyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
message_v1<isRequest, Body, Headers>& m,
|
||||
message<isRequest, Body, Headers>& m,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncReadStream<AsyncReadStream>::value,
|
||||
@@ -207,7 +207,7 @@ async_read(AsyncReadStream& stream, DynamicBuffer& dynabuf,
|
||||
static_assert(has_reader<Body>::value,
|
||||
"Body has no reader");
|
||||
static_assert(is_Reader<typename Body::reader,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Reader requirements not met");
|
||||
beast::async_completion<ReadHandler,
|
||||
void(error_code)> completion(handler);
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace detail {
|
||||
template<class DynamicBuffer, class Body, class Headers>
|
||||
void
|
||||
write_firstline(DynamicBuffer& dynabuf,
|
||||
message_v1<true, Body, Headers> const& msg)
|
||||
message<true, Body, Headers> const& msg)
|
||||
{
|
||||
write(dynabuf, msg.method);
|
||||
write(dynabuf, " ");
|
||||
@@ -62,7 +62,7 @@ write_firstline(DynamicBuffer& dynabuf,
|
||||
template<class DynamicBuffer, class Body, class Headers>
|
||||
void
|
||||
write_firstline(DynamicBuffer& dynabuf,
|
||||
message_v1<false, Body, Headers> const& msg)
|
||||
message<false, Body, Headers> const& msg)
|
||||
{
|
||||
switch(msg.version)
|
||||
{
|
||||
@@ -108,7 +108,7 @@ write_fields(DynamicBuffer& dynabuf, FieldSequence const& fields)
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
struct write_preparation
|
||||
{
|
||||
message_v1<isRequest, Body, Headers> const& msg;
|
||||
message<isRequest, Body, Headers> const& msg;
|
||||
typename Body::writer w;
|
||||
streambuf sb;
|
||||
bool chunked;
|
||||
@@ -116,7 +116,7 @@ struct write_preparation
|
||||
|
||||
explicit
|
||||
write_preparation(
|
||||
message_v1<isRequest, Body, Headers> const& msg_)
|
||||
message<isRequest, Body, Headers> const& msg_)
|
||||
: msg(msg_)
|
||||
, w(msg)
|
||||
, chunked(token_list{
|
||||
@@ -161,7 +161,7 @@ class write_op
|
||||
|
||||
template<class DeducedHandler>
|
||||
data(DeducedHandler&& h_, Stream& s_,
|
||||
message_v1<isRequest, Body, Headers> const& m_)
|
||||
message<isRequest, Body, Headers> const& m_)
|
||||
: s(s_)
|
||||
, wp(m_)
|
||||
, h(std::forward<DeducedHandler>(h_))
|
||||
@@ -467,7 +467,7 @@ template<class SyncWriteStream,
|
||||
bool isRequest, class Body, class Headers>
|
||||
void
|
||||
write(SyncWriteStream& stream,
|
||||
message_v1<isRequest, Body, Headers> const& msg)
|
||||
message<isRequest, Body, Headers> const& msg)
|
||||
{
|
||||
static_assert(is_SyncWriteStream<SyncWriteStream>::value,
|
||||
"SyncWriteStream requirements not met");
|
||||
@@ -476,7 +476,7 @@ write(SyncWriteStream& stream,
|
||||
static_assert(has_writer<Body>::value,
|
||||
"Body has no writer");
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Writer requirements not met");
|
||||
error_code ec;
|
||||
write(stream, msg, ec);
|
||||
@@ -488,7 +488,7 @@ template<class SyncWriteStream,
|
||||
bool isRequest, class Body, class Headers>
|
||||
void
|
||||
write(SyncWriteStream& stream,
|
||||
message_v1<isRequest, Body, Headers> const& msg,
|
||||
message<isRequest, Body, Headers> const& msg,
|
||||
error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncWriteStream<SyncWriteStream>::value,
|
||||
@@ -498,7 +498,7 @@ write(SyncWriteStream& stream,
|
||||
static_assert(has_writer<Body>::value,
|
||||
"Body has no writer");
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Writer requirements not met");
|
||||
detail::write_preparation<isRequest, Body, Headers> wp(msg);
|
||||
wp.init(ec);
|
||||
@@ -584,7 +584,7 @@ template<class AsyncWriteStream,
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
async_write(AsyncWriteStream& stream,
|
||||
message_v1<isRequest, Body, Headers> const& msg,
|
||||
message<isRequest, Body, Headers> const& msg,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncWriteStream<AsyncWriteStream>::value,
|
||||
@@ -594,7 +594,7 @@ async_write(AsyncWriteStream& stream,
|
||||
static_assert(has_writer<Body>::value,
|
||||
"Body has no writer");
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Writer requirements not met");
|
||||
beast::async_completion<WriteHandler,
|
||||
void(error_code)> completion(handler);
|
||||
@@ -655,14 +655,14 @@ public:
|
||||
template<bool isRequest, class Body, class Headers>
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os,
|
||||
message_v1<isRequest, Body, Headers> const& msg)
|
||||
message<isRequest, Body, Headers> const& msg)
|
||||
{
|
||||
static_assert(is_Body<Body>::value,
|
||||
"Body requirements not met");
|
||||
static_assert(has_writer<Body>::value,
|
||||
"Body has no writer");
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message_v1<isRequest, Body, Headers>>::value,
|
||||
message<isRequest, Body, Headers>>::value,
|
||||
"Writer requirements not met");
|
||||
detail::ostream_SyncStream oss(os);
|
||||
error_code ec;
|
||||
|
||||
Reference in new issue
Block a user