From 624212ef1537bc9c232bec848c6447499635c5b7 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Sat, 7 Dec 2013 15:50:30 -1000 Subject: [PATCH] Store Headers as a List This is a backwards-incompatible change that will store headers as a list rather than a dictionary. The reason being that you can have multiple values for a single header, and concatenating them together with commas can create an unparseable string (sometimes the header values can have commas in them) --- tests/integration/test_wild.py | 17 +++++++++++++++++ vcr/stubs/__init__.py | 26 +++++++++++++------------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/tests/integration/test_wild.py b/tests/integration/test_wild.py index 13f6caa..0c4c2d9 100644 --- a/tests/integration/test_wild.py +++ b/tests/integration/test_wild.py @@ -52,3 +52,20 @@ def test_flickr_should_respond_with_200(tmpdir): with vcr.use_cassette(testfile): r = requests.post("http://api.flickr.com/services/upload") assert r.status_code == 200 + +def x_test_zip_file(tmpdir): + # TODO: How do I make this pass? + zipfile = "http://www.colorado.edu/conflict/peace/download/peace_example.ZIP" + testfile = str(tmpdir.join('test.json')) + with vcr.use_cassette(testfile, serializer='json'): + r = requests.post(zipfile) + +def test_cookies(tmpdir): + testfile = str(tmpdir.join('cookies.yml')) + with vcr.use_cassette(testfile): + s = requests.Session() + r1 = s.get("http://httpbin.org/cookies/set?k1=v1&k2=v2") + r2 = s.get("http://httpbin.org/cookies") + assert len(r2.json()['cookies']) == 2 + + diff --git a/vcr/stubs/__init__.py b/vcr/stubs/__init__.py index 9871069..801a93c 100644 --- a/vcr/stubs/__init__.py +++ b/vcr/stubs/__init__.py @@ -6,6 +6,14 @@ from cStringIO import StringIO from vcr.request import Request +def parse_headers(header_list): + headers = "".join(header_list) + "\r\n" + msg = HTTPMessage(StringIO(headers)) + msg.fp.seek(0) + msg.readheaders() + return msg + + class VCRHTTPResponse(object): """ Stub reponse class that gets returned instead of a HTTPResponse @@ -18,17 +26,8 @@ class VCRHTTPResponse(object): self._content = StringIO(self.recorded_response['body']['string']) self.closed = False - # We are skipping the header parsing (they have already been parsed - # at this point) and directly adding the headers to the header - # container, so just pass an empty StringIO. - self.msg = HTTPMessage(StringIO('')) - - for key, val in self.recorded_response['headers'].iteritems(): - self.msg.addheader(key, val) - # msg.addheaders adds the headers to msg.dict, but not to - # the msg.headers list representation of headers, so - # I have to add it to both. - self.msg.headers.append("{0}:{1}".format(key, val)) + headers = self.recorded_response['headers'] + self.msg = parse_headers(headers) self.length = self.msg.getheader('content-length') or None @@ -47,7 +46,8 @@ class VCRHTTPResponse(object): return self.closed def getheaders(self): - return self.recorded_response['headers'].iteritems() + headers = parse_headers(self.recorded_response['headers']) + return headers.dict.iteritems() class VCRConnectionMixin: @@ -201,7 +201,7 @@ class VCRConnectionMixin: 'code': response.status, 'message': response.reason }, - 'headers': dict(response.getheaders()), + 'headers': response.msg.headers, 'body': {'string': response.read()}, } self.cassette.append(self._vcr_request, response)