Skip to content

Commit 7c7b3e6

Browse files
committed
Support more options
1 parent 844ffe4 commit 7c7b3e6

2 files changed

Lines changed: 76 additions & 1 deletion

File tree

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,16 @@ client = Wreq::Client.new(
8484
],
8585
headers: { # default headers for all requests
8686
"Accept" => "application/json"
87-
}
87+
},
88+
referer: true, # auto-set Referer header on redirects (default: true)
89+
pool_max_idle_per_host: 10, # max idle connections per host
90+
pool_max_size: 100, # max total connections in the pool
91+
tcp_nodelay: true, # disable Nagle algorithm (default: true)
92+
tcp_keepalive: 15, # SO_KEEPALIVE interval in seconds (default: 15)
93+
local_address: "1.2.3.4", # bind outgoing connections to this source IP
94+
tls_sni: true, # send SNI in TLS handshake (default: true)
95+
min_tls_version: "tls1.2", # minimum TLS version: tls1.0, tls1.1, tls1.2, tls1.3
96+
max_tls_version: "tls1.3", # maximum TLS version
8897
)
8998

9099
resp = client.get("https://api.example.com/data")

ext/wreq_rb/src/client.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use magnus::{
1010
};
1111
use tokio::runtime::Runtime;
1212
use tokio_util::sync::CancellationToken;
13+
use std::net::IpAddr;
1314
use wreq::header::{HeaderMap, HeaderName, HeaderValue, OrigHeaderMap};
15+
use wreq::tls::TlsVersion;
1416
use wreq_util::{Emulation as BrowserEmulation, EmulationOS, EmulationOption};
1517

1618
use crate::error::{generic_error, to_magnus_error};
@@ -299,6 +301,44 @@ impl Client {
299301
if let Some(v) = hash_get_bool(&opts, "zstd")? {
300302
builder = builder.zstd(v);
301303
}
304+
305+
if let Some(v) = hash_get_bool(&opts, "referer")? {
306+
builder = builder.referer(v);
307+
}
308+
309+
if let Some(n) = hash_get_usize(&opts, "pool_max_idle_per_host")? {
310+
builder = builder.pool_max_idle_per_host(n);
311+
}
312+
313+
if let Some(n) = hash_get_u32(&opts, "pool_max_size")? {
314+
builder = builder.pool_max_size(n);
315+
}
316+
317+
if let Some(v) = hash_get_bool(&opts, "tcp_nodelay")? {
318+
builder = builder.tcp_nodelay(v);
319+
}
320+
321+
if let Some(t) = hash_get_float(&opts, "tcp_keepalive")? {
322+
builder = builder.tcp_keepalive(Duration::from_secs_f64(t));
323+
}
324+
325+
if let Some(addr_str) = hash_get_string(&opts, "local_address")? {
326+
let addr: IpAddr = addr_str.parse()
327+
.map_err(|_| generic_error(format!("invalid IP address: '{}'", addr_str)))?;
328+
builder = builder.local_address(addr);
329+
}
330+
331+
if let Some(v) = hash_get_bool(&opts, "tls_sni")? {
332+
builder = builder.tls_sni(v);
333+
}
334+
335+
if let Some(s) = hash_get_string(&opts, "min_tls_version")? {
336+
builder = builder.min_tls_version(parse_tls_version(&s)?);
337+
}
338+
339+
if let Some(s) = hash_get_string(&opts, "max_tls_version")? {
340+
builder = builder.max_tls_version(parse_tls_version(&s)?);
341+
}
302342
} else {
303343
builder = builder.emulation(DEFAULT_EMULATION);
304344
}
@@ -535,6 +575,32 @@ fn hash_get_bool(hash: &RHash, key: &str) -> Result<Option<bool>, magnus::Error>
535575
}
536576
}
537577

578+
fn hash_get_usize(hash: &RHash, key: &str) -> Result<Option<usize>, magnus::Error> {
579+
match hash_get_value(hash, key)? {
580+
Some(v) => Ok(Some(TryConvert::try_convert(v)?)),
581+
None => Ok(None),
582+
}
583+
}
584+
585+
fn hash_get_u32(hash: &RHash, key: &str) -> Result<Option<u32>, magnus::Error> {
586+
match hash_get_value(hash, key)? {
587+
Some(v) => Ok(Some(TryConvert::try_convert(v)?)),
588+
None => Ok(None),
589+
}
590+
}
591+
592+
fn parse_tls_version(s: &str) -> Result<TlsVersion, magnus::Error> {
593+
match s {
594+
"tls1.0" | "tls_1_0" | "1.0" => Ok(TlsVersion::TLS_1_0),
595+
"tls1.1" | "tls_1_1" | "1.1" => Ok(TlsVersion::TLS_1_1),
596+
"tls1.2" | "tls_1_2" | "1.2" => Ok(TlsVersion::TLS_1_2),
597+
"tls1.3" | "tls_1_3" | "1.3" => Ok(TlsVersion::TLS_1_3),
598+
_ => Err(generic_error(format!(
599+
"unknown TLS version '{}'. Use: 'tls1.2', 'tls1.3'", s
600+
))),
601+
}
602+
}
603+
538604
fn hash_get_hash(hash: &RHash, key: &str) -> Result<Option<RHash>, magnus::Error> {
539605
match hash_get_value(hash, key)? {
540606
Some(v) => Ok(Some(RHash::try_convert(v)?)),

0 commit comments

Comments
 (0)