cdp_core/network/
cookies.rs

1use crate::error::Result;
2use crate::page::Page;
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6// Re-exporting the generated Cookie type for easier access
7pub use cdp_protocol::network::{Cookie, CookiePriority, CookieSameSite};
8
9/// Parameters for setting a cookie.
10/// This struct provides a high-level interface for `Network.setCookie`.
11#[derive(Debug, Serialize, Deserialize, Clone, Default)]
12pub struct SetCookieParams {
13    pub name: String,
14    pub value: String,
15    pub url: Option<String>,
16    pub domain: Option<String>,
17    pub path: Option<String>,
18    pub secure: Option<bool>,
19    pub http_only: Option<bool>,
20    pub same_site: Option<cdp_protocol::network::CookieSameSite>,
21    pub expires: Option<f64>, // CDP uses a specific timestamp format
22    pub priority: Option<cdp_protocol::network::CookiePriority>,
23}
24
25#[async_trait]
26pub trait CookieManager {
27    /// Gets cookies for the current page context.
28    async fn get_cookies(&self, urls: Option<Vec<String>>) -> Result<Vec<Cookie>>;
29
30    /// Sets a cookie.
31    async fn set_cookie(&self, cookie: SetCookieParams) -> Result<bool>;
32
33    /// Deletes cookies.
34    async fn delete_cookies(
35        &self,
36        name: &str,
37        url: Option<String>,
38        domain: Option<String>,
39        path: Option<String>,
40    ) -> Result<()>;
41
42    /// Clears all browser cookies for the current browser context.
43    async fn clear_browser_cookies(&self) -> Result<()>;
44}
45
46#[async_trait]
47impl CookieManager for Page {
48    async fn get_cookies(&self, urls: Option<Vec<String>>) -> Result<Vec<Cookie>> {
49        use cdp_protocol::network::{GetCookies, GetCookiesReturnObject};
50
51        let params = GetCookies { urls };
52        let result: GetCookiesReturnObject = self.session.send_command(params, None).await?;
53        Ok(result.cookies)
54    }
55
56    async fn set_cookie(&self, cookie: SetCookieParams) -> Result<bool> {
57        use cdp_protocol::network::{SetCookie, SetCookieReturnObject};
58
59        let params = SetCookie {
60            name: cookie.name,
61            value: cookie.value,
62            url: cookie.url,
63            domain: cookie.domain,
64            path: cookie.path,
65            secure: cookie.secure,
66            http_only: cookie.http_only,
67            same_site: cookie.same_site,
68            expires: cookie.expires,
69            priority: cookie.priority,
70            same_party: None,
71            source_scheme: None,
72            source_port: None,
73            partition_key: None,
74        };
75
76        let result: SetCookieReturnObject = self.session.send_command(params, None).await?;
77        Ok(result.success)
78    }
79
80    async fn delete_cookies(
81        &self,
82        name: &str,
83        url: Option<String>,
84        domain: Option<String>,
85        path: Option<String>,
86    ) -> Result<()> {
87        use cdp_protocol::network::{DeleteCookies, DeleteCookiesReturnObject};
88
89        let params = DeleteCookies {
90            name: name.to_string(),
91            url,
92            domain,
93            path,
94            partition_key: None,
95        };
96
97        self.session
98            .send_command::<_, DeleteCookiesReturnObject>(params, None)
99            .await?;
100        Ok(())
101    }
102
103    async fn clear_browser_cookies(&self) -> Result<()> {
104        use cdp_protocol::network::{ClearBrowserCookies, ClearBrowserCookiesReturnObject};
105
106        let params = ClearBrowserCookies(None);
107        self.session
108            .send_command::<_, ClearBrowserCookiesReturnObject>(params, None)
109            .await?;
110        Ok(())
111    }
112}