diff --git a/impit-python/src/request.rs b/impit-python/src/request.rs index 0a67909c..1e919f3b 100644 --- a/impit-python/src/request.rs +++ b/impit-python/src/request.rs @@ -137,10 +137,16 @@ pub(crate) fn to_body( None => ImpitBody::Empty, Some(RequestBody::Bytes(bytes)) => bytes.into(), Some(RequestBody::Form(form)) => { - headers.get_or_insert_default().insert( - "Content-Type".to_string(), - "application/x-www-form-urlencoded".to_string(), - ); + let headers = headers.get_or_insert_default(); + if !headers + .keys() + .any(|name| name.eq_ignore_ascii_case("content-type")) + { + headers.insert( + "Content-Type".to_string(), + "application/x-www-form-urlencoded".to_string(), + ); + } form_to_bytes(form).into() } Some(RequestBody::Text(text)) => text.into_bytes().into(), diff --git a/impit-python/test/async_client_test.py b/impit-python/test/async_client_test.py index 459fd8df..13b2308e 100644 --- a/impit-python/test/async_client_test.py +++ b/impit-python/test/async_client_test.py @@ -610,6 +610,21 @@ async def test_form_non_ascii(self, browser: Browser) -> None: assert response.status_code == 200 assert json.loads(response.text)['form']['Impit-Test'] == 'πŸ‘ΎπŸ•΅πŸ»β€β™‚οΈπŸ§‘β€πŸ’»' + @pytest.mark.asyncio + async def test_form_keeps_custom_content_type(self, browser: Browser) -> None: + impit = AsyncClient(browser=browser) + + with echoing_server() as port: + response = await impit.post( + f'http://localhost:{port}/', + data={'Impit-Test': 'foo'}, + headers={'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'}, + timeout=5, + ) + + assert 'content-type: application/x-www-form-urlencoded; charset=utf-8\r\n' in response.text.lower() + assert response.text.endswith('Impit-Test=foo') + @pytest.mark.asyncio async def test_passing_binary_body(self, browser: Browser) -> None: impit = AsyncClient(browser=browser) diff --git a/impit-python/test/basic_client_test.py b/impit-python/test/basic_client_test.py index 795981ec..b1a6de01 100644 --- a/impit-python/test/basic_client_test.py +++ b/impit-python/test/basic_client_test.py @@ -524,6 +524,20 @@ def test_form_non_ascii(self, browser: Browser) -> None: assert response.status_code == 200 assert response.json()['form']['Impit-Test'] == 'πŸ‘ΎπŸ•΅πŸ»β€β™‚οΈπŸ§‘β€πŸ’»' + def test_form_keeps_custom_content_type(self, browser: Browser) -> None: + impit = Client(browser=browser) + + with echoing_server() as port: + response = impit.post( + f'http://localhost:{port}/', + data={'Impit-Test': 'foo'}, + headers={'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'}, + timeout=5, + ) + + assert 'content-type: application/x-www-form-urlencoded; charset=utf-8\r\n' in response.text.lower() + assert response.text.endswith('Impit-Test=foo') + def test_passing_binary_body(self, browser: Browser) -> None: impit = Client(browser=browser)