mirror of
https://github.com/boostorg/beast.git
synced 2025-07-31 13:27:33 +02:00
Add message::need_eof
This commit is contained in:
@ -2,6 +2,10 @@ Version 128:
|
|||||||
|
|
||||||
* Update doc links
|
* Update doc links
|
||||||
|
|
||||||
|
HTTP:
|
||||||
|
|
||||||
|
* Add message::need_eof
|
||||||
|
|
||||||
API Changes:
|
API Changes:
|
||||||
|
|
||||||
* Remove serializer::keep_alive
|
* Remove serializer::keep_alive
|
||||||
|
@ -343,6 +343,22 @@ payload_size() const
|
|||||||
return payload_size(detail::is_body_sized<Body>{});
|
return payload_size(detail::is_body_sized<Body>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<bool isRequest, class Body, class Fields>
|
||||||
|
bool
|
||||||
|
message<isRequest, Body, Fields>::
|
||||||
|
need_eof(std::false_type) const
|
||||||
|
{
|
||||||
|
// VFALCO Do we need a way to let the caller say "the body is intentionally skipped"?
|
||||||
|
if( this->result() == status::no_content ||
|
||||||
|
this->result() == status::not_modified ||
|
||||||
|
to_status_class(this->result()) ==
|
||||||
|
status_class::informational ||
|
||||||
|
has_content_length() ||
|
||||||
|
chunked())
|
||||||
|
return ! keep_alive();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
template<bool isRequest, class Body, class Fields>
|
template<bool isRequest, class Body, class Fields>
|
||||||
void
|
void
|
||||||
message<isRequest, Body, Fields>::
|
message<isRequest, Body, Fields>::
|
||||||
|
@ -780,6 +780,34 @@ struct message
|
|||||||
this->set_keep_alive_impl(this->version(), value);
|
this->set_keep_alive_impl(this->version(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns `true` if the message semantics require an end of file.
|
||||||
|
|
||||||
|
For HTTP requests, this function returns the logical
|
||||||
|
NOT of a call to @ref keep_alive.
|
||||||
|
|
||||||
|
For HTTP responses, this function returns the logical NOT
|
||||||
|
of a call to @ref keep_alive if any of the following are true:
|
||||||
|
|
||||||
|
@li @ref has_content_length would return `true`
|
||||||
|
|
||||||
|
@li @ref chunked would return `true`
|
||||||
|
|
||||||
|
@li @ref result returns @ref status::no_content
|
||||||
|
|
||||||
|
@li @ref result returns @ref status::not_modified
|
||||||
|
|
||||||
|
@li @ref result returns any informational status class (100 to 199)
|
||||||
|
|
||||||
|
Otherwise, the function returns `true`.
|
||||||
|
|
||||||
|
@see https://tools.ietf.org/html/rfc7230#section-3.3
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
need_eof() const
|
||||||
|
{
|
||||||
|
return need_eof(typename header_type::is_request{});
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns the payload size of the body in octets if possible.
|
/** Returns the payload size of the body in octets if possible.
|
||||||
|
|
||||||
This function invokes the @b Body algorithm to measure
|
This function invokes the @b Body algorithm to measure
|
||||||
@ -878,6 +906,15 @@ private:
|
|||||||
boost::ignore_unused(fields_args);
|
boost::ignore_unused(fields_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
need_eof(std::true_type) const
|
||||||
|
{
|
||||||
|
return ! keep_alive();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
need_eof(std::false_type) const;
|
||||||
|
|
||||||
boost::optional<std::uint64_t>
|
boost::optional<std::uint64_t>
|
||||||
payload_size(std::true_type) const
|
payload_size(std::true_type) const
|
||||||
{
|
{
|
||||||
|
@ -367,6 +367,111 @@ public:
|
|||||||
BEAST_EXPECT(h.reason() == "Not Found");
|
BEAST_EXPECT(h.reason() == "Not Found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
testNeedEof()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
request<empty_body> m;
|
||||||
|
|
||||||
|
m.version(10);
|
||||||
|
m.keep_alive(false);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.keep_alive(true);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
|
||||||
|
m.version(11);
|
||||||
|
m.keep_alive(false);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.keep_alive(true);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
response<empty_body> m;
|
||||||
|
m.result(status::ok);
|
||||||
|
|
||||||
|
m.version(10);
|
||||||
|
m.keep_alive(false);
|
||||||
|
BEAST_EXPECT(! m.has_content_length());
|
||||||
|
BEAST_EXPECT(! m.chunked());
|
||||||
|
m.result(status::no_content);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::not_modified);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::continue_);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::switching_protocols);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::ok);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
|
||||||
|
m.version(10);
|
||||||
|
m.keep_alive(true);
|
||||||
|
BEAST_EXPECT(! m.has_content_length());
|
||||||
|
BEAST_EXPECT(! m.chunked());
|
||||||
|
m.result(status::no_content);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::not_modified);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::continue_);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::switching_protocols);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::ok);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.set(field::content_length, "1");
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
response<empty_body> m;
|
||||||
|
m.result(status::ok);
|
||||||
|
|
||||||
|
m.version(11);
|
||||||
|
m.keep_alive(false);
|
||||||
|
BEAST_EXPECT(! m.has_content_length());
|
||||||
|
BEAST_EXPECT(! m.chunked());
|
||||||
|
m.result(status::no_content);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::not_modified);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::continue_);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::switching_protocols);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.result(status::ok);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.chunked(true);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.content_length(1);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
response<empty_body> m;
|
||||||
|
m.result(status::ok);
|
||||||
|
|
||||||
|
m.version(11);
|
||||||
|
m.keep_alive(true);
|
||||||
|
BEAST_EXPECT(! m.has_content_length());
|
||||||
|
BEAST_EXPECT(! m.chunked());
|
||||||
|
m.result(status::no_content);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::not_modified);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::continue_);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::switching_protocols);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.result(status::ok);
|
||||||
|
BEAST_EXPECT(m.need_eof());
|
||||||
|
m.chunked(true);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
m.content_length(1);
|
||||||
|
BEAST_EXPECT(! m.need_eof());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
run() override
|
run() override
|
||||||
{
|
{
|
||||||
@ -377,6 +482,7 @@ public:
|
|||||||
testMethod();
|
testMethod();
|
||||||
testStatus();
|
testStatus();
|
||||||
testReason();
|
testReason();
|
||||||
|
testNeedEof();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user