Skip to content
This repository was archived by the owner on Jul 12, 2024. It is now read-only.

Commit 269e1f0

Browse files
committed
✨ Support for clash.meta branch.
1 parent 6e43c9c commit 269e1f0

File tree

3 files changed

+322
-175
lines changed

3 files changed

+322
-175
lines changed

fulltclash.go

+15-143
Original file line numberDiff line numberDiff line change
@@ -212,22 +212,22 @@ func myURLTest(pingURL string, index int) uint16 {
212212
}
213213
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
214214
defer cancel()
215-
delay, meanDelay, err := proxy.URLTest(ctx, pingURL)
215+
delay, err := proxy.URLTest(ctx, pingURL, nil, 0)
216216
if ctx.Err() != nil {
217217
return 0
218218
}
219219

220220
if err != nil || delay == 0 {
221221
fmt.Printf("error: %s \n", err.Error())
222-
return meanDelay
222+
return delay
223223
}
224-
return meanDelay
224+
return delay
225225
}
226226

227227
func startclashMixed2(rawaddr string, index int) {
228228
addr := rawaddr
229229
tcpQueue := make(chan constant.ConnContext, 256)
230-
udpQueue := make(chan *inbound.PacketAdapter, 32)
230+
udpQueue := make(chan constant.PacketAdapter, 32)
231231
mixedListener, mixedUDPLister := ReCreateMixed(addr, tcpQueue, udpQueue, index)
232232
defer mixedListener.Close()
233233
defer mixedUDPLister.Close()
@@ -239,7 +239,11 @@ func startclashMixed2(rawaddr string, index int) {
239239
for i := 0; i < numUDPWorkers; i++ {
240240
go func() {
241241
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+
}
243247
}
244248
}()
245249
}
@@ -248,7 +252,7 @@ func startclashMixed2(rawaddr string, index int) {
248252
go handleTCPConn(conn2, index)
249253
}
250254
}
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) {
252256
addr := rawaddr
253257
mixedMux.Lock()
254258
defer mixedMux.Unlock()
@@ -286,8 +290,7 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
286290
// make a fAddr if request ip is fakeip
287291
var fAddr netip.Addr
288292
if resolver.IsExistFakeIP(metadata.DstIP) {
289-
fAddr, _ = netip.AddrFromSlice(metadata.DstIP)
290-
fAddr = fAddr.Unmap()
293+
fAddr = metadata.DstIP.Unmap()
291294
}
292295

293296
// local resolve UDP dns
@@ -304,7 +307,7 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
304307
key := packet.LocalAddr().String()
305308

306309
handle := func() bool {
307-
pc := natTable.Get(key)
310+
pc, _ := natTable.Get(key)
308311
if pc != nil {
309312
err := handleUDPToRemote(packet, pc, metadata)
310313
if err != nil {
@@ -358,13 +361,12 @@ func handleUDPConn(packet *inbound.PacketAdapter, index int) {
358361
return
359362
}
360363
pCtx.InjectPacketConn(rawPc)
361-
pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, nil)
364+
pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, nil, 0, 0, false)
362365

363-
oAddr, _ := netip.AddrFromSlice(metadata.DstIP)
364-
oAddr = oAddr.Unmap()
366+
oAddr := metadata.DstIP.Unmap()
365367
go handleUDPToLocal(packet.UDPPacket, pc, key, oAddr, fAddr)
366368

367-
natTable.Set(key, pc)
369+
natTable.Set(key, pc, nil)
368370
handle()
369371
}()
370372
}
@@ -472,133 +474,3 @@ func setProxy(tempconf *RawConfig2) {
472474
rawcfgs[tempconf.Index] = &RawConfig{Proxy: tempconf.Proxy}
473475
log.Printf("set proxy success! index: %d\n", tempconf.Index)
474476
}
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-
//}

go.mod

+78-9
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,91 @@ go 1.19
44

55
require (
66
github.com/Dreamacro/clash v1.14.0
7+
golang.org/x/crypto v0.10.0
78
gopkg.in/yaml.v3 v3.0.1
89
)
910

