如何从vcrpy二进制响应字符串中提取未压缩的文本?

时间:2016-04-01 21:37:48

标签: python mocking yaml

我使用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的解码问题。

这样我可以查看原始文本并验证测试结果,如何将这些二进制字符串转换为原始格式?

1 个答案:

答案 0 :(得分:1)

yaml文件中的正文字符串是base64编码的,但是当你加载它时,你将获得原始字节流。如果您感到好奇,请阅读how to decode a base64 string,但不一定非必要。

如果前三个字节是\x1f\x8b\x08,你知道你有一个gzip字节流。如果你想手动解码,请阅读here,但vcr有一个包装器方法,它也会在解码主体后更新一些头信息。此功能为vcr.filter.decode_response()

为了通过示例演示,我将使用文件\tests\fixtures\wild\domain_redirect.yaml。有两种交互,其中第二种包含编码数据。

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'])