1
1
#![ cfg( feature = "reqwest-backend" ) ]
2
2
3
3
use std:: env:: { remove_var, set_var} ;
4
+ use std:: error:: Error ;
5
+ use std:: net:: TcpListener ;
6
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
7
+ use std:: thread;
8
+ use std:: time:: Duration ;
4
9
5
10
use env_proxy:: for_url;
11
+ use reqwest:: { blocking:: Client , Proxy } ;
6
12
use url:: Url ;
7
13
8
14
fn scrub_env ( ) {
@@ -28,3 +34,38 @@ fn read_basic_proxy_params() {
28
34
Some ( ( "proxy.example.com" . to_string( ) , 8080 ) )
29
35
) ;
30
36
}
37
+
38
+ // Tests to verify if socks feature is available and being used
39
+ #[ test]
40
+ fn socks_proxy_request ( ) {
41
+ static CALL_COUNT : AtomicUsize = AtomicUsize :: new ( 0 ) ;
42
+
43
+ scrub_env ( ) ;
44
+ set_var ( "all_proxy" , "socks5://127.0.0.1:1080" ) ;
45
+
46
+ thread:: spawn ( move || {
47
+ let listener = TcpListener :: bind ( "127.0.0.1:1080" ) . unwrap ( ) ;
48
+ let incoming = listener. incoming ( ) ;
49
+ for _ in incoming {
50
+ CALL_COUNT . fetch_add ( 1 , Ordering :: SeqCst ) ;
51
+ }
52
+ } ) ;
53
+
54
+ let env_proxy = |url : & Url | for_url ( & url) . to_url ( ) ;
55
+ let url = Url :: parse ( "http://example.org" ) . unwrap ( ) ;
56
+
57
+ let client = Client :: builder ( )
58
+ . proxy ( Proxy :: custom ( env_proxy) )
59
+ . timeout ( Duration :: from_secs ( 1 ) )
60
+ . build ( )
61
+ . unwrap ( ) ;
62
+ let res = client. get ( url. as_str ( ) ) . send ( ) ;
63
+
64
+ if let Err ( e) = res {
65
+ let s = e. source ( ) . unwrap ( ) ;
66
+ assert_eq ! ( CALL_COUNT . load( Ordering :: SeqCst ) , 1 ) ;
67
+ assert ! ( s. to_string( ) . contains( "socks connect error" ) ) ;
68
+ } else {
69
+ panic ! ( "Socks proxy was ignored" )
70
+ }
71
+ }
0 commit comments