diff --git a/requests/exceptions.py b/requests/exceptions.py index 2f093baf..314783b7 100644 --- a/requests/exceptions.py +++ b/requests/exceptions.py @@ -109,10 +109,6 @@ class UnrewindableBodyError(RequestException): """Requests encountered an error when trying to rewind a body""" -class ConflictingHeaderError(RequestException): - """Mutually exclusive request headers set""" - - class InvalidBodyError(RequestException, ValueError): """An invalid request body was specified""" diff --git a/requests/models.py b/requests/models.py index 2b3e1fe3..ac348e9d 100644 --- a/requests/models.py +++ b/requests/models.py @@ -33,7 +33,7 @@ from .packages.urllib3.exceptions import ( from .exceptions import ( HTTPError, MissingScheme, InvalidURL, ChunkedEncodingError, ContentDecodingError, ConnectionError, StreamConsumedError, - ConflictingHeaderError) + InvalidHeader, InvalidBodyError) from ._internal_utils import to_native_string, unicode_is_ascii from .utils import ( guess_filename, get_auth_from_url, requote_uri, @@ -510,7 +510,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): If the length of the body of the request can be computed, Content-Length is set using ``super_len``. If user has manually set either a Transfer-Encoding or Content-Length header when it should not be set - (they should be mutually exclusive) a ConflictingHeaderError + (they should be mutually exclusive) an InvalidHeader error will be raised. """ if body is not None: @@ -523,10 +523,13 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): else: raise InvalidBodyError('Non-null body must have length or be streamable.') elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) self.headers['Content-Length'] = '0' if 'Transfer-Encoding' in self.headers and 'Content-Length' in self.headers: - raise ConflictingHeaderError('Transfer-Encoding and Content-Length headers both set.') + raise InvalidHeader('Conflicting Headers: Both Transfer-Encoding and ' + 'Content-Length are set.') def prepare_auth(self, auth, url=''): """Prepares the given HTTP auth data.""" diff --git a/tests/test_requests.py b/tests/test_requests.py index 3beb861d..780ebbbc 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -25,7 +25,7 @@ from requests.cookies import ( from requests.exceptions import ( ConnectionError, ConnectTimeout, InvalidScheme, InvalidURL, MissingScheme, ReadTimeout, Timeout, RetryError, TooManyRedirects, - ProxyError, InvalidHeader, UnrewindableBodyError, ConflictingHeaderError) + ProxyError, InvalidHeader, UnrewindableBodyError) from requests.models import PreparedRequest from requests.structures import CaseInsensitiveDict from requests.sessions import SessionRedirectMixin @@ -1926,28 +1926,28 @@ class TestRequests: def test_chunked_upload_with_manually_set_content_length_header_raises_error(self, httpbin): """Ensure that if a user manually sets a content length header, when - the data is chunked, that a ConflictingHeaderError is raised. + the data is chunked, that an InvalidHeader error is raised. """ data = (i for i in [b'a', b'b', b'c']) url = httpbin('post') - with pytest.raises(ConflictingHeaderError): + with pytest.raises(InvalidHeader): r = requests.post(url, data=data, headers={'Content-Length': 'foo'}) def test_content_length_with_manually_set_transfer_encoding_raises_error(self, httpbin): """Ensure that if a user manually sets a Transfer-Encoding header when - data is not chunked that an ConflictingHeaderError is raised. + data is not chunked that an InvalidHeader error is raised. """ data = 'test data' url = httpbin('post') - with pytest.raises(ConflictingHeaderError): + with pytest.raises(InvalidHeader): r = requests.post(url, data=data, headers={'Transfer-Encoding': 'chunked'}) def test_null_body_does_not_raise_error(self, httpbin): url = httpbin('post') try: requests.post(url, data=None) - except ConflictingHeaderError: - pytest.fail('ConflictingHeaderError raised.') + except InvalidHeader: + pytest.fail('InvalidHeader error raised unexpectedly.') def test_custom_redirect_mixin(self, httpbin): """Tests a custom mixin to overwrite ``get_redirect_target``.