1011
require (
11-
github.com/go-chi/chi/v5 v5.0.8 // indirect
12+
github.com/3andne/restls-client-go v0.1.4 // indirect
13+
github.com/RyuaNerin/go-krypto v1.0.2 // indirect
14+
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
15+
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
16+
github.com/andybalholm/brotli v1.0.5 // indirect
17+
github.com/coreos/go-iptables v0.6.0 // indirect
18+
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
19+
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
20+
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
21+
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
22+
github.com/go-ole/go-ole v1.2.6 // indirect
23+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
1224
github.com/gofrs/uuid/v5 v5.0.0 // indirect
25+
github.com/golang/mock v1.6.0 // indirect
26+
github.com/google/btree v1.1.2 // indirect
27+
github.com/google/go-cmp v0.5.9 // indirect
28+
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
1329
github.com/gorilla/websocket v1.5.0 // indirect
14-
github.com/miekg/dns v1.1.52 // indirect
15-
github.com/sirupsen/logrus v1.9.0 // indirect
30+
github.com/hashicorp/yamux v0.1.1 // indirect
31+
github.com/insomniacslk/dhcp v0.0.0-20230516061539-49801966e6cb // indirect
32+
github.com/josharian/native v1.1.0 // indirect
33+
github.com/jpillora/backoff v1.0.0 // indirect
34+
github.com/klauspost/compress v1.15.15 // indirect
35+
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
36+
github.com/kr/pretty v0.1.0 // indirect
37+
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
38+
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect
39+
github.com/mdlayher/netlink v1.7.2 // indirect
40+
github.com/mdlayher/socket v0.4.1 // indirect
41+
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
42+
github.com/metacubex/gvisor v0.0.0-20230611153922-78842f086475 // indirect
43+
github.com/metacubex/quic-go v0.35.2-0.20230603072621-ea2663348ebb // indirect
44+
github.com/metacubex/sing-shadowsocks v0.2.2 // indirect
45+
github.com/metacubex/sing-shadowsocks2 v0.1.0 // indirect
46+
github.com/metacubex/sing-vmess v0.1.5 // indirect
47+
github.com/metacubex/sing-wireguard v0.0.0-20230611155257-1498ae315a28 // indirect
48+
github.com/miekg/dns v1.1.54 // indirect
49+
github.com/mroth/weightedrand/v2 v2.0.1 // indirect
50+
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
51+
github.com/onsi/ginkgo/v2 v2.2.0 // indirect
52+
github.com/openacid/low v0.1.21 // indirect
53+
github.com/oschwald/geoip2-golang v1.8.0 // indirect
54+
github.com/oschwald/maxminddb-golang v1.10.0 // indirect
55+
github.com/pierrec/lz4/v4 v4.1.14 // indirect
56+
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
57+
github.com/quic-go/qpack v0.4.0 // indirect
58+
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
59+
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
60+
github.com/sagernet/sing v0.2.5 // indirect
61+
github.com/sagernet/sing-mux v0.1.0 // indirect
62+
github.com/sagernet/sing-shadowtls v0.1.2 // indirect
63+
github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 // indirect
64+
github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 // indirect
65+
github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2 // indirect
66+
github.com/sagernet/wireguard-go v0.0.0-20230420044414-a7bac1754e77 // indirect
67+
github.com/samber/lo v1.38.1 // indirect
68+
github.com/shirou/gopsutil/v3 v3.23.5 // indirect
69+
github.com/shoenig/go-m1cpu v0.1.6 // indirect
70+
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
71+
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
72+
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
73+
github.com/sirupsen/logrus v1.9.2 // indirect
74+
github.com/tklauser/go-sysconf v0.3.11 // indirect
75+
github.com/tklauser/numcpus v0.6.0 // indirect
76+
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
77+
github.com/xtls/go v0.0.0-20230107031059-4610f88d00f3 // indirect
78+
github.com/yusufpapurcu/wmi v1.2.3 // indirect
79+
github.com/zhangyunhao116/fastrand v0.3.0 // indirect
80+
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
1681
go.etcd.io/bbolt v1.3.7 // indirect
17-
go.uber.org/atomic v1.10.0 // indirect
18-
go.uber.org/automaxprocs v1.5.2 // indirect
19-
golang.org/x/crypto v0.7.0 // indirect
82+
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
2083
golang.org/x/mod v0.8.0 // indirect
21-
golang.org/x/net v0.8.0 // indirect
22-
golang.org/x/sys v0.6.0 // indirect
23-
golang.org/x/text v0.8.0 // indirect
84+
golang.org/x/net v0.11.0 // indirect
85+
golang.org/x/sync v0.2.0 // indirect
86+
golang.org/x/sys v0.9.0 // indirect
87+
golang.org/x/text v0.10.0 // indirect
88+
golang.org/x/time v0.3.0 // indirect
2489
golang.org/x/tools v0.6.0 // indirect
90+
google.golang.org/protobuf v1.30.0 // indirect
91+
lukechampine.com/blake3 v1.2.1 // indirect
2592
)
93+
94+
replace github.com/Dreamacro/clash => github.com/MetaCubeX/Clash.Meta v1.15.0

0 commit comments

Comments
 (0)