use std::sync::Arc;
use nyquest_interface::client::ClientOptions;
use crate::error::Result;
use crate::handle::SessionHandle;
pub(crate) struct WinHttpSession {
pub(crate) session: SessionHandle,
pub(crate) options: ClientOptions,
pub(crate) base_cwurl: Option<Vec<u16>>,
}
impl WinHttpSession {
pub(crate) fn new(options: ClientOptions, is_async: bool) -> Result<Arc<Self>> {
let session = SessionHandle::new(
options.user_agent.as_deref(),
is_async,
options.use_default_proxy,
)?;
Self::configure_session(&session, &options)?;
let base_cwurl = options
.base_url
.as_deref()
.map(|url| url.encode_utf16().chain(std::iter::once(0)).collect());
Ok(Arc::new(Self {
session,
options,
base_cwurl,
}))
}
fn configure_session(session: &SessionHandle, options: &ClientOptions) -> Result<()> {
if let Some(timeout) = options.request_timeout {
let timeout_ms = timeout.as_millis() as i32;
session.set_timeouts(timeout_ms, timeout_ms, timeout_ms, timeout_ms)?;
session.set_receive_response_timeout(timeout_ms as u32)?;
}
if options.follow_redirects {
session.enable_redirects()?;
} else {
session.disable_redirects()?;
}
Ok(())
}
}