如何从 vcrpy 二进制响应字符串中提取未压缩的文本?
How can I extract the uncompressed text from vcrpy binary response strings?
我正在使用 vcrpy 对我的应用程序进行自动 http 模拟测试。这很好用。然而,我的模拟包括编码 'gzip' 和 'deflate',这意味着 vcrpy 记录响应是二进制格式。这是一个例子:
interactions:
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Basic Y2hlc3RlcjpiYWRnZXI=]
Connection: [keep-alive]
User-Agent: [python-requests/2.9.1]
method: GET
uri: http://localhost:8153/go/compare/DeployProduction/14/with/15
response:
body:
string: !!binary |
H4sIAAAAAAAAAO08bXPbNpPf8ytQ9q6yp+Y7KZGKrU7quG1mEscXO7276XQ0IAlKjCmCQ0KW9TxP
/vstAJIiJUpxkkvS3tmTiSRisVjsG3YXIE6/e/76/Oa/ry7QbzevXk6enM7ZIkX3izQrz5Q5Y/lY
11erlbayNVrMdNP3ff2ewygcluBo8gTB3ylLWErk93O6yHFB0FWSkzTJSImu8IwgFf1Kn5zqFeCT
U2i6RREJlrMzJcZpSRQ0L0h8pugzquOyJKzUcZ6nSYhZQjPVCG0PE9saObHthJbjE2L79tCPhhY2
ImxZlhEH2Hbt0PB8NyCBZ8RO6NsksoZDi1haWJYKWpAowWcKTlMFFSQ9U0q2Tkk5J4QpSJ88jKwc
M0aKrEtf6EeBEYXG0ByFERmR2A9sO8CmPzR8LyAYEyOwwpHj48COseOaLgmsUehiHAxjOzYfRt+T
0+9UFV3fPHtzM0Z5QRll65ygOaW3JYppgQALSrJ3JOREIVWtu1xcPn94hzIskpxtsaEswr3CCYwA
pjUMh8Qf+iZIY2hGpu063iiyTOyDUPxRbFrRyPJHxHRBIiChKIij2LfMUWxo70plcqrLcUEK3/2R
(省略附加输出)
我读过 decompressing zlib,但它没有解决二进制 yaml 的解码问题。
为了查看原文和验证测试结果,如何将这些二进制字符串转换成它们的原始格式?
yaml 文件中的主体字符串是 base64 编码的,但是当您加载它时,您将获得原始字节流。如果您好奇,请阅读 how to decode a base64 string,尽管这不是必需的。
如果前三个字节是 \x1f\x8b\x08
,您就知道您拥有一个 gzip 字节流。如果你想手动解码,请阅读 here,但 vcr 有一个包装方法,它也会在解码正文后更新一些头信息。这个函数是vcr.filters.decode_response()
.
为了举例说明这一点,我将使用文件 \tests\fixtures\wild\domain_redirect.yaml。有两个交互,其中第二个包含编码数据。
import yaml
from vcr.filters import decode_response
with open('domain_redirect.yaml', 'r') as f:
doc = yaml.load(f)
response = doc['interactions'][1]['response']
decoded = decode_response(response)
print(decoded['body']['string'])
我正在使用 vcrpy 对我的应用程序进行自动 http 模拟测试。这很好用。然而,我的模拟包括编码 'gzip' 和 'deflate',这意味着 vcrpy 记录响应是二进制格式。这是一个例子:
interactions:
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Basic Y2hlc3RlcjpiYWRnZXI=]
Connection: [keep-alive]
User-Agent: [python-requests/2.9.1]
method: GET
uri: http://localhost:8153/go/compare/DeployProduction/14/with/15
response:
body:
string: !!binary |
H4sIAAAAAAAAAO08bXPbNpPf8ytQ9q6yp+Y7KZGKrU7quG1mEscXO7276XQ0IAlKjCmCQ0KW9TxP
/vstAJIiJUpxkkvS3tmTiSRisVjsG3YXIE6/e/76/Oa/ry7QbzevXk6enM7ZIkX3izQrz5Q5Y/lY
11erlbayNVrMdNP3ff2ewygcluBo8gTB3ylLWErk93O6yHFB0FWSkzTJSImu8IwgFf1Kn5zqFeCT
U2i6RREJlrMzJcZpSRQ0L0h8pugzquOyJKzUcZ6nSYhZQjPVCG0PE9saObHthJbjE2L79tCPhhY2
ImxZlhEH2Hbt0PB8NyCBZ8RO6NsksoZDi1haWJYKWpAowWcKTlMFFSQ9U0q2Tkk5J4QpSJ88jKwc
M0aKrEtf6EeBEYXG0ByFERmR2A9sO8CmPzR8LyAYEyOwwpHj48COseOaLgmsUehiHAxjOzYfRt+T
0+9UFV3fPHtzM0Z5QRll65ygOaW3JYppgQALSrJ3JOREIVWtu1xcPn94hzIskpxtsaEswr3CCYwA
pjUMh8Qf+iZIY2hGpu063iiyTOyDUPxRbFrRyPJHxHRBIiChKIij2LfMUWxo70plcqrLcUEK3/2R
(省略附加输出)
我读过 decompressing zlib,但它没有解决二进制 yaml 的解码问题。
为了查看原文和验证测试结果,如何将这些二进制字符串转换成它们的原始格式?
yaml 文件中的主体字符串是 base64 编码的,但是当您加载它时,您将获得原始字节流。如果您好奇,请阅读 how to decode a base64 string,尽管这不是必需的。
如果前三个字节是 \x1f\x8b\x08
,您就知道您拥有一个 gzip 字节流。如果你想手动解码,请阅读 here,但 vcr 有一个包装方法,它也会在解码正文后更新一些头信息。这个函数是vcr.filters.decode_response()
.
为了举例说明这一点,我将使用文件 \tests\fixtures\wild\domain_redirect.yaml。有两个交互,其中第二个包含编码数据。
import yaml
from vcr.filters import decode_response
with open('domain_redirect.yaml', 'r') as f:
doc = yaml.load(f)
response = doc['interactions'][1]['response']
decoded = decode_response(response)
print(decoded['body']['string'])