@@ -4,24 +4,19 @@ use std::{process::Command, str::from_utf8};
4
4
5
5
impl Sysproxy {
6
6
pub fn get_system_proxy ( ) -> Result < Sysproxy > {
7
- let service = default_network_service ( ) ;
8
- if let Err ( e) = service {
9
- debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
10
- return Err ( e) ;
11
- }
12
- let service = service. unwrap ( ) ;
13
- let service = service. as_str ( ) ;
7
+ let services = listnetworkserviceorder ( ) ?;
8
+ let service = services. first ( ) . ok_or ( Error :: NetworkService ) ?. 0 . clone ( ) ;
14
9
15
- let mut socks = Sysproxy :: get_socks ( service) ?;
10
+ let mut socks = Sysproxy :: get_socks ( & service) ?;
16
11
debug ! ( "Getting SOCKS proxy: {:?}" , socks) ;
17
12
18
- let http = Sysproxy :: get_http ( service) ?;
13
+ let http = Sysproxy :: get_http ( & service) ?;
19
14
debug ! ( "Getting HTTP proxy: {:?}" , http) ;
20
15
21
- let https = Sysproxy :: get_https ( service) ?;
16
+ let https = Sysproxy :: get_https ( & service) ?;
22
17
debug ! ( "Getting HTTPS proxy: {:?}" , https) ;
23
18
24
- let bypass = Sysproxy :: get_bypass ( service) ?;
19
+ let bypass = Sysproxy :: get_bypass ( & service) ?;
25
20
debug ! ( "Getting bypass domains: {:?}" , bypass) ;
26
21
27
22
socks. bypass = bypass;
@@ -43,27 +38,28 @@ impl Sysproxy {
43
38
}
44
39
45
40
pub fn set_system_proxy ( & self ) -> Result < ( ) > {
46
- let service = default_network_service ( ) ;
47
- if let Err ( e) = service {
48
- debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
49
- return Err ( e) ;
50
- }
51
- let service = service. unwrap ( ) ;
52
- let service = service. as_str ( ) ;
41
+ let services = listnetworkserviceorder ( ) ?;
53
42
54
- debug ! ( "Use network service: {}" , service) ;
43
+ for service in services {
44
+ let service = service. 0 . clone ( ) ;
45
+ if service. is_empty ( ) {
46
+ continue ;
47
+ }
48
+ debug ! ( "Use network service: {}" , service) ;
55
49
56
- debug ! ( "Setting SOCKS proxy" ) ;
57
- self . set_socks ( service) ?;
50
+ debug ! ( "Setting SOCKS proxy" ) ;
51
+ self . set_socks ( & service) ?;
58
52
59
- debug ! ( "Setting HTTP proxy" ) ;
60
- self . set_https ( service) ?;
53
+ debug ! ( "Setting HTTP proxy" ) ;
54
+ self . set_https ( & service) ?;
61
55
62
- debug ! ( "Setting HTTPS proxy" ) ;
63
- self . set_http ( service) ?;
56
+ debug ! ( "Setting HTTPS proxy" ) ;
57
+ self . set_http ( & service) ?;
58
+
59
+ debug ! ( "Setting bypass domains" ) ;
60
+ self . set_bypass ( & service) ?;
61
+ }
64
62
65
- debug ! ( "Setting bypass domains" ) ;
66
- self . set_bypass ( service) ?;
67
63
Ok ( ( ) )
68
64
}
69
65
@@ -117,16 +113,11 @@ impl Sysproxy {
117
113
118
114
impl Autoproxy {
119
115
pub fn get_auto_proxy ( ) -> Result < Autoproxy > {
120
- let service = default_network_service ( ) ;
121
- if let Err ( e) = service {
122
- debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
123
- return Err ( e) ;
124
- }
125
- let service = service. unwrap ( ) ;
126
- let service = service. as_str ( ) ;
116
+ let services = listnetworkserviceorder ( ) ?;
117
+ let service = services. first ( ) . ok_or ( Error :: NetworkService ) ?. 0 . clone ( ) ;
127
118
128
119
let auto_output = networksetup ( )
129
- . args ( [ "-getautoproxyurl" , service] )
120
+ . args ( [ "-getautoproxyurl" , & service] )
130
121
. output ( ) ?;
131
122
let auto = from_utf8 ( & auto_output. stdout )
132
123
. or ( Err ( Error :: ParseStr ( "auto" . into ( ) ) ) ) ?
@@ -143,26 +134,29 @@ impl Autoproxy {
143
134
}
144
135
145
136
pub fn set_auto_proxy ( & self ) -> Result < ( ) > {
146
- let service = default_network_service ( ) ;
147
- if let Err ( e) = service {
148
- debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
149
- return Err ( e) ;
150
- }
151
- let service = service. unwrap ( ) ;
152
- let service = service. as_str ( ) ;
137
+ let services = listnetworkserviceorder ( ) ?;
153
138
154
139
let enable = if self . enable { "on" } else { "off" } ;
155
140
let url = if self . url . is_empty ( ) {
156
141
"\" \" "
157
142
} else {
158
143
& self . url
159
144
} ;
160
- networksetup ( )
161
- . args ( [ "-setautoproxyurl" , service, url] )
162
- . status ( ) ?;
163
- networksetup ( )
164
- . args ( [ "-setautoproxystate" , service, enable] )
165
- . status ( ) ?;
145
+
146
+ for service in services {
147
+ let service = service. 0 . clone ( ) ;
148
+ if service. is_empty ( ) {
149
+ continue ;
150
+ }
151
+ debug ! ( "Use network service: {}" , service) ;
152
+
153
+ networksetup ( )
154
+ . args ( [ "-setautoproxyurl" , & service, url] )
155
+ . status ( ) ?;
156
+ networksetup ( )
157
+ . args ( [ "-setautoproxystate" , & service, enable] )
158
+ . status ( ) ?;
159
+ }
166
160
167
161
Ok ( ( ) )
168
162
}
@@ -257,41 +251,6 @@ fn strip_str<'a>(text: &'a str) -> &'a str {
257
251
. unwrap_or ( text)
258
252
}
259
253
260
- fn default_network_service ( ) -> Result < String > {
261
- let output = Command :: new ( "route" )
262
- . args ( [ "-n" , "get" , "default" ] )
263
- . output ( ) ?;
264
- let stdout = from_utf8 ( & output. stdout ) . or ( Err ( Error :: ParseStr ( "output" . into ( ) ) ) ) ?;
265
- let device = stdout. split ( "\n " ) . find_map ( |s| {
266
- let line = s. trim ( ) ;
267
- if line. starts_with ( "interface:" ) {
268
- Some ( line. replace ( "interface: " , "" ) )
269
- } else {
270
- None
271
- }
272
- } ) ;
273
-
274
- match device {
275
- Some ( device) => {
276
- let service = get_server_by_order ( device) ?;
277
- Ok ( service)
278
- }
279
- None => Err ( Error :: NetworkInterface ) ,
280
- }
281
- }
282
-
283
- fn get_server_by_order ( device : String ) -> Result < String > {
284
- let services = listnetworkserviceorder ( ) ?;
285
- let service = services
286
- . into_iter ( )
287
- . find ( |( _, _, d) | d == & device)
288
- . map ( |( s, _, _) | s) ;
289
- match service {
290
- Some ( service) => Ok ( service) ,
291
- None => Err ( Error :: NetworkInterface ) ,
292
- }
293
- }
294
-
295
254
fn listnetworkserviceorder ( ) -> Result < Vec < ( String , String , String ) > > {
296
255
let output = networksetup ( ) . arg ( "-listnetworkserviceorder" ) . output ( ) ?;
297
256
let stdout = from_utf8 ( & output. stdout ) . or ( Err ( Error :: ParseStr ( "output" . into ( ) ) ) ) ?;
0 commit comments