|
6 | 6 | import msgpack
|
7 | 7 | from requests.structures import CaseInsensitiveDict
|
8 | 8 |
|
9 |
| -from .compat import HTTPResponse, pickle |
| 9 | +from .compat import HTTPResponse, pickle, text_type |
10 | 10 |
|
11 | 11 |
|
12 | 12 | def _b64_decode_bytes(b):
|
@@ -37,27 +37,40 @@ def dumps(self, request, response, body=None):
|
37 | 37 | # `Serializer.dump`.
|
38 | 38 | response._fp = io.BytesIO(body)
|
39 | 39 |
|
| 40 | + # NOTE: This is all a bit weird, but it's really important that on |
| 41 | + # Python 2.x these objects are unicode and not str, even when |
| 42 | + # they contain only ascii. The problem here is that msgpack |
| 43 | + # understands the difference between unicode and bytes and we |
| 44 | + # have it set to differentiate between them, however Python 2 |
| 45 | + # doesn't know the difference. Forcing these to unicode will be |
| 46 | + # enough to have msgpack know the difference. |
40 | 47 | data = {
|
41 |
| - "response": { |
42 |
| - "body": body, |
43 |
| - "headers": dict(response.headers), |
44 |
| - "status": response.status, |
45 |
| - "version": response.version, |
46 |
| - "reason": response.reason, |
47 |
| - "strict": response.strict, |
48 |
| - "decode_content": response.decode_content, |
| 48 | + u"response": { |
| 49 | + u"body": body, |
| 50 | + u"headers": dict( |
| 51 | + (text_type(k), text_type(v)) |
| 52 | + for k, v in response.headers.items() |
| 53 | + ), |
| 54 | + u"status": response.status, |
| 55 | + u"version": response.version, |
| 56 | + u"reason": text_type(response.reason), |
| 57 | + u"strict": response.strict, |
| 58 | + u"decode_content": response.decode_content, |
49 | 59 | },
|
50 | 60 | }
|
51 | 61 |
|
52 | 62 | # Construct our vary headers
|
53 |
| - data["vary"] = {} |
54 |
| - if "vary" in response_headers: |
55 |
| - varied_headers = response_headers['vary'].split(',') |
| 63 | + data[u"vary"] = {} |
| 64 | + if u"vary" in response_headers: |
| 65 | + varied_headers = response_headers[u'vary'].split(',') |
56 | 66 | for header in varied_headers:
|
57 | 67 | header = header.strip()
|
58 |
| - data["vary"][header] = request.headers.get(header, None) |
| 68 | + header_value = request.headers.get(header, None) |
| 69 | + if header_value is not None: |
| 70 | + header_value = text_type(header_value) |
| 71 | + data[u"vary"][header] = header_value |
59 | 72 |
|
60 |
| - return b",".join([b"cc=3", msgpack.dumps(data, use_bin_type=True)]) |
| 73 | + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) |
61 | 74 |
|
62 | 75 | def loads(self, request, data):
|
63 | 76 | # Short circuit if we've been given an empty set of data
|
@@ -167,6 +180,12 @@ def _loads_v2(self, request, data):
|
167 | 180 | return self.prepare_response(request, cached)
|
168 | 181 |
|
169 | 182 | def _loads_v3(self, request, data):
|
| 183 | + # Due to Python 2 encoding issues, it's impossible to know for sure |
| 184 | + # exactly how to load v3 entries, thus we'll treat these as a miss so |
| 185 | + # that they get rewritten out as v4 entries. |
| 186 | + return |
| 187 | + |
| 188 | + def _loads_v4(self, request, data): |
170 | 189 | try:
|
171 | 190 | cached = msgpack.loads(data, encoding='utf-8')
|
172 | 191 | except ValueError:
|
|
0 commit comments