getsentry / responses

A utility for mocking out the Python Requests library.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

With `urllib3>=2`, mocking HEAD response with content-length header set requires body

KennyChenBasis opened this issue · comments

Describe the bug

With urllib3>=2, mocking HEAD responses with content-length header set requires a body with the right length, otherwise an IncompleteRead is raised. This should not be the case since HEAD responses do not have bodies.

Additional context

The fix is probably to pass the request method to HTTPResponse when forming the response. See the code around https://github.com/urllib3/urllib3/blob/733f638a2faa02b4ff8a9f3b5668949d39396b8b/src/urllib3/response.py#L624.

Version of responses

0.25.0

Steps to Reproduce

Run pytest on

import requests
import responses


def test_download():
    url = 'http://test'
    content = b'download me'
    headers = {'Content-length': str(len(content))}
    with responses.RequestsMock() as rsps:
        rsps.head(url, headers=headers)

        res = requests.head(url)
        res.raise_for_status()
        assert int(res.headers['content-length']) == 11
        assert res.text == ''

Expected Result

Test passes, like with urllib3<2.

Actual Result

Test fails with requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read, 11 more expected)', IncompleteRead(0 bytes read, 11 more expected)).