use tracing::debug;
use crate::api::{APIContextOptions, APIRequestContext};
use crate::error::ContextError;
use super::BrowserContext;
impl BrowserContext {
pub async fn request(&self) -> Result<APIRequestContext, ContextError> {
if self.is_closed() {
return Err(ContextError::Closed);
}
debug!("Creating API request context for browser context");
let mut options = APIContextOptions::new();
if !self.options.extra_http_headers.is_empty() {
options = options.extra_http_headers(
self.options
.extra_http_headers
.iter()
.map(|(k, v)| (k.clone(), v.clone())),
);
}
if let Some(ref creds) = self.options.http_credentials {
options = options.http_credentials(crate::api::HttpCredentials::new(
&creds.username,
&creds.password,
));
}
let api = APIRequestContext::new(options)
.await
.map_err(|e| ContextError::Internal(e.to_string()))?;
let browser_cookies = self.cookies().await?;
crate::api::cookies::sync_to_jar(&browser_cookies, api.cookie_jar());
debug!(
"Synced {} browser cookies to API context",
browser_cookies.len()
);
Ok(api)
}
pub async fn sync_cookies_from_api(
&self,
api: &APIRequestContext,
url: &str,
) -> Result<(), ContextError> {
if self.is_closed() {
return Err(ContextError::Closed);
}
let cookies = crate::api::cookies::extract_from_jar(api.cookie_jar(), url);
if !cookies.is_empty() {
debug!("Syncing {} cookies from API to browser", cookies.len());
self.add_cookies(cookies).await?;
}
Ok(())
}
}