@@ -226,6 +226,39 @@ impl Dispatcher {
226
226
Ok ( ChainOutbound :: new ( chain_name, res) )
227
227
}
228
228
229
+ pub async fn construct_outbound (
230
+ & self ,
231
+ src_addr : SocketAddr ,
232
+ dst_addr : & NetworkAddr ,
233
+ proxy_config : & ProxyImpl ,
234
+ proxy_name : & str ,
235
+ iface_name : & str ,
236
+ resolved_dst : Option < & SocketAddr > ,
237
+ ) -> Result < ( Box < dyn Outbound > , OutboundType ) , DispatchError > {
238
+ Ok ( match proxy_config {
239
+ ProxyImpl :: Chain ( vec) => (
240
+ Box :: new (
241
+ self . create_chain ( proxy_name, vec, src_addr, dst_addr, iface_name)
242
+ . map_err ( |_| DispatchError :: BadChain ) ?,
243
+ ) ,
244
+ OutboundType :: Chain ,
245
+ ) ,
246
+ ProxyImpl :: BlackHole => {
247
+ return Err ( DispatchError :: BlackHole ) ;
248
+ }
249
+ _ => self
250
+ . build_normal_outbound (
251
+ proxy_name,
252
+ iface_name,
253
+ proxy_config,
254
+ src_addr,
255
+ dst_addr,
256
+ resolved_dst,
257
+ )
258
+ . map_err ( |_| DispatchError :: Reject ) ?,
259
+ } )
260
+ }
261
+
229
262
pub async fn submit_tcp < S : StreamOutboundTrait > (
230
263
& self ,
231
264
inbound : InboundInfo ,
@@ -251,33 +284,28 @@ impl Dispatcher {
251
284
let iface_name = iface
252
285
. as_ref ( )
253
286
. map_or ( self . iface_name . as_str ( ) , |s| s. as_str ( ) ) ;
254
- let ( outbounding, proxy_type) : ( Box < dyn Outbound > , OutboundType ) =
255
- match proxy_config. as_ref ( ) {
256
- ProxyImpl :: Chain ( vec) => (
257
- Box :: new (
258
- self . create_chain ( & proxy_name, vec, src_addr, & dst_addr, iface_name)
259
- . map_err ( |_| DispatchError :: BadChain ) ?,
260
- ) ,
261
- OutboundType :: Chain ,
262
- ) ,
263
- ProxyImpl :: BlackHole => {
264
- tokio:: spawn ( async move {
265
- tokio:: time:: sleep ( Duration :: from_secs ( 30 ) ) . await ;
266
- drop ( stream)
267
- } ) ;
268
- return Err ( DispatchError :: BlackHole ) ;
269
- }
270
- _ => self
271
- . build_normal_outbound (
272
- & proxy_name,
273
- iface_name,
274
- proxy_config. as_ref ( ) ,
275
- src_addr,
276
- & dst_addr,
277
- conn_info. resolved_dst . as_ref ( ) ,
278
- )
279
- . map_err ( |_| DispatchError :: Reject ) ?,
280
- } ;
287
+ let ( outbounding, proxy_type) : ( Box < dyn Outbound > , OutboundType ) = match self
288
+ . construct_outbound (
289
+ src_addr,
290
+ & dst_addr,
291
+ & proxy_config,
292
+ & proxy_name,
293
+ iface_name,
294
+ conn_info. resolved_dst . as_ref ( ) ,
295
+ )
296
+ . await
297
+ {
298
+ Ok ( r) => r,
299
+ Err ( DispatchError :: Reject ) => return Err ( DispatchError :: Reject ) ,
300
+ Err ( DispatchError :: BlackHole ) => {
301
+ tokio:: spawn ( async move {
302
+ tokio:: time:: sleep ( Duration :: from_secs ( 30 ) ) . await ;
303
+ drop ( stream)
304
+ } ) ;
305
+ return Err ( DispatchError :: BlackHole ) ;
306
+ }
307
+ Err ( e) => return Err ( e) ,
308
+ } ;
281
309
282
310
// conn info
283
311
let abort_handle = ConnAbortHandle :: new ( ) ;
0 commit comments