Isolate CDP browser contexts
This commit is contained in:
1 parent
730bd01f57
commit
409ac781d2
6 files changed
+344
-41
No files matched your search
@@ -4,28 +4,45 @@ use crate::cookie_params::{parse_cdp_cookie, parse_delete_cookies_params};
|
||||
use crate::dispatch::CdpContext;
|
||||
use crate::domains::network::cookie_info_to_cdp_json;
|
||||
|
||||
fn cookie_jar_for(
|
||||
ctx: &CdpContext,
|
||||
params: &Value,
|
||||
session_id: &Option<String>,
|
||||
) -> Result<std::sync::Arc<obscura_net::CookieJar>, String> {
|
||||
match params.get("browserContextId").and_then(|value| value.as_str()) {
|
||||
Some(id) => ctx
|
||||
.browser_context(id)
|
||||
.map(|context| context.cookie_jar.clone())
|
||||
.ok_or_else(|| format!("Browser context not found: {}", id)),
|
||||
None => Ok(ctx
|
||||
.get_session_page(session_id)
|
||||
.map(|page| page.context.cookie_jar.clone())
|
||||
.unwrap_or_else(|| ctx.default_context.cookie_jar.clone())),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn handle(
|
||||
method: &str,
|
||||
params: &Value,
|
||||
ctx: &mut CdpContext,
|
||||
_session_id: &Option<String>,
|
||||
session_id: &Option<String>,
|
||||
) -> Result<Value, String> {
|
||||
match method {
|
||||
"getCookies" => {
|
||||
let cookies = ctx.default_context.cookie_jar.get_all_cookies();
|
||||
let cookies = cookie_jar_for(ctx, params, session_id)?.get_all_cookies();
|
||||
let cdp_cookies: Vec<Value> = cookies.iter().map(cookie_info_to_cdp_json).collect();
|
||||
Ok(json!({ "cookies": cdp_cookies }))
|
||||
}
|
||||
"setCookies" => {
|
||||
if let Some(cookies) = params.get("cookies").and_then(|v| v.as_array()) {
|
||||
let parsed: Vec<_> = cookies.iter().filter_map(parse_cdp_cookie).collect();
|
||||
ctx.default_context.cookie_jar.set_cookies_from_cdp(parsed);
|
||||
cookie_jar_for(ctx, params, session_id)?.set_cookies_from_cdp(parsed);
|
||||
}
|
||||
Ok(json!({}))
|
||||
}
|
||||
"deleteCookies" => {
|
||||
if let Some(filter) = parse_delete_cookies_params(params) {
|
||||
ctx.default_context.cookie_jar.delete_cookies_filtered(
|
||||
cookie_jar_for(ctx, params, session_id)?.delete_cookies_filtered(
|
||||
&filter.name,
|
||||
&filter.domain,
|
||||
filter.path.as_deref(),
|
||||
|
||||
Reference in new issue
Block a user