Add has_content_length_impl to Fields (API Change):

* The function has_content_length_impl is added to the
  requirements of Fields.

Actions Required:

* Implement has_content_length_impl for user-defined Fields
This commit is contained in:
Vinnie Falco
2017-10-25 17:47:12 -07:00
parent feb525f829
commit 6225c5bd2f
8 changed files with 69 additions and 11 deletions

View File

@@ -6,11 +6,14 @@ API Changes:
* Remove serializer::keep_alive * Remove serializer::keep_alive
* Remove serializer::chunked * Remove serializer::chunked
* Add has_content_length_impl to Fields
* Add message::has_content_length
Actions Required: Actions Required:
* Call message::keep_alive instead of serializer::keep_alive * Call message::keep_alive instead of serializer::keep_alive
* Call serializer::get::chunked instead of serializer::chunked * Call serializer::get::chunked instead of serializer::chunked
* Implement has_content_length_impl for user-defined Fields
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@@ -101,6 +101,14 @@ In this table:
function returns `true`. function returns `true`.
]] ]]
] ]
][
[`c.has_content_length()`]
[`bool`]
[
Returns `true` if the
[@https://tools.ietf.org/html/rfc7230#section-3.3.2 [*Content-Length]]
field is present.
]
][ ][
[`a.set_method_impl(s)`] [`a.set_method_impl(s)`]
[] []
@@ -137,7 +145,7 @@ In this table:
[ [
Adjusts the Adjusts the
[@https://tools.ietf.org/html/rfc7230#section-3.3.1 [*Transfer-Encoding]] [@https://tools.ietf.org/html/rfc7230#section-3.3.1 [*Transfer-Encoding]]
field as follows: field value as follows:
[itemized_list [itemized_list
[ [
@@ -153,6 +161,9 @@ In this table:
empty, the Transfer-Encoding field shall not appear when empty, the Transfer-Encoding field shall not appear when
the associated __FieldsReader__ serializes the fields. the associated __FieldsReader__ serializes the fields.
]] ]]
If the result of adjusting the field value produces an empty
string, the field is removed from the container.
] ]
][ ][
@@ -161,7 +172,7 @@ In this table:
[ [
Adjusts the Adjusts the
[@https://tools.ietf.org/html/rfc7230#section-3.3.2 [*Content-Length]] [@https://tools.ietf.org/html/rfc7230#section-3.3.2 [*Content-Length]]
field as follows: field value as follows:
[itemized_list [itemized_list
[ [
@@ -203,6 +214,9 @@ In this table:
in the value are removed, and the "close" token is added to in the value are removed, and the "close" token is added to
the value if it is not already present. the value if it is not already present.
]] ]]
If the result of adjusting the field value produces an empty
string, the field is removed from the container.
] ]
]] ]]

View File

@@ -61,6 +61,7 @@ protected:
string_view get_reason_impl() const; string_view get_reason_impl() const;
bool get_chunked_impl() const; bool get_chunked_impl() const;
bool get_keep_alive_impl(unsigned) const; bool get_keep_alive_impl(unsigned) const;
bool has_content_length_impl() const;
void set_method_impl(string_view); void set_method_impl(string_view);
void set_target_impl(string_view); void set_target_impl(string_view);
void set_reason_impl(string_view); void set_reason_impl(string_view);
@@ -134,54 +135,61 @@ struct is_fields_helper : T
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f6(int) -> decltype( static auto f6(int) -> decltype(
void(std::declval<U&>().set_method_impl(std::declval<string_view>())), std::declval<bool&>() = std::declval<U const&>().has_content_length_impl(),
std::true_type()); std::true_type());
static auto f6(...) -> std::false_type; static auto f6(...) -> std::false_type;
using t6 = decltype(f6(0)); using t6 = decltype(f6(0));
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f7(int) -> decltype( static auto f7(int) -> decltype(
void(std::declval<U&>().set_target_impl(std::declval<string_view>())), void(std::declval<U&>().set_method_impl(std::declval<string_view>())),
std::true_type()); std::true_type());
static auto f7(...) -> std::false_type; static auto f7(...) -> std::false_type;
using t7 = decltype(f7(0)); using t7 = decltype(f7(0));
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f8(int) -> decltype( static auto f8(int) -> decltype(
void(std::declval<U&>().set_reason_impl(std::declval<string_view>())), void(std::declval<U&>().set_target_impl(std::declval<string_view>())),
std::true_type()); std::true_type());
static auto f8(...) -> std::false_type; static auto f8(...) -> std::false_type;
using t8 = decltype(f8(0)); using t8 = decltype(f8(0));
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f9(int) -> decltype( static auto f9(int) -> decltype(
void(std::declval<U&>().set_chunked_impl(std::declval<bool>())), void(std::declval<U&>().set_reason_impl(std::declval<string_view>())),
std::true_type()); std::true_type());
static auto f9(...) -> std::false_type; static auto f9(...) -> std::false_type;
using t9 = decltype(f9(0)); using t9 = decltype(f9(0));
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f10(int) -> decltype( static auto f10(int) -> decltype(
void(std::declval<U&>().set_content_length_impl( void(std::declval<U&>().set_chunked_impl(std::declval<bool>())),
std::declval<boost::optional<std::uint64_t>>())),
std::true_type()); std::true_type());
static auto f10(...) -> std::false_type; static auto f10(...) -> std::false_type;
using t10 = decltype(f10(0)); using t10 = decltype(f10(0));
template<class U = is_fields_helper> template<class U = is_fields_helper>
static auto f11(int) -> decltype( static auto f11(int) -> decltype(
void(std::declval<U&>().set_content_length_impl(
std::declval<boost::optional<std::uint64_t>>())),
std::true_type());
static auto f11(...) -> std::false_type;
using t11 = decltype(f11(0));
template<class U = is_fields_helper>
static auto f12(int) -> decltype(
void(std::declval<U&>().set_keep_alive_impl( void(std::declval<U&>().set_keep_alive_impl(
std::declval<unsigned>(), std::declval<unsigned>(),
std::declval<bool>())), std::declval<bool>())),
std::true_type()); std::true_type());
static auto f11(...) -> std::false_type; static auto f12(...) -> std::false_type;
using t11 = decltype(f11(0)); using t12 = decltype(f12(0));
using type = std::integral_constant<bool, using type = std::integral_constant<bool,
t1::value && t2::value && t3::value && t1::value && t2::value && t3::value &&
t4::value && t5::value && t6::value && t4::value && t5::value && t6::value &&
t7::value && t8::value && t9::value && t7::value && t8::value && t9::value &&
t10::value && t11::value>; t10::value && t11::value && t12::value>;
}; };
} // detail } // detail

