diff --git a/vcr/serializers/compat.py b/vcr/serializers/compat.py index 489a508..30ffc9f 100644 --- a/vcr/serializers/compat.py +++ b/vcr/serializers/compat.py @@ -15,7 +15,7 @@ def convert_to_unicode(resp): def convert_headers_to_bytes(resp): try: - resp['headers'] = [h.encode('utf-8') for h in resp['headers']] + resp['headers'] = dict([(k.encode('utf-8'), [v.encode('utf-8') for v in values]) for k, values in resp['headers'].items()]) except (KeyError, TypeError): pass return resp @@ -23,7 +23,7 @@ def convert_headers_to_bytes(resp): def convert_headers_to_unicode(resp): try: - resp['headers'] = [h.decode('utf-8') for h in resp['headers']] + resp['headers'] = dict([(k.decode('utf-8'), [v.decode('utf-8') for v in values]) for k, values in resp['headers'].items()]) except (KeyError, TypeError): pass return resp diff --git a/vcr/stubs/__init__.py b/vcr/stubs/__init__.py index 2d88da2..dde5efd 100644 --- a/vcr/stubs/__init__.py +++ b/vcr/stubs/__init__.py @@ -42,25 +42,22 @@ class VCRFakeSocket(object): return 0 # wonder how bad this is.... -def parse_headers_backwards_compat(header_dict): - """ - In vcr 0.6.0, I changed the cassettes to store - headers as a list instead of a dict. This method - parses the old dictionary-style headers for - backwards-compatability reasons. - """ - msg = HTTPMessage(BytesIO("")) - for key, val in header_dict.items(): - msg.addheader(key, val) - msg.headers.append("{0}:{1}".format(key, val)) - return msg - - def parse_headers(header_list): - if isinstance(header_list, dict): - return parse_headers_backwards_compat(header_list) - headers = b"".join(header_list) + b"\r\n" - return compat.get_httpmessage(headers) + """ + Convert headers from our serialized dict with lists for keys to a + HTTPMessage + """ + header_string = b"" + for k, v in header_list.items(): + for v in v: + header_string += k.encode('utf-8') + b":" + v.encode('utf-8') + b"\r\n" + return compat.get_httpmessage(header_string) + +def serialize_headers(response): + out = {} + for k, v in response.getheaders(): + out.setdefault(k, []).append(v) + return out class VCRHTTPResponse(HTTPResponse): @@ -246,7 +243,7 @@ class VCRConnection: 'code': response.status, 'message': response.reason }, - 'headers': compat.get_headers(response), + 'headers': serialize_headers(response), 'body': {'string': response.read()}, } self.cassette.append(self._vcr_request, response)