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
18 changes: 9 additions & 9 deletions lib/wreq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module Wreq
# @param method [Wreq::Method] HTTP method to use
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -56,7 +56,7 @@ def self.request(method, url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -87,7 +87,7 @@ def self.get(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -118,7 +118,7 @@ def self.head(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -149,7 +149,7 @@ def self.post(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -180,7 +180,7 @@ def self.put(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -211,7 +211,7 @@ def self.delete(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -242,7 +242,7 @@ def self.options(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -273,7 +273,7 @@ def self.trace(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down
20 changes: 11 additions & 9 deletions lib/wreq_ruby/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class Client
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Default headers to include
# in every request. Header names are case-insensitive. These headers
# can be overridden on a per-request basis.
# @param orig_headers [Array<String>, nil] Original header names used to
# preserve raw header order and HTTP/1 case-sensitive header handling.
#
# @param referer [Boolean, nil] Whether to automatically send Referer
# headers when following redirects. When true, the previous URL will
Expand Down Expand Up @@ -237,7 +239,7 @@ def self.new(**options)
# @param method [Wreq::Method] HTTP method to use
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -268,7 +270,7 @@ def request(method, url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -299,7 +301,7 @@ def get(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -330,7 +332,7 @@ def head(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -361,7 +363,7 @@ def post(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -392,7 +394,7 @@ def put(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -423,7 +425,7 @@ def delete(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -454,7 +456,7 @@ def options(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down Expand Up @@ -485,7 +487,7 @@ def trace(url, **options)
#
# @param url [String] Target URL
# @param headers [Wreq::Headers, Hash{String=>String}, nil] Custom headers for this request
# @param orig_headers [Hash{String=>String}, nil] Original headers (raw, unmodified)
# @param orig_headers [Array<String>, nil] Original header names used to preserve raw header order and HTTP/1 case-sensitive header handling
# @param default_headers [Hash{String=>String}, nil] Default headers to merge
# @param query [Hash, nil] URL query parameters
# @param auth [String, nil] Authorization header value
Expand Down
23 changes: 14 additions & 9 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ use magnus::{
Module, Object, RHash, RModule, Ruby, TryConvert, Value, function, method, typed_data::Obj,
};
use serde::Deserialize;
use wreq::{
Proxy,
header::{HeaderValue, OrigHeaderMap},
};
use wreq::{Proxy, header::HeaderValue};

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

Expand All @@ -40,7 +37,7 @@ struct Builder {
headers: Option<Headers>,
/// The original headers to use for the client.
#[serde(skip)]
orig_headers: Option<OrigHeaderMap>,
orig_headers: Option<OrigHeaders>,
/// Whether to use referer.
referer: Option<bool>,
/// Whether to allow redirects.
Expand Down Expand Up @@ -143,6 +140,10 @@ impl Builder {
builder.headers = Some(Headers::try_convert(v)?);
}

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

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

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

Ok(builder)
Expand All @@ -175,14 +175,19 @@ impl Client {
// User agent options.
apply_option!(set_if_some, builder, params.user_agent, user_agent);

// Default headers options.
// Headers options.
apply_option!(
set_if_some_into_inner,
builder,
params.headers,
default_headers
);
apply_option!(set_if_some, builder, params.orig_headers, orig_headers);
apply_option!(
set_if_some_inner,
builder,
params.orig_headers,
orig_headers
);

// Allow redirects options.
apply_option!(set_if_some, builder, params.referer, referer);
Expand Down
18 changes: 13 additions & 5 deletions src/client/req.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::{net::IpAddr, time::Duration};
use http::header;
use magnus::{RHash, TryConvert, typed_data::Obj, value::ReprValue};
use serde::Deserialize;
use wreq::{Client, Proxy, header::OrigHeaderMap};
use wreq::{Client, Proxy};

use super::body::{Body, Form, Json};
use crate::{
Expand All @@ -12,7 +12,7 @@ use crate::{
emulate::Emulation,
error::wreq_error_to_magnus,
extractor::Extractor,
header::Headers,
header::{Headers, OrigHeaders},
http::{Method, Version},
rt,
};
Expand Down Expand Up @@ -54,7 +54,7 @@ pub struct Request {

/// The original headers to use for the request.
#[serde(skip)]
orig_headers: Option<OrigHeaderMap>,
orig_headers: Option<OrigHeaders>,

/// The cookies to use for the request.
#[serde(skip)]
Expand Down Expand Up @@ -120,6 +120,10 @@ impl Request {
builder.headers = Some(Headers::try_convert(v)?);
}

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

if let Some(v) = hash.get(ruby.to_symbol(stringify!(cookies))) {
builder.cookies = Some(Cookies::try_convert(v)?);
}
Expand All @@ -129,7 +133,6 @@ impl Request {
}

builder.proxy = Extractor::<Proxy>::try_convert(keyword)?.into_inner();
builder.orig_headers = Extractor::<OrigHeaderMap>::try_convert(keyword)?.into_inner();

Ok(builder)
}
Expand Down Expand Up @@ -179,7 +182,12 @@ pub fn execute_request<U: AsRef<str>>(

// Headers options.
apply_option!(set_if_some_into_inner, builder, request.headers, headers);
apply_option!(set_if_some, builder, request.orig_headers, orig_headers);
apply_option!(
set_if_some_inner,
builder,
request.orig_headers,
orig_headers
);
apply_option!(
set_if_some,
builder,
Expand Down
8 changes: 8 additions & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ pub fn header_value_error_to_magnus(err: wreq::header::InvalidHeaderValue) -> Ma
)
}

/// Map type/value errors to corresponding [`magnus::Error`]
pub fn type_value_error_to_magnus(err: &str) -> MagnusError {
MagnusError::new(
ruby!().get_inner(&BUILDER_ERROR),
format!("type error: {err}"),
)
}

/// Map [`wreq::Error`] to corresponding [`magnus::Error`]
pub fn wreq_error_to_magnus(err: wreq::Error) -> MagnusError {
let error_msg = err.to_string();
Expand Down
23 changes: 1 addition & 22 deletions src/extractor.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use magnus::{RArray, RHash, RString, Ruby, TryConvert, r_hash::ForEach};
use wreq::{
Proxy, Version,
Proxy,
header::{HeaderMap, HeaderName, HeaderValue, OrigHeaderMap},
};

Expand Down Expand Up @@ -32,27 +32,6 @@ where
}
}

// ===== impl Extractor<Version> =====

impl ExtractorName for Version {
const NAME: &str = "version";
}

impl TryConvert for Extractor<Version> {
fn try_convert(value: magnus::Value) -> Result<Self, magnus::Error> {
let keyword = RHash::try_convert(value)?;
if let Some(version_val) = keyword.get(Version::NAME) {
return <&crate::http::Version>::try_convert(version_val)
.cloned()
.map(crate::http::Version::into_ffi)
.map(Some)
.map(Extractor);
}

Ok(Extractor(None))
}
}

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

impl ExtractorName for HeaderValue {
Expand Down
25 changes: 24 additions & 1 deletion src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ use magnus::{
r_hash::ForEach,
typed_data::{Inspect, Obj},
};
use wreq::header::OrigHeaderMap;

use crate::error::{header_name_error_to_magnus, header_value_error_to_magnus};
use crate::error::{
header_name_error_to_magnus, header_value_error_to_magnus, type_value_error_to_magnus,
};

/// HTTP headers collection with read and write operations.
///
Expand All @@ -20,6 +23,9 @@ use crate::error::{header_name_error_to_magnus, header_value_error_to_magnus};
#[magnus::wrap(class = "Wreq::Headers", free_immediately, size)]
pub struct Headers(pub RefCell<HeaderMap>);

/// A map from header names to their original casing as received in an HTTP message.
pub struct OrigHeaders(pub OrigHeaderMap);

struct HeaderIter {
inner: http::header::IntoIter<HeaderValue>,
next_name: Option<HeaderName>,
Expand Down Expand Up @@ -166,6 +172,23 @@ impl TryConvert for Headers {
}
}

// ===== impl OrigHeaders =====

impl TryConvert for OrigHeaders {
fn try_convert(value: magnus::Value) -> Result<Self, magnus::Error> {
let mut map = OrigHeaderMap::new();

let rarray = RArray::from_value(value)
.ok_or_else(|| type_value_error_to_magnus("Expected an array of strings"))?;

for value in rarray.into_iter().flat_map(RString::from_value) {
map.insert(value.to_bytes());
}

Comment on lines +181 to +187
Ok(Self(map))
}
}

// ===== impl HeaderIter =====

impl Iterator for HeaderIter {
Expand Down
Loading