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
13 changes: 8 additions & 5 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use magnus::{
Module, Object, RHash, RModule, Ruby, TryConvert, Value, function, method, typed_data::Obj,
};
use serde::Deserialize;
use wreq::{Proxy, header::HeaderValue};
use wreq::Proxy;

use crate::{
client::{req::execute_request, resp::Response},
Expand All @@ -19,7 +19,7 @@ use crate::{
error::wreq_error_to_magnus,
extractor::Extractor,
gvl,
header::{Headers, OrigHeaders},
header::{Headers, OrigHeaders, UserAgent},
http::Method,
};

Expand All @@ -31,7 +31,7 @@ struct Builder {
emulation: Option<Emulation>,
/// The user agent to use for the client.
#[serde(skip)]
user_agent: Option<HeaderValue>,
user_agent: Option<UserAgent>,
/// The headers to use for the client.
#[serde(skip)]
headers: Option<Headers>,
Expand Down Expand Up @@ -136,6 +136,10 @@ impl Builder {
builder.emulation = Some((*Obj::<Emulation>::try_convert(v)?).clone());
}

if let Some(v) = hash.get(ruby.to_symbol(stringify!(user_agent))) {
builder.user_agent = Some(UserAgent::try_convert(v)?);
}

if let Some(v) = hash.get(ruby.to_symbol(stringify!(headers))) {
builder.headers = Some(Headers::try_convert(v)?);
}
Expand All @@ -148,7 +152,6 @@ impl Builder {
builder.cookie_provider = Some((*Obj::<Jar>::try_convert(v)?).clone());
}

builder.user_agent = Extractor::<HeaderValue>::try_convert(*keyword)?.into_inner();
builder.proxy = Extractor::<Proxy>::try_convert(*keyword)?.into_inner();

Ok(builder)
Expand All @@ -169,7 +172,7 @@ impl Client {
apply_option!(set_if_some_inner, builder, params.emulation, emulation);

// User agent options.
apply_option!(set_if_some, builder, params.user_agent, user_agent);
apply_option!(set_if_some_inner, builder, params.user_agent, user_agent);

// Headers options.
apply_option!(
Expand Down
25 changes: 0 additions & 25 deletions src/extractor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,31 +32,6 @@ where
}
}

// ===== impl Extractor<HeaderValue> =====

impl ExtractorName for HeaderValue {
const NAME: &str = "user_agent";
}

impl TryConvert for Extractor<HeaderValue> {
fn try_convert(value: magnus::Value) -> Result<Self, magnus::Error> {
let ruby = Ruby::get_with(value);
let keyword = RHash::try_convert(value)?;

if let Some(ruby_value) = keyword
.get(ruby.to_symbol(HeaderValue::NAME))
.and_then(RString::from_value)
{
return HeaderValue::from_maybe_shared(ruby_value.to_bytes())
.map(Some)
.map(Extractor)
.map_err(header_value_error_to_magnus);
}

Ok(Extractor(None))
}
}

// ===== impl Extractor<HeaderMap> =====

impl ExtractorName for HeaderMap {
Expand Down
14 changes: 14 additions & 0 deletions src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ use crate::error::{
header_name_error_to_magnus, header_value_error_to_magnus, type_value_error_to_magnus,
};

/// A wrapper for the User-Agent header value.
pub struct UserAgent(pub HeaderValue);

/// HTTP headers collection with read and write operations.
///
/// This class wraps HTTP headers and provides convenient methods for
Expand All @@ -31,6 +34,17 @@ struct HeaderIter {
next_name: Option<HeaderName>,
}

// ===== impl UserAgent =====

impl TryConvert for UserAgent {
fn try_convert(value: Value) -> Result<Self, Error> {
let s = RString::try_convert(value)?;
let header_value =
HeaderValue::from_maybe_shared(s.to_bytes()).map_err(header_value_error_to_magnus)?;
Ok(Self(header_value))
}
}

// ===== impl Headers =====

impl Headers {
Expand Down