-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy path_cookies.py
More file actions
70 lines (61 loc) · 2.22 KB
/
_cookies.py
File metadata and controls
70 lines (61 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from http.cookiejar import Cookie
from typing import Any
from urllib.parse import urlparse
from scrapy.http import Request
from scrapy.http.cookies import CookieJar
def _get_cookie_jar(request: Request, cookie_jars: dict[Any, CookieJar]) -> CookieJar:
jar_id = request.meta.get("cookiejar")
return cookie_jars[jar_id]
def _get_cookie_domain(cookie, url):
domain = cookie.get("domain")
if domain:
return domain
domain = urlparse(url).hostname
if domain:
return domain
raise ValueError(
f"Got a cookie without a domain from URL {url} which has no domain either."
)
def _process_cookies(
api_response: dict[str, Any],
request: Request,
cookie_jars: dict[Any, CookieJar] | None,
):
if not cookie_jars:
return
response_cookies = api_response.get("experimental", {}).get("responseCookies")
if not response_cookies:
return
cookie_jar = _get_cookie_jar(request, cookie_jars)
for response_cookie in response_cookies:
rest = {}
http_only = response_cookie.get("httpOnly", None)
if http_only is not None:
rest["httpOnly"] = http_only
same_site = response_cookie.get("sameSite", None)
if same_site is not None:
rest["sameSite"] = same_site
cookie = Cookie(
version=1,
name=response_cookie["name"],
value=response_cookie["value"],
port=None,
port_specified=False,
domain=_get_cookie_domain(response_cookie, api_response["url"]),
domain_specified="domain" in response_cookie,
domain_initial_dot=response_cookie.get("domain", "").startswith("."),
path=response_cookie.get("path", "/"),
path_specified="path" in response_cookie,
secure=response_cookie.get("secure", False),
expires=response_cookie.get("expires", None),
discard=False,
comment=None,
comment_url=None,
rest=rest,
)
cookie_jar.set_cookie(cookie)
def _get_all_cookies(
request: Request, cookie_jars: dict[Any, CookieJar]
) -> list[Cookie]:
cookie_jar = _get_cookie_jar(request, cookie_jars)
return list(cookie_jar.jar)