mirror of
https://github.com/kevin1024/vcrpy.git
synced 2025-12-09 09:13:23 +00:00
Merge pull request #97 from matt-thomson/multiple-headers
Fix serialization/deserialization of multiple headers with the same value
This commit is contained in:
@@ -9,3 +9,14 @@ def test_recorded_request_uri_with_redirected_request(tmpdir):
|
|||||||
assert cass.requests[0].uri == 'http://httpbin.org/redirect/3'
|
assert cass.requests[0].uri == 'http://httpbin.org/redirect/3'
|
||||||
assert cass.requests[3].uri == 'http://httpbin.org/get'
|
assert cass.requests[3].uri == 'http://httpbin.org/get'
|
||||||
assert len(cass) == 4
|
assert len(cass) == 4
|
||||||
|
|
||||||
|
|
||||||
|
def test_records_multiple_header_values(tmpdir, httpserver):
|
||||||
|
httpserver.serve_content('Hello!', headers=[('foo', 'bar'), ('foo', 'baz')])
|
||||||
|
|
||||||
|
with vcr.use_cassette(str(tmpdir.join('test.yml'))) as cass:
|
||||||
|
assert len(cass) == 0
|
||||||
|
|
||||||
|
urlopen(httpserver.url)
|
||||||
|
assert len(cass) == 1
|
||||||
|
assert cass.responses[0]['headers']['foo'] == ['bar', 'baz']
|
||||||
|
|||||||
@@ -24,3 +24,19 @@ def test_case_insensitivity(tmpdir):
|
|||||||
|
|
||||||
# behavior should be the same both inside and outside
|
# behavior should be the same both inside and outside
|
||||||
assert outside == inside == inside2
|
assert outside == inside == inside2
|
||||||
|
|
||||||
|
def _multiple_header_value(httpserver):
|
||||||
|
conn = httplib.HTTPConnection('%s:%s' % httpserver.server_address)
|
||||||
|
conn.request('GET', "/")
|
||||||
|
r = conn.getresponse()
|
||||||
|
return r.getheader('foo')
|
||||||
|
|
||||||
|
def test_multiple_headers(tmpdir, httpserver):
|
||||||
|
testfile = str(tmpdir.join('multiple_headers.yaml'))
|
||||||
|
httpserver.serve_content('Hello!', headers=[('foo', 'bar'), ('foo', 'baz')])
|
||||||
|
outside = _multiple_header_value(httpserver)
|
||||||
|
|
||||||
|
with vcr.use_cassette(testfile):
|
||||||
|
inside = _multiple_header_value(httpserver)
|
||||||
|
|
||||||
|
assert outside == inside
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ def parse_headers(header_list):
|
|||||||
|
|
||||||
def serialize_headers(response):
|
def serialize_headers(response):
|
||||||
out = {}
|
out = {}
|
||||||
for key, values in compat.get_headers(response):
|
for key, values in compat.get_headers(response.msg):
|
||||||
out.setdefault(key, [])
|
out.setdefault(key, [])
|
||||||
out[key].extend(values)
|
out[key].extend(values)
|
||||||
return out
|
return out
|
||||||
@@ -108,11 +108,15 @@ class VCRHTTPResponse(HTTPResponse):
|
|||||||
|
|
||||||
def getheaders(self):
|
def getheaders(self):
|
||||||
message = parse_headers(self.recorded_response['headers'])
|
message = parse_headers(self.recorded_response['headers'])
|
||||||
return compat.get_header_items(message)
|
return list(compat.get_header_items(message))
|
||||||
|
|
||||||
def getheader(self, header, default=None):
|
def getheader(self, header, default=None):
|
||||||
headers = dict(((k.lower(), v) for k, v in self.getheaders()))
|
values = [v for (k, v) in self.getheaders() if k.lower() == header.lower()]
|
||||||
return headers.get(header.lower(), default)
|
|
||||||
|
if values:
|
||||||
|
return ', '.join(values)
|
||||||
|
else:
|
||||||
|
return default
|
||||||
|
|
||||||
|
|
||||||
class VCRConnection:
|
class VCRConnection:
|
||||||
|
|||||||
@@ -21,18 +21,17 @@ def get_header(message, name):
|
|||||||
|
|
||||||
|
|
||||||
def get_header_items(message):
|
def get_header_items(message):
|
||||||
if six.PY3:
|
for (key, values) in get_headers(message):
|
||||||
return dict(message._headers).items()
|
for value in values:
|
||||||
else:
|
yield key, value
|
||||||
return message.dict.items()
|
|
||||||
|
|
||||||
|
|
||||||
def get_headers(response):
|
def get_headers(message):
|
||||||
for key in response.msg.keys():
|
for key in set(message.keys()):
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
yield key, response.msg.get_all(key)
|
yield key, message.get_all(key)
|
||||||
else:
|
else:
|
||||||
yield key, response.msg.getheaders(key)
|
yield key, message.getheaders(key)
|
||||||
|
|
||||||
|
|
||||||
def get_httpmessage(headers):
|
def get_httpmessage(headers):
|
||||||
|
|||||||
Reference in New Issue
Block a user