diff --git a/CHANGELOG.md b/CHANGELOG.md index 1447840a..85589e2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Version 153: * Use boost::winapi::GetLastError() consistently * Update README.md for branches * Avoid string_view::clear +* Fix iterator version of basic_fields::erase -------------------------------------------------------------------------------- diff --git a/include/boost/beast/http/impl/fields.ipp b/include/boost/beast/http/impl/fields.ipp index 61dee1ca..1ad25e26 100644 --- a/include/boost/beast/http/impl/fields.ipp +++ b/include/boost/beast/http/impl/fields.ipp @@ -609,11 +609,11 @@ basic_fields:: erase(const_iterator pos) -> const_iterator { - auto next = pos.iter(); + auto next = pos; auto& e = *next++; set_.erase(e); - list_.erase(e); - delete_element(e); + list_.erase(pos); + delete_element(const_cast(e)); return next; } diff --git a/test/beast/http/fields.cpp b/test/beast/http/fields.cpp index 38ae5386..f4c8694d 100644 --- a/test/beast/http/fields.cpp +++ b/test/beast/http/fields.cpp @@ -388,6 +388,20 @@ public: BEAST_EXPECT(size(f) == 2); } + void testIteratorErase() + { + f_t f; + f.insert("a", "x"); + f.insert("b", "y"); + f.insert("c", "z"); + BEAST_EXPECT(size(f) == 3); + f_t::const_iterator i = std::next(f.begin()); + f.erase(i); + BEAST_EXPECT(size(f) == 2); + BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "a"); + BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "c"); + } + void testContainer() { @@ -980,6 +994,7 @@ public: testHeaders(); testRFC2616(); testErase(); + testIteratorErase(); testContainer(); testPreparePayload();