diff --git a/lib/websocket/extensions.rb b/lib/websocket/extensions.rb index 14ca7ab..3ea367a 100644 --- a/lib/websocket/extensions.rb +++ b/lib/websocket/extensions.rb @@ -115,6 +115,12 @@ def generate_response(header) @sessions = sessions response.size > 0 ? response.join(', ') : nil + ensure + if sessions and !sessions.equal?(@sessions) + sessions.each do |ext, session| + session.close rescue nil + end + end end def valid_frame_rsv(frame) diff --git a/spec/websocket/extensions_spec.rb b/spec/websocket/extensions_spec.rb index ccb305d..e850808 100644 --- a/spec/websocket/extensions_spec.rb +++ b/spec/websocket/extensions_spec.rb @@ -325,6 +325,16 @@ expect(@extensions.generate_response("deflate, tar")).to eq "deflate; mode=compress" end + it "closes constructed sessions when response generation fails" do + allow(@nonconflict_session).to receive(:generate_response).and_raise(TypeError) + expect(@session).to receive(:close).exactly(1) + expect(@nonconflict_session).to receive(:close).exactly(1) + + expect { + @extensions.generate_response("deflate, reverse") + }.to raise_error(TypeError) + end + it "raises an error if the header is invalid" do expect { @extensions.generate_response("x-webkit- -frame") }.to raise_error(WebSocket::Extensions::Parser::ParseError) end