@@ -212,22 +212,22 @@ func myURLTest(pingURL string, index int) uint16 {
212
212
}
213
213
ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
214
214
defer cancel ()
215
- delay , meanDelay , err := proxy .URLTest (ctx , pingURL )
215
+ delay , err := proxy .URLTest (ctx , pingURL , nil , 0 )
216
216
if ctx .Err () != nil {
217
217
return 0
218
218
}
219
219
220
220
if err != nil || delay == 0 {
221
221
fmt .Printf ("error: %s \n " , err .Error ())
222
- return meanDelay
222
+ return delay
223
223
}
224
- return meanDelay
224
+ return delay
225
225
}
226
226
227
227
func startclashMixed2 (rawaddr string , index int ) {
228
228
addr := rawaddr
229
229
tcpQueue := make (chan constant.ConnContext , 256 )
230
- udpQueue := make (chan * inbound .PacketAdapter , 32 )
230
+ udpQueue := make (chan constant .PacketAdapter , 32 )
231
231
mixedListener , mixedUDPLister := ReCreateMixed (addr , tcpQueue , udpQueue , index )
232
232
defer mixedListener .Close ()
233
233
defer mixedUDPLister .Close ()
@@ -239,7 +239,11 @@ func startclashMixed2(rawaddr string, index int) {
239
239
for i := 0 ; i < numUDPWorkers ; i ++ {
240
240
go func () {
241
241
for conn1 := range udpQueue {
242
- handleUDPConn (conn1 , index )
242
+ if conn , ok := conn1 .(* inbound.PacketAdapter ); ok {
243
+ handleUDPConn (conn , index )
244
+ } else {
245
+ fmt .Println ("Failed to convert conn1 to *inbound.PacketAdapter" )
246
+ }
243
247
}
244
248
}()
245
249
}
@@ -248,7 +252,7 @@ func startclashMixed2(rawaddr string, index int) {
248
252
go handleTCPConn (conn2 , index )
249
253
}
250
254
}
251
- func ReCreateMixed (rawaddr string , tcpIn chan <- constant.ConnContext , udpIn chan <- * inbound .PacketAdapter , index int ) (* mixed.Listener , * socks.UDPListener ) {
255
+ func ReCreateMixed (rawaddr string , tcpIn chan <- constant.ConnContext , udpIn chan <- constant .PacketAdapter , index int ) (* mixed.Listener , * socks.UDPListener ) {
252
256
addr := rawaddr
253
257
mixedMux .Lock ()
254
258
defer mixedMux .Unlock ()
@@ -286,8 +290,7 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
286
290
// make a fAddr if request ip is fakeip
287
291
var fAddr netip.Addr
288
292
if resolver .IsExistFakeIP (metadata .DstIP ) {
289
- fAddr , _ = netip .AddrFromSlice (metadata .DstIP )
290
- fAddr = fAddr .Unmap ()
293
+ fAddr = metadata .DstIP .Unmap ()
291
294
}
292
295
293
296
// local resolve UDP dns
@@ -304,7 +307,7 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
304
307
key := packet .LocalAddr ().String ()
305
308
306
309
handle := func () bool {
307
- pc := natTable .Get (key )
310
+ pc , _ := natTable .Get (key )
308
311
if pc != nil {
309
312
err := handleUDPToRemote (packet , pc , metadata )
310
313
if err != nil {
@@ -358,13 +361,12 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
358
361
return
359
362
}
360
363
pCtx .InjectPacketConn (rawPc )
361
- pc := statistic .NewUDPTracker (rawPc , statistic .DefaultManager , metadata , nil )
364
+ pc := statistic .NewUDPTracker (rawPc , statistic .DefaultManager , metadata , nil , 0 , 0 , false )
362
365
363
- oAddr , _ := netip .AddrFromSlice (metadata .DstIP )
364
- oAddr = oAddr .Unmap ()
366
+ oAddr := metadata .DstIP .Unmap ()
365
367
go handleUDPToLocal (packet .UDPPacket , pc , key , oAddr , fAddr )
366
368
367
- natTable .Set (key , pc )
369
+ natTable .Set (key , pc , nil )
368
370
handle ()
369
371
}()
370
372
}
@@ -472,133 +474,3 @@ func setProxy(tempconf *RawConfig2) {
472
474
rawcfgs [tempconf .Index ] = & RawConfig {Proxy : tempconf .Proxy }
473
475
log .Printf ("set proxy success! index: %d\n " , tempconf .Index )
474
476
}
475
-
476
- ////export urlTest
477
- //func urlTest(rawurl *C.char, index int, timeout int) (uint16, uint16, error) {
478
- // ctx := context.Background()
479
- // newurl := C.GoString(rawurl)
480
- // proxy, err := adapter.ParseProxy(rawcfgs[index].Proxy)
481
- //
482
- // if err != nil {
483
- // return 0, 0, err
484
- // }
485
- //
486
- // addr, err := urlToMetadata(newurl)
487
- // if err != nil {
488
- // return 0, 0, err
489
- // }
490
- //
491
- // instance, err := proxy.DialContext(ctx, &addr)
492
- // if err != nil {
493
- // return 0, 0, err
494
- // }
495
- // defer instance.Close()
496
- //
497
- // transport := &http.Transport{
498
- // DialContext: func(ctx context.Context, network string, addr string) (net.Conn, error) { return instance, nil },
499
- // //Dial: func(network, addr string) (net.Conn, error) { return instance, nil },
500
- // // from http.DefaultTransport
501
- // MaxIdleConns: 100,
502
- // IdleConnTimeout: 3 * time.Second,
503
- // TLSHandshakeTimeout: time.Duration(timeout) * time.Second,
504
- // ExpectContinueTimeout: 1 * time.Second,
505
- // TLSClientConfig: &tls.Config{
506
- // InsecureSkipVerify: false,
507
- // // for version prior to tls1.3, the handshake will take 2-RTTs,
508
- // // plus, majority server supports tls1.3, so we set a limit here
509
- // MinVersion: tls.VersionTLS13,
510
- // RootCAs: rootCAPrepare(),
511
- // },
512
- // }
513
- //
514
- // req, err := http.NewRequest("GET", newurl, nil)
515
- // if err != nil {
516
- // return 0, 0, err
517
- // }
518
- //
519
- // tlsStart := int64(0)
520
- // tlsEnd := int64(0)
521
- // writeStart := int64(0)
522
- // writeEnd := int64(0)
523
- // trace := &httptrace.ClientTrace{
524
- // TLSHandshakeStart: func() {
525
- // tlsStart = time.Now().UnixMilli()
526
- // },
527
- // TLSHandshakeDone: func(cs tls.ConnectionState, err error) {
528
- // tlsEnd = time.Now().UnixMilli()
529
- // if err != nil {
530
- // tlsEnd = 0
531
- // }
532
- // },
533
- // GotFirstResponseByte: func() {
534
- // writeEnd = time.Now().UnixMilli()
535
- // },
536
- // WroteHeaders: func() {
537
- // writeStart = time.Now().UnixMilli()
538
- // },
539
- // }
540
- // req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
541
- //
542
- // connStart := time.Now().UnixMilli()
543
- // if resp, err := transport.RoundTrip(req); err != nil {
544
- // return 0, 0, err
545
- // } else {
546
- // if !strings.HasPrefix(newurl, "https:") {
547
- // return uint16(writeStart - connStart), uint16(writeEnd - connStart), nil
548
- // }
549
- // if resp.TLS != nil && resp.TLS.HandshakeComplete {
550
- // connEnd := time.Now().UnixMilli()
551
- // fmt.Printf("Urltest end. Name:%s, TimeStack:%d,%d,%d,%d\n", proxy.Name(), connEnd-writeEnd, writeEnd-tlsEnd, tlsEnd-tlsStart, tlsStart-connStart)
552
- // // use payload rtt
553
- // return uint16(writeEnd - tlsEnd), uint16(writeEnd - connStart), nil
554
- // // return uint16(tlsEnd - tlsStart), uint16(writeEnd - connStart), nil
555
- // }
556
- // return 0, 0, fmt.Errorf("cannot extract payload from response")
557
- // }
558
- //}
559
- //
560
- ////export urltestJson
561
- //func urltestJson(url *C.char, index int, timeout int) *C.char {
562
- // retMap := make(map[string]interface{})
563
- // rtt, delay, err := urlTest(url, index, timeout)
564
- // if err != nil {
565
- //
566
- // }
567
- // retMap["rtt"] = rtt
568
- // retMap["delay"] = delay
569
- // retMap["err"] = err
570
- // ret, _ := json.Marshal(retMap)
571
- // return C.CString(string(ret))
572
- //}
573
-
574
- //func rootCAPrepare() *x509.CertPool {
575
- // rootCAs := x509.NewCertPool()
576
- // rootCAs.AppendCertsFromPEM(FullTClashRootCa)
577
- // return rootCAs
578
- //}
579
- //func urlToMetadata(rawURL string) (addr constant.Metadata, err error) {
580
- // u, err := url.Parse(rawURL)
581
- // if err != nil {
582
- // return
583
- // }
584
- //
585
- // port := u.Port()
586
- // if port == "" {
587
- // switch u.Scheme {
588
- // case "https":
589
- // port = "443"
590
- // case "http":
591
- // port = "80"
592
- // default:
593
- // err = fmt.Errorf("%s scheme not Support", rawURL)
594
- // return
595
- // }
596
- // }
597
- //
598
- // addr = constant.Metadata{
599
- // Host: u.Hostname(),
600
- // DstIP: nil,
601
- // DstPort: port,
602
- // }
603
- // return
604
- //}
0 commit comments