use serde::{Deserialize, Serialize};
use crate::cdp::Cdp;
use crate::cdp::command::{CdpCommand, CdpEvent, Empty};
use crate::cdp::domains::network::{ErrorReason, ResourceType};
use crate::cdp::ids::FetchRequestId;
use crate::common::protocol::string_enum;
use crate::error::WebDriverResult;
string_enum! {
pub enum RequestStage {
Request = "Request",
Response = "Response",
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestPattern {
#[serde(skip_serializing_if = "Option::is_none")]
pub url_pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_type: Option<ResourceType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_stage: Option<RequestStage>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Enable {
#[serde(skip_serializing_if = "Option::is_none")]
pub patterns: Option<Vec<RequestPattern>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub handle_auth_requests: Option<bool>,
}
impl CdpCommand for Enable {
const METHOD: &'static str = "Fetch.enable";
type Returns = Empty;
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct Disable;
impl CdpCommand for Disable {
const METHOD: &'static str = "Fetch.disable";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeaderEntry {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ContinueRequest {
pub request_id: FetchRequestId,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<Vec<HeaderEntry>>,
}
impl CdpCommand for ContinueRequest {
const METHOD: &'static str = "Fetch.continueRequest";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FulfillRequest {
pub request_id: FetchRequestId,
pub response_code: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_headers: Option<Vec<HeaderEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_phrase: Option<String>,
}
impl CdpCommand for FulfillRequest {
const METHOD: &'static str = "Fetch.fulfillRequest";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FailRequest {
pub request_id: FetchRequestId,
pub error_reason: ErrorReason,
}
impl CdpCommand for FailRequest {
const METHOD: &'static str = "Fetch.failRequest";
type Returns = Empty;
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestPaused {
pub request_id: FetchRequestId,
pub request: serde_json::Value,
pub frame_id: String,
pub resource_type: ResourceType,
pub response_error_reason: Option<ErrorReason>,
pub response_status_code: Option<u32>,
pub response_status_text: Option<String>,
pub response_headers: Option<Vec<HeaderEntry>>,
}
impl CdpEvent for RequestPaused {
const METHOD: &'static str = "Fetch.requestPaused";
}
#[derive(Debug)]
pub struct FetchDomain<'a> {
cdp: &'a Cdp,
}
impl<'a> FetchDomain<'a> {
pub(crate) fn new(cdp: &'a Cdp) -> Self {
Self {
cdp,
}
}
pub async fn enable(&self) -> WebDriverResult<()> {
self.cdp.send(Enable::default()).await?;
Ok(())
}
pub async fn disable(&self) -> WebDriverResult<()> {
self.cdp.send(Disable).await?;
Ok(())
}
pub async fn continue_request(&self, request_id: FetchRequestId) -> WebDriverResult<()> {
self.cdp
.send(ContinueRequest {
request_id,
url: None,
method: None,
post_data: None,
headers: None,
})
.await?;
Ok(())
}
pub async fn fail_request(
&self,
request_id: FetchRequestId,
error_reason: ErrorReason,
) -> WebDriverResult<()> {
self.cdp
.send(FailRequest {
request_id,
error_reason,
})
.await?;
Ok(())
}
}