use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use super::cdp::client::CdpClient; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Cookie { pub name: String, pub value: String, pub domain: String, pub path: String, #[serde(default)] pub expires: f64, #[serde(default)] pub size: i64, #[serde(default)] pub http_only: bool, #[serde(default)] pub secure: bool, #[serde(default)] pub session: bool, #[serde(skip_serializing_if = "Option::is_none")] pub same_site: Option, } pub async fn get_cookies( client: &CdpClient, session_id: &str, urls: Option>, ) -> Result, String> { let params = match urls { Some(ref u) if !u.is_empty() => json!({ "urls": u }), _ => json!({}), }; let result = client .send_command("Network.getCookies", Some(params), Some(session_id)) .await?; let cookies: Vec = result .get("cookies") .and_then(|v| serde_json::from_value(v.clone()).ok()) .unwrap_or_default(); Ok(cookies) } pub async fn set_cookies( client: &CdpClient, session_id: &str, cookies: Vec, current_url: Option<&str>, ) -> Result<(), String> { let cookies: Vec = cookies .into_iter() .map(|mut c| { // Auto-fill url if no domain/path/url provided if c.get("url").is_none() && c.get("domain").is_none() && current_url.is_some() { c.as_object_mut().map(|m| { m.insert( "url".to_string(), Value::String(current_url.unwrap().to_string()), ) }); } c }) .collect(); client .send_command( "Network.setCookies", Some(json!({ "cookies": cookies })), Some(session_id), ) .await?; Ok(()) } pub async fn clear_cookies(client: &CdpClient, session_id: &str) -> Result<(), String> { client .send_command_no_params("Network.clearBrowserCookies", Some(session_id)) .await?; Ok(()) }