View File

@@ -634,6 +634,11 @@ protected:
bool bool
get_keep_alive_impl(unsigned version) const; get_keep_alive_impl(unsigned version) const;
/** Returns `true` if the Content-Length field is present.
*/
bool
has_content_length_impl() const;
/** Set or clear the method string. /** Set or clear the method string.
@note Only called for requests. @note Only called for requests.

View File

@@ -938,6 +938,14 @@ get_keep_alive_impl(unsigned version) const
it->value()}.exists("close"); it->value()}.exists("close");
} }
template<class Allocator>
bool
basic_fields<Allocator>::
has_content_length_impl() const
{
return count(field::content_length) > 0;
}
template<class Allocator> template<class Allocator>
inline inline
void void

View File

@@ -723,6 +723,18 @@ struct message
void void
chunked(bool value); chunked(bool value);
/** Returns `true` if the Content-Length field is present.
This function inspects the fields and returns `true` if
the Content-Length field is present. The properties of the
body are not checked, this only looks for the field.
*/
bool
has_content_length() const
{
return this->has_content_length_impl();
}
/** Set or clear the Content-Length field /** Set or clear the Content-Length field
This function adjusts the Content-Length field as follows: This function adjusts the Content-Length field as follows:

View File

@@ -203,6 +203,7 @@ public:
string_view get_reason_impl() const { return {}; } string_view get_reason_impl() const { return {}; }
bool get_chunked_impl() const { return false; } bool get_chunked_impl() const { return false; }
bool get_keep_alive_impl(unsigned) const { return true; } bool get_keep_alive_impl(unsigned) const { return true; }
bool has_content_length_impl() const { return false; }
void set_method_impl(string_view) {} void set_method_impl(string_view) {}
void set_target_impl(string_view s) { target = s.to_string(); } void set_target_impl(string_view s) { target = s.to_string(); }
void set_reason_impl(string_view) {} void set_reason_impl(string_view) {}
@@ -240,6 +241,7 @@ public:
BEAST_EXPECT(req.method() == verb::get); BEAST_EXPECT(req.method() == verb::get);
BEAST_EXPECT(req.target() == "/"); BEAST_EXPECT(req.target() == "/");
BEAST_EXPECT(req.body() == "Hello"); BEAST_EXPECT(req.body() == "Hello");
BEAST_EXPECT(! req.has_content_length());
} }
{ {
response<string_body> res; response<string_body> res;
@@ -267,6 +269,7 @@ public:
BEAST_EXPECT(res.result() == status::bad_request); BEAST_EXPECT(res.result() == status::bad_request);
BEAST_EXPECT(res.reason() == "Bad Request"); BEAST_EXPECT(res.reason() == "Bad Request");
BEAST_EXPECT(res.body() == "Hello"); BEAST_EXPECT(res.body() == "Hello");
BEAST_EXPECT(! res.has_content_length());
} }
} }

View File

@@ -224,6 +224,11 @@ protected:
bool bool
get_keep_alive_impl(unsigned version) const; get_keep_alive_impl(unsigned version) const;
/** Returns `true` if the Content-Length field is present.
*/
bool
has_content_length_impl() const;
/** Set or clear the method string. /** Set or clear the method string.
@note Only called for requests. @note Only called for requests.