@@ -10,7 +10,9 @@ use magnus::{
1010} ;
1111use tokio:: runtime:: Runtime ;
1212use tokio_util:: sync:: CancellationToken ;
13+ use std:: net:: IpAddr ;
1314use wreq:: header:: { HeaderMap , HeaderName , HeaderValue , OrigHeaderMap } ;
15+ use wreq:: tls:: TlsVersion ;
1416use wreq_util:: { Emulation as BrowserEmulation , EmulationOS , EmulationOption } ;
1517
1618use 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+
538604fn 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