mirror of
https://github.com/boostorg/beast.git
synced 2025-07-31 21:34:46 +02:00
Fix basic_fields insert ordering
This commit is contained in:
@@ -5,6 +5,7 @@ Version 58:
|
||||
* Reorganize examples
|
||||
* Specification for http read
|
||||
* Avoid `std::string` in websocket
|
||||
* Fix basic_fields insert ordering
|
||||
|
||||
API Changes:
|
||||
|
||||
|
@@ -480,29 +480,25 @@ insert(field name,
|
||||
name, sname, value.str());
|
||||
auto const before =
|
||||
set_.upper_bound(sname, key_compare{});
|
||||
if(before == set_.end())
|
||||
{
|
||||
set_.push_back(e);
|
||||
list_.push_back(e);
|
||||
return;
|
||||
}
|
||||
if(before == set_.begin())
|
||||
{
|
||||
set_.push_front(e);
|
||||
list_.push_back(e);
|
||||
return;
|
||||
}
|
||||
auto const last = std::prev(before);
|
||||
if(! beast::detail::ci_equal(
|
||||
sname, last->name_string()))
|
||||
{
|
||||
BOOST_ASSERT(count(sname) == 0);
|
||||
set_.insert_before(before, e);
|
||||
list_.push_back(e);
|
||||
return;
|
||||
}
|
||||
// count(name_string) > 0
|
||||
auto const last = std::prev(before);
|
||||
// VFALCO is it worth comparing `field name` first?
|
||||
if(! beast::detail::ci_equal(sname, last->name_string()))
|
||||
{
|
||||
BOOST_ASSERT(count(sname) == 0);
|
||||
set_.insert_before(before, e);
|
||||
list_.push_back(e);
|
||||
return;
|
||||
}
|
||||
// keep duplicate fields together in the list
|
||||
set_.insert_before(before, e);
|
||||
list_.insert(list_.iterator_to(*before), e);
|
||||
list_.insert(++list_.iterator_to(*last), e);
|
||||
}
|
||||
|
||||
template<class Allocator>
|
||||
|
@@ -375,6 +375,26 @@ public:
|
||||
BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "a");
|
||||
BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "b");
|
||||
}
|
||||
{
|
||||
// verify insertion orde
|
||||
fields f;
|
||||
f.insert( "a", 1);
|
||||
f.insert("dd", 2);
|
||||
f.insert("b", 3);
|
||||
f.insert("dD", 4);
|
||||
f.insert("c", 5);
|
||||
f.insert("Dd", 6);
|
||||
f.insert("DD", 7);
|
||||
f.insert( "e", 8);
|
||||
BEAST_EXPECT(f.count("dd") == 4);
|
||||
BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "dd");
|
||||
BEAST_EXPECT(std::next(f.begin(), 2)->name_string() == "dD");
|
||||
BEAST_EXPECT(std::next(f.begin(), 3)->name_string() == "Dd");
|
||||
BEAST_EXPECT(std::next(f.begin(), 4)->name_string() == "DD");
|
||||
f.set("dd", "-");
|
||||
BEAST_EXPECT(f.count("dd") == 1);
|
||||
BEAST_EXPECT(f["dd"] == "-");
|
||||
}
|
||||
}
|
||||
|
||||
void run() override
|
||||
|
Reference in New Issue
Block a user