From 8c11856725146cde90f61d075b179cc9b4037a59 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Fri, 28 Aug 2026 03:14:00 +0300 Subject: [PATCH 1/2] Append duplicate parameter values without copying prior arrays --- lib/websocket/extensions/parser.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/websocket/extensions/parser.rb b/lib/websocket/extensions/parser.rb index f8d8891..fab504c 100644 --- a/lib/websocket/extensions/parser.rb +++ b/lib/websocket/extensions/parser.rb @@ -43,7 +43,8 @@ def self.parse_header(header) end if offer.has_key?(key) - offer[key] = [*offer[key]] + [data] + offer[key] = [offer[key]] unless offer[key].is_a?(Array) + offer[key].push(data) else offer[key] = data end From 547f5c60d11b367c2e245cb1594ff8f7958220c9 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 14:43:06 +0300 Subject: [PATCH 2/2] Add parser regression coverage --- spec/websocket/extensions/parser_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/websocket/extensions/parser_spec.rb b/spec/websocket/extensions/parser_spec.rb index 7458210..9a6d488 100644 --- a/spec/websocket/extensions/parser_spec.rb +++ b/spec/websocket/extensions/parser_spec.rb @@ -67,6 +67,12 @@ def parse(string) ] end + it "preserves more than two duplicate params in order" do + expect(parse "a; b=1; b=2; b=3").to eq [ + { :name => "a", :params => { "b" => [1, 2, 3] } } + ] + end + it "parses multiple complex offers" do expect(parse 'a; b=1, c, b; d, c; e="hi, there"; e, a; b').to eq [ { :name => "a", :params => { "b" => 1 } },