Fix redirect cookie behavior (#529)

* Fix redirect cookie behavior
* Drop flake8-comprehensions
* Add redirect cookie tests
This commit is contained in:
Tom Christie 2019-11-15 21:31:15 +00:00 committed by GitHub
parent 1a32cf036a
commit 5aca0c0172
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 10 deletions

View File

@ -51,7 +51,6 @@ class RedirectMiddleware(BaseMiddleware):
headers = self.redirect_headers(request, url, method) # TODO: merge headers?
content = self.redirect_content(request, method)
cookies = Cookies(self.cookies)
cookies.update(request.cookies)
return AsyncRequest(
method=method, url=url, headers=headers, data=content, cookies=cookies
)
@ -115,6 +114,11 @@ class RedirectMiddleware(BaseMiddleware):
# are only relevant to the request body.
headers.pop("Content-Length", None)
headers.pop("Transfer-Encoding", None)
# We should use the client cookie store to determine any cookie header,
# rather than whatever was on the original outgoing request.
headers.pop("Cookie", None)
return headers
def redirect_content(self, request: AsyncRequest, method: str) -> bytes:

View File

@ -24,14 +24,7 @@ def lint(session):
@nox.session
def check(session):
session.install(
"--upgrade",
"black",
"flake8",
"flake8-bugbear",
"flake8-comprehensions",
"flake8-pie",
"isort",
"mypy",
"--upgrade", "black", "flake8", "flake8-bugbear", "flake8-pie", "isort", "mypy"
)
session.run("black", "--check", "--diff", "--target-version=py36", *source_files)

View File

@ -6,7 +6,6 @@ brotlipy==0.7.*
cryptography
flake8
flake8-bugbear
flake8-comprehensions
flake8-pie
isort
mypy

View File

@ -290,3 +290,71 @@ async def test_cross_subdomain_redirect(backend):
url = "https://example.com/cross_subdomain"
response = await client.get(url)
assert response.url == URL("https://www.example.org/cross_subdomain")
class MockCookieDispatch(AsyncDispatcher):
async def send(
self,
request: AsyncRequest,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
) -> AsyncResponse:
if request.url.path == "/":
if "cookie" in request.headers:
content = b"Logged in"
else:
content = b"Not logged in"
return AsyncResponse(codes.OK, content=content, request=request)
elif request.url.path == "/login":
status_code = codes.SEE_OTHER
headers = {
"location": "/",
"set-cookie": (
"session=eyJ1c2VybmFtZSI6ICJ0b21; path=/; Max-Age=1209600; "
"httponly; samesite=lax"
),
}
return AsyncResponse(status_code, headers=headers, request=request)
elif request.url.path == "/logout":
status_code = codes.SEE_OTHER
headers = {
"location": "/",
"set-cookie": (
"session=null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; "
"httponly; samesite=lax"
),
}
return AsyncResponse(status_code, headers=headers, request=request)
async def test_redirect_cookie_behavior(backend):
client = AsyncClient(dispatch=MockCookieDispatch(), backend=backend)
# The client is not logged in.
response = await client.get("https://example.com/")
assert response.url == "https://example.com/"
assert response.text == "Not logged in"
# Login redirects to the homepage, setting a session cookie.
response = await client.post("https://example.com/login")
assert response.url == "https://example.com/"
assert response.text == "Logged in"
# The client is logged in.
response = await client.get("https://example.com/")
assert response.url == "https://example.com/"
assert response.text == "Logged in"
# Logout redirects to the homepage, expiring the session cookie.
response = await client.post("https://example.com/logout")
assert response.url == "https://example.com/"
assert response.text == "Not logged in"
# The client is not logged in.
response = await client.get("https://example.com/")
assert response.url == "https://example.com/"
assert response.text == "Not logged in"