Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::{
error::{wrap_invali_header_name_error, wrap_rquest_error},
param::{ClientParams, RequestParams},
resp::Response,
types::{Impersonate, Method, Version},
types::Method,
Result,
};
use pyo3::prelude::*;
Expand Down Expand Up @@ -80,13 +80,16 @@ impl Client {
let mut builder = rquest::Client::builder();

// Impersonation options.
apply_option!(
apply_transformed_option,
builder,
params.impersonate,
impersonate,
|v: Impersonate| v.into_inner()
);
if let Some(impersonate) = params.impersonate.take() {
builder = builder.impersonate(
rquest::Impersonate::builder()
.impersonate(impersonate.into())
.impersonate_os(params.impersonate_os.unwrap_or_default().into())
.skip_http2(params.impersonate_skip_http2.unwrap_or(false))
.skip_headers(params.impersonate_skip_headers.unwrap_or(false))
.build(),
);
}

// User agent options.
apply_option!(apply_if_some, builder, params.user_agent, user_agent);
Expand Down Expand Up @@ -213,7 +216,7 @@ impl Client {
// Network options.
if let Some(proxies) = params.proxies.take() {
for proxy in proxies {
builder = builder.proxy(proxy.into_inner());
builder = builder.proxy(proxy.into());
}
}
apply_option!(
Expand Down Expand Up @@ -588,15 +591,15 @@ async fn execute_request(
mut params: Option<RequestParams>,
) -> Result<Response> {
let params = params.get_or_insert_default();
let mut builder = client.request(method.into_inner(), url);
let mut builder = client.request(method.into(), url);

// Version options.
apply_option!(
apply_transformed_option,
builder,
params.version,
version,
|v: Version| v.into_inner()
Into::into
);

// Allow redirects options.
Expand Down
5 changes: 4 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ use param::{ClientParams, RequestParams};
use pyo3::prelude::*;
use pyo3_stub_gen::{define_stub_info_gatherer, derive::*};
use resp::{Response, Streamer};
use types::{HeaderMap, Impersonate, Method, Proxy, SocketAddr, StatusCode, Version};
use types::{
HeaderMap, Impersonate, ImpersonateOS, Method, Proxy, SocketAddr, StatusCode, Version,
};

type Result<T> = std::result::Result<T, PyErr>;

Expand Down Expand Up @@ -247,6 +249,7 @@ fn rnet(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<Version>()?;
m.add_class::<HeaderMap>()?;
m.add_class::<Impersonate>()?;
m.add_class::<ImpersonateOS>()?;
m.add_class::<SocketAddr>()?;
m.add_class::<Proxy>()?;
m.add_class::<ClientParams>()?;
Expand Down
17 changes: 16 additions & 1 deletion src/param/client.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::types::{Impersonate, Proxy};
use crate::types::{Impersonate, ImpersonateOS, Proxy};
use indexmap::IndexMap;
use pyo3::prelude::*;
use pyo3_stub_gen::derive::gen_stub_pyclass;
Expand Down Expand Up @@ -38,6 +38,18 @@ pub struct ClientParams {
#[pyo3(get)]
pub impersonate: Option<Impersonate>,

/// The impersonation settings for the operating system.
#[pyo3(get)]
pub impersonate_os: Option<ImpersonateOS>,

/// Whether to skip impersonate HTTP/2.
#[pyo3(get)]
pub impersonate_skip_http2: Option<bool>,

/// Whether to skip impersonate headers.
#[pyo3(get)]
pub impersonate_skip_headers: Option<bool>,

/// The user agent to use for the request.
#[pyo3(get)]
pub user_agent: Option<String>,
Expand Down Expand Up @@ -167,6 +179,9 @@ impl<'py> FromPyObject<'py> for ClientParams {
fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult<Self> {
let mut params = Self::default();
extract_option!(ob, params, impersonate);
extract_option!(ob, params, impersonate_os);
extract_option!(ob, params, impersonate_skip_http2);
extract_option!(ob, params, impersonate_skip_headers);
extract_option!(ob, params, user_agent);
extract_option!(ob, params, default_headers);
extract_option!(ob, params, headers_order);
Expand Down
41 changes: 38 additions & 3 deletions src/types/impersonate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,20 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods};
#[derive(Clone, Copy, Default, Debug)]
pub struct Impersonate(rquest::Impersonate);

impl Impersonate {
pub fn into_inner(self) -> rquest::Impersonate {
self.0
#[gen_stub_pyclass]
#[pyclass]
#[derive(Clone, Copy, Default, Debug)]
pub struct ImpersonateOS(rquest::ImpersonateOS);

impl From<Impersonate> for rquest::Impersonate {
fn from(impersonate: Impersonate) -> rquest::Impersonate {
impersonate.0
}
}

impl From<ImpersonateOS> for rquest::ImpersonateOS {
fn from(impersonate: ImpersonateOS) -> rquest::ImpersonateOS {
impersonate.0
}
}

Expand All @@ -28,6 +39,20 @@ impl Impersonate {
}
}

#[gen_stub_pymethods]
#[pymethods]
impl ImpersonateOS {
/// Returns a string representation of the impersonate.
fn __str__(&self) -> String {
format!("{:?}", self.0)
}

/// Returns a string representation of the impersonate.
fn __repr__(&self) -> String {
self.__str__()
}
}

define_constants!(
Impersonate,
rquest::Impersonate,
Expand Down Expand Up @@ -85,3 +110,13 @@ define_constants!(
OkHttp4_10,
OkHttp5
);

define_constants!(
ImpersonateOS,
rquest::ImpersonateOS,
Windows,
MacOS,
Linux,
Android,
IOS
);
6 changes: 3 additions & 3 deletions src/types/method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods};
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Method(rquest::Method);

impl Method {
pub fn into_inner(self) -> rquest::Method {
self.0
impl From<Method> for rquest::Method {
fn from(method: Method) -> rquest::Method {
method.0
}
}

Expand Down
10 changes: 8 additions & 2 deletions src/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,14 @@ mod status_code;
mod version;

pub use self::{
headers::HeaderMap, impersonate::Impersonate, ipaddr::SocketAddr, json::Json, method::Method,
proxy::Proxy, status_code::StatusCode, version::Version,
headers::HeaderMap,
impersonate::{Impersonate, ImpersonateOS},
ipaddr::SocketAddr,
json::Json,
method::Method,
proxy::Proxy,
status_code::StatusCode,
version::Version,
};

#[macro_export]
Expand Down
6 changes: 3 additions & 3 deletions src/types/proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods};
#[derive(Clone, Debug)]
pub struct Proxy(rquest::Proxy);

impl Proxy {
pub fn into_inner(self) -> rquest::Proxy {
self.0
impl From<Proxy> for rquest::Proxy {
fn from(proxy: Proxy) -> rquest::Proxy {
proxy.0
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/types/version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods};
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct Version(rquest::Version);

impl Version {
pub fn into_inner(self) -> rquest::Version {
self.0
impl From<Version> for rquest::Version {
fn from(version: Version) -> rquest::Version {
version.0
}
}

Expand Down