1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 01:03:24 +00:00

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)
This commit is contained in:
Kevin McCarthy
2013-12-07 15:50:30 -10:00
parent 144d25bc66
commit 624212ef15
2 changed files with 30 additions and 13 deletions

View File

@@ -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

View File

@@ -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)