From 4fb535ece6fcc8dee4121a13a35544cf64d8c705 Mon Sep 17 00:00:00 2001
From: Peter Jankuliak
Date: Mon, 22 Jan 2018 16:01:51 +0100
Subject: [PATCH] Fix iterator version of basic_fields::erase
fix #994
---
CHANGELOG.md | 1 +
include/boost/beast/http/impl/fields.ipp | 6 +++---
test/beast/http/fields.cpp | 15 +++++++++++++++
3 files changed, 19 insertions(+), 3 deletions(-)
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();