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

Commit 55d35d2

Browse files
committed
Allow to override default request headers
1 parent 46f4b1b commit 55d35d2

File tree

3 files changed

+51
-5
lines changed

3 files changed

+51
-5
lines changed

hyper/http20/connection.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,9 @@ def request(self, method, url, body=None, headers={}):
170170
"""
171171
stream_id = self.putrequest(method, url)
172172

173+
default_headers = (':method', ':scheme', ':authority', ':path')
173174
for name, value in headers.items():
174-
self.putheader(name, value, stream_id)
175+
self.putheader(name, value, stream_id, replace=name in default_headers)
175176

176177
# Convert the body to bytes if needed.
177178
if isinstance(body, str):
@@ -319,7 +320,7 @@ def putrequest(self, method, selector, **kwargs):
319320

320321
return s.stream_id
321322

322-
def putheader(self, header, argument, stream_id=None):
323+
def putheader(self, header, argument, stream_id=None, replace=False):
323324
"""
324325
Sends an HTTP header to the server, with name ``header`` and value
325326
``argument``.
@@ -341,7 +342,7 @@ def putheader(self, header, argument, stream_id=None):
341342
:returns: Nothing.
342343
"""
343344
stream = self._get_stream(stream_id)
344-
stream.add_header(header, argument)
345+
stream.add_header(header, argument, replace)
345346

346347
return
347348

hyper/http20/stream.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,22 @@ def __init__(self,
109109
self._encoder = header_encoder
110110
self._decoder = header_decoder
111111

112-
def add_header(self, name, value):
112+
def add_header(self, name, value, replace=False):
113113
"""
114114
Adds a single HTTP header to the headers to be sent on the request.
115115
"""
116-
self.headers.append((name.lower(), value))
116+
name = name.lower()
117+
118+
if replace:
119+
try:
120+
idx = [n for n, _ in self.headers].index(name)
121+
self.headers[idx] = (name, value)
122+
return
123+
124+
except ValueError:
125+
pass
126+
127+
self.headers.append((name, value))
117128

118129
def send_data(self, data, final):
119130
"""

test/test_hyper.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,23 @@ def test_putheader_puts_headers(self):
109109
('name', 'value'),
110110
]
111111

112+
def test_putheader_replaces_headers(self):
113+
c = HTTP20Connection("www.google.com")
114+
115+
c.putrequest('GET', '/')
116+
c.putheader(':authority', 'www.example.org', replace=True)
117+
c.putheader('name', 'value')
118+
c.putheader('name', 'value2', replace=True)
119+
s = c.recent_stream
120+
121+
assert s.headers == [
122+
(':method', 'GET'),
123+
(':scheme', 'https'),
124+
(':authority', 'www.example.org'),
125+
(':path', '/'),
126+
('name', 'value2'),
127+
]
128+
112129
def test_endheaders_sends_data(self):
113130
frames = []
114131

@@ -684,6 +701,23 @@ def test_streams_can_have_headers(self):
684701
s.add_header("name", "value")
685702
assert s.headers == [("name", "value")]
686703

704+
def test_streams_can_replace_headers(self):
705+
s = Stream(1, None, None, None, None, None, None)
706+
s.add_header("name", "value")
707+
s.add_header("name", "other_value", replace=True)
708+
709+
assert s.headers == [("name", "other_value")]
710+
711+
def test_streams_can_replace_none_headers(self):
712+
s = Stream(1, None, None, None, None, None, None)
713+
s.add_header("name", "value")
714+
s.add_header("other_name", "other_value", replace=True)
715+
716+
assert s.headers == [
717+
("name", "value"),
718+
("other_name", "other_value")
719+
]
720+
687721
def test_stream_opening_sends_headers(self):
688722
def data_callback(frame):
689723
assert isinstance(frame, HeadersFrame)

0 commit comments

Comments
 (0)