For response bodies, assuming the server didn't send an explicit encoding then HTTPX will do its best to figure out an appropriate encoding. Unlike Requests which uses the `chardet` library, HTTPX relies on a plainer fallback strategy (basically attempting UTF-8, or using Windows-1252 as a fallback). This strategy should be robust enough to handle the vast majority of use cases.
+## Cookies
+
+If using a client instance, then cookies should always be set on the client rather than on a per-request basis.
+
+This usage is supported:
+
+```python
+client = httpx.Client(cookies=...)
+client.post(...)
+```
+
+This usage is **not** supported:
+
+```python
+client = httpx.Client()
+client.post(..., cookies=...)
+```
+
+We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur.
+
## Status Codes
In our documentation we prefer the uppercased versions, such as `codes.NOT_FOUND`, but also provide lower-cased versions for API compatibility with `requests`.
```
"""
with Client(
- proxies=proxies, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env
+ cookies=cookies,
+ proxies=proxies,
+ cert=cert,
+ verify=verify,
+ timeout=timeout,
+ trust_env=trust_env,
) as client:
return client.request(
method=method,
json=json,
params=params,
headers=headers,
- cookies=cookies,
auth=auth,
allow_redirects=allow_redirects,
)
[0]: /quickstart#streaming-responses
"""
with Client(
- proxies=proxies, cert=cert, verify=verify, trust_env=trust_env
+ cookies=cookies, proxies=proxies, cert=cert, verify=verify, trust_env=trust_env
) as client:
with client.stream(
method=method,
json=json,
params=params,
headers=headers,
- cookies=cookies,
auth=auth,
allow_redirects=allow_redirects,
) as response:
[0]: /advanced/#merging-of-configuration
"""
+ if cookies is not None:
+ message = (
+ "Setting per-request cookies=<...> is being deprecated, because "
+ "the expected behaviour on cookie persistence is ambiguous. Set "
+ "cookies directly on the client instance instead."
+ )
+ warnings.warn(message, DeprecationWarning)
+
request = self.build_request(
method=method,
url=url,
from http.cookiejar import Cookie, CookieJar
+import pytest
+
import httpx
url = "http://example.org/echo_cookies"
cookies = {"example-name": "example-value"}
+ client = httpx.Client(
+ cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies)
+ )
+ response = client.get(url)
+
+ assert response.status_code == 200
+ assert response.json() == {"cookies": "example-name=example-value"}
+
+
+def test_set_per_request_cookie_is_deprecated() -> None:
+ """
+ Sending a request including a per-request cookie is deprecated.
+ """
+ url = "http://example.org/echo_cookies"
+ cookies = {"example-name": "example-value"}
+
client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies))
- response = client.get(url, cookies=cookies)
+ with pytest.warns(DeprecationWarning):
+ response = client.get(url, cookies=cookies)
assert response.status_code == 200
assert response.json() == {"cookies": "example-name=example-value"}
)
cookies.set_cookie(cookie)
- client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies))
- response = client.get(url, cookies=cookies)
+ client = httpx.Client(
+ cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies)
+ )
+ response = client.get(url)
assert response.status_code == 200
assert response.json() == {"cookies": "example-name=example-value"}
)
cookies.set_cookie(cookie)
- client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies))
- client.cookies = cookies # type: ignore
+ client = httpx.Client(
+ cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies)
+ )
response = client.get(url)
assert response.status_code == 200
cookies["example-name"] = "example-value"
client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies))
- response = client.get(url, cookies=cookies)
+ client.cookies = cookies
+ response = client.get(url)
assert response.status_code == 200
assert response.json() == {"cookies": "example-name=example-value"}