Skip to content

IO object used in requests data #744

@Zhong-Zendesk

Description

@Zhong-Zendesk

Describe the bug

I have an edge case where I had to use BytesIO as the data for requests, in production environment, the IO is consumed after the first request, and all subsequent requests read '' as a result. I wanted to reproduce this behavior/issue in tests (for regression tests). However, there seems to be no way to reproduce this behavior.

Additional context

No response

Version of responses

0.25.3

Steps to Reproduce

# reproduction_test.py
import io

import pytest_responses
import requests


def bad_io():
    data = io.BytesIO(b"some binary data")
    first = requests.post("https://httpbin.org/post", data=data)
    last = requests.post("https://httpbin.org/post", data=data)
    return first, last

def test_with_responses(responses):
    responses.add(responses.POST, "https://httpbin.org/post")
    bad_io()
    assert responses.calls[0].request.body.getvalue() == b"some binary data"
    assert responses.calls[1].request.body.getvalue() == b""

if __name__ == "__main__":
    import pprint
    first_repsonse, last_response = bad_io()
   

    pprint.pprint(first_repsonse.json()["data"])
    pprint.pprint(last_response.json()["data"])

compare the difference in body/data between
python reproduction_test.py
vs
pytest reproduction_test.py

Expected Result

Test passes - the IO object is read/consumed after the first request
The second request body is ``

Actual Result

Test fails.
The second request got the same payload as the initial request.

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions