Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Commit 9e4d8e2

Browse files
committed
Add 'merge' method to HTTPHeaderMap.
1 parent 1ed4b35 commit 9e4d8e2

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

hyper/common/headers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,22 @@ def iter_raw(self):
181181
for item in self._items:
182182
yield item
183183

184+
def merge(self, other):
185+
"""
186+
Merge another header set or any other dict-like into this one.
187+
"""
188+
# Short circuit to avoid infinite loops in case we try to merge into
189+
# ourselves.
190+
if other is self:
191+
return
192+
193+
if isinstance(other, HTTPHeaderMap):
194+
self._items.extend(other.iter_raw())
195+
return
196+
197+
for k, v in other.items():
198+
self._items.append(to_bytestring_tuple(k, v))
199+
184200
def __eq__(self, other):
185201
return self._items == other._items
186202

test/test_headers.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,35 @@ def test_headers_must_be_strings(self):
226226

227227
with pytest.raises(ValueError):
228228
h[1] = 'v'
229+
230+
def test_merge_self_is_no_op(self):
231+
h = HTTPHeaderMap([(b'hi', b'there')])
232+
h.merge(h)
233+
234+
assert h == HTTPHeaderMap([(b'hi', b'there')])
235+
236+
def test_merge_headermaps_preserves_raw(self):
237+
h1 = HTTPHeaderMap([
238+
(b'hi', b'there')
239+
])
240+
h2 = HTTPHeaderMap([
241+
(b'Hi', b'there, sir, maam')
242+
])
243+
244+
h1.merge(h2)
245+
246+
assert list(h1.iter_raw()) == [
247+
(b'hi', b'there'),
248+
(b'Hi', b'there, sir, maam'),
249+
]
250+
251+
def test_merge_header_map_dict(self):
252+
h = HTTPHeaderMap([(b'hi', b'there')])
253+
d = {'cat': 'dog'}
254+
255+
h.merge(d)
256+
257+
assert list(h.items()) == [
258+
(b'hi', b'there'),
259+
(b'cat', b'dog'),
260+
]

0 commit comments

Comments
 (0)