Skip to content

Commit 8d75f0a

Browse files
committed
feilds_base modifiers throw on precondition violation
1 parent a1bc22a commit 8d75f0a

3 files changed

Lines changed: 65 additions & 12 deletions

File tree

include/boost/http_proto/fields_base.hpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,10 @@ class fields_base
271271
core::string_view value,
272272
system::error_code& ec)
273273
{
274-
// TODO: this should probably return an error
275-
BOOST_ASSERT(id != field::unknown);
274+
// Precondition violation
275+
if(id == field::unknown)
276+
detail::throw_logic_error();
277+
276278
insert_impl(
277279
id,
278280
to_string(id),
@@ -486,8 +488,10 @@ class fields_base
486488
core::string_view value,
487489
system::error_code& ec)
488490
{
489-
// TODO: this should probably return an error
490-
BOOST_ASSERT(id != field::unknown);
491+
// Precondition violation
492+
if(id == field::unknown)
493+
detail::throw_logic_error();
494+
491495
insert_impl(
492496
id,
493497
to_string(id),
@@ -662,7 +666,7 @@ class fields_base
662666
*/
663667
BOOST_HTTP_PROTO_DECL
664668
std::size_t
665-
erase(field id) noexcept;
669+
erase(field id);
666670

667671
/** Erase all matching fields
668672
@@ -821,8 +825,8 @@ class fields_base
821825
822826
@par Complexity
823827
824-
@param id The field constant of the
825-
header to set.
828+
@param id The field name constant,
829+
which may not be @ref field::unknown.
826830
827831
@param value A value, which must be semantically
828832
valid for the message.

src/fields_base.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,12 @@ shrink_to_fit() noexcept
591591
std::size_t
592592
fields_base::
593593
erase(
594-
field id) noexcept
594+
field id)
595595
{
596-
BOOST_ASSERT(
597-
id != field::unknown);
596+
// Precondition violation
597+
if(id == field::unknown)
598+
detail::throw_logic_error();
599+
598600
#if 1
599601
auto const end_ = end();
600602
auto it = find_last(end_, id);
@@ -830,8 +832,9 @@ set(
830832
core::string_view value,
831833
system::error_code& ec)
832834
{
833-
BOOST_ASSERT(
834-
id != field::unknown);
835+
// Precondition violation
836+
if(id == field::unknown)
837+
detail::throw_logic_error();
835838

836839
auto rv = verify_field_value(value);
837840
if(rv.has_error())

test/unit/fields_base.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,17 @@ struct fields_base_test
407407
"Server: y\r\n"
408408
"\r\n");
409409

410+
check(
411+
"\r\n",
412+
[](fields_base& f)
413+
{
414+
system::error_code ec;
415+
BOOST_TEST_THROWS(
416+
f.append(field::unknown, "y", ec),
417+
std::logic_error);
418+
},
419+
"\r\n");
420+
410421
// append(string_view, string_view)
411422

412423
check(
@@ -581,6 +592,19 @@ struct fields_base_test
581592
"T: 1\r\n"
582593
"\r\n");
583594

595+
check(
596+
"T: 1\r\n"
597+
"\r\n",
598+
[](fields_base& f)
599+
{
600+
system::error_code ec;
601+
BOOST_TEST_THROWS(
602+
f.insert(f.find("T"), field::unknown, "x", ec),
603+
std::logic_error);
604+
},
605+
"T: 1\r\n"
606+
"\r\n");
607+
584608
check(
585609
"T: 1\r\n"
586610
"U: 2\r\n"
@@ -906,6 +930,17 @@ struct fields_base_test
906930
"Connection: keep-alive\r\n"
907931
"Server: Boost\r\n"
908932
"\r\n");
933+
934+
// unknown field id
935+
check(
936+
"\r\n",
937+
[](fields_base& f)
938+
{
939+
BOOST_TEST_THROWS(
940+
f.erase(field::unknown),
941+
std::logic_error);
942+
},
943+
"\r\n");
909944
}
910945

911946
void
@@ -1005,6 +1040,17 @@ struct fields_base_test
10051040
"Server: y\r\n"
10061041
"\r\n");
10071042

1043+
check(
1044+
"\r\n",
1045+
[](fields_base& f)
1046+
{
1047+
system::error_code ec;
1048+
BOOST_TEST_THROWS(
1049+
f.set(field::unknown, "y" , ec),
1050+
std::logic_error);
1051+
},
1052+
"\r\n");
1053+
10081054
check(
10091055
"T: 1\r\n"
10101056
"Server: x\r\n"

0 commit comments

Comments
 (0)