from urllib.request import parse_http_list
from ._exceptions import ProtocolError
-from ._models import Request, Response
+from ._models import Cookies, Request, Response
from ._utils import to_bytes, to_str, unquote
if typing.TYPE_CHECKING: # pragma: no cover
request.headers["Authorization"] = self._build_auth_header(
request, self._last_challenge
)
+ if response.cookies:
+ Cookies(response.cookies).set_cookie_header(request=request)
yield request
def _parse_challenge(
"WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."'
}
response = httpx.Response(
- content=b"Auth required", status_code=401, headers=headers
+ content=b"Auth required", status_code=401, headers=headers, request=request
)
request = flow.send(response)
assert request.headers["Authorization"].startswith("Digest")
"WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."'
}
response = httpx.Response(
- content=b"Auth required", status_code=401, headers=headers
+ content=b"Auth required", status_code=401, headers=headers, request=request
)
first_request = flow.send(response)
assert first_request.headers["Authorization"].startswith("Digest")
response = httpx.Response(content=b"Hello, world!", status_code=200)
with pytest.raises(StopIteration):
flow.send(response)
+
+
+def set_cookies(request: httpx.Request) -> httpx.Response:
+ headers = {
+ "Set-Cookie": "session=.session_value...",
+ "WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."',
+ }
+ if request.url.path == "/auth":
+ return httpx.Response(
+ content=b"Auth required", status_code=401, headers=headers
+ )
+ else:
+ raise NotImplementedError() # pragma: no cover
+
+
+def test_digest_auth_setting_cookie_in_request():
+ url = "https://www.example.com/auth"
+ client = httpx.Client(transport=httpx.MockTransport(set_cookies))
+ request = client.build_request("GET", url)
+
+ auth = httpx.DigestAuth(username="user", password="pass")
+ flow = auth.sync_auth_flow(request)
+ request = next(flow)
+ assert "Authorization" not in request.headers
+
+ response = client.get(url)
+ assert len(response.cookies) > 0
+ assert response.cookies["session"] == ".session_value..."
+
+ request = flow.send(response)
+ assert request.headers["Authorization"].startswith("Digest")
+ assert request.headers["Cookie"] == "session=.session_value..."
+
+ # No other requests are made.
+ response = httpx.Response(
+ content=b"Hello, world!", status_code=200, request=request
+ )
+ with pytest.raises(StopIteration):
+ flow.send(response)