Skip to content

Commit 7db60e3

Browse files
committed
fix poor server handling of double close frames fixes #259
1 parent 3c0b8a8 commit 7db60e3

File tree

3 files changed

+12
-1
lines changed

3 files changed

+12
-1
lines changed

changelog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
HEAD
2+
- Fixes a regression that caused servers being sent two close frames in a row
3+
to end a connection uncleanly. #259
24
- Fixes a regression that caused spurious frames following a legitimate close
35
frames to erroneously trigger handlers. #258
46
- Changes default HTTP response error code when no http_handler is defined from

websocketpp/connection.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ class connection
193193
, m_rng(rng)
194194
, m_local_close_code(close::status::abnormal_close)
195195
, m_remote_close_code(close::status::abnormal_close)
196+
, m_was_clean(false)
196197
{
197198
m_alog.write(log::alevel::devel,"connection constructor");
198199
}
@@ -1172,6 +1173,8 @@ class connection
11721173
/// Detailed internal error code
11731174
lib::error_code m_ec;
11741175

1176+
bool m_was_clean;
1177+
11751178
/// Whether or not this endpoint initiated the closing handshake.
11761179
bool m_closed_by_me;
11771180

websocketpp/impl/connection_impl.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1724,10 +1724,12 @@ void connection<config>::process_control_frame(typename
17241724
m_elog.write(log::elevel::devel,
17251725
"send_close_ack error: "+ec.message());
17261726
}
1727-
} else if (m_state == session::state::closing) {
1727+
} else if (m_state == session::state::closing && !m_was_clean) {
17281728
// ack of our close
17291729
m_alog.write(log::alevel::devel,"Got acknowledgement of close");
17301730

1731+
m_was_clean = true;
1732+
17311733
// If we are a server terminate the connection now. Clients should
17321734
// leave the connection open to give the server an opportunity to
17331735
// initiate the TCP close. The client's timer will handle closing
@@ -1815,6 +1817,10 @@ lib::error_code connection<config>::send_close_frame(close::status::value code,
18151817

18161818
m_state = session::state::closing;
18171819

1820+
if (ack) {
1821+
m_was_clean = true;
1822+
}
1823+
18181824
// Start a timer so we don't wait forever for the acknowledgement close
18191825
// frame
18201826
m_handshake_timer = transport_con_type::set_timer(

0 commit comments

Comments
 (0)