Skip to content

Commit 90e0828

Browse files
Fix HTTP::Headers#merge! to not wrap key (#16624)
Fixes a regression from 1.18 (#15710). That change added type restrictions to `Headers[]=` which should've caused a type error in `Headers#merge!`, but this was shadowed by unexpected behaviour from `forward_missing_to`. The error condition was not triggered in specs.
1 parent 4f7048d commit 90e0828

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

spec/std/http/headers_spec.cr

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,36 @@ describe HTTP::Headers do
155155
headers.serialize.should eq("Foo_quux: bar\r\nBaz-Quux: a\r\nBaz-Quux: b\r\n")
156156
end
157157

158-
it "merges and return self" do
158+
describe "#merge!" do
159+
it "merges and return self" do
160+
headers = HTTP::Headers.new
161+
headers.should be headers.merge!({"foo" => "bar"})
162+
end
163+
164+
it "merges other headers" do
165+
headers = HTTP::Headers{"foo" => "bar", "boo" => "baz"}
166+
headers.merge!(HTTP::Headers{"foo" => "baz", "qux" => "quux"})
167+
headers.should eq HTTP::Headers{"foo" => "baz", "boo" => "baz", "qux" => "quux"}
168+
end
169+
170+
it "merges other hash" do
171+
headers = HTTP::Headers{"foo" => "bar", "boo" => "baz"}
172+
headers.merge!({"foo" => "baz", "qux" => "quux"})
173+
headers.should eq HTTP::Headers{"foo" => "baz", "boo" => "baz", "qux" => "quux"}
174+
end
175+
176+
it "raises an error if header value contains invalid character" do
177+
headers = HTTP::Headers.new
178+
expect_raises ArgumentError do
179+
headers.merge!({"invalid-header" => "\r\nLocation: http://example.com"})
180+
end
181+
end
182+
end
183+
184+
it "dispatch with union type (#16622)" do
159185
headers = HTTP::Headers.new
160-
headers.should be headers.merge!({"foo" => "bar"})
186+
headers.merge!(HTTP::Headers.new)
187+
headers["foo"] = "bar".as(String | Array(String))
161188
end
162189

163190
it "matches word" do

src/http/headers.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ struct HTTP::Headers
180180

181181
def merge!(other) : self
182182
other.each do |key, value|
183-
self[wrap(key)] = value
183+
self[key] = value
184184
end
185185
self
186186
end

0 commit comments

Comments
 (0)