chore: remove AddrType on Metadata
This commit is contained in:
parent
698d8ca701
commit
6dadc2357a
16 changed files with 60 additions and 116 deletions
|
@ -198,7 +198,6 @@ func urlToMetadata(rawURL string) (addr C.Metadata, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = C.Metadata{
|
addr = C.Metadata{
|
||||||
AddrType: C.AtypDomainName,
|
|
||||||
Host: u.Hostname(),
|
Host: u.Hostname(),
|
||||||
DstIP: netip.Addr{},
|
DstIP: netip.Addr{},
|
||||||
DstPort: port,
|
DstPort: port,
|
||||||
|
|
|
@ -32,17 +32,12 @@ func NewInner(conn net.Conn, dst string, host string) *context.ConnContext {
|
||||||
metadata.Type = C.INNER
|
metadata.Type = C.INNER
|
||||||
metadata.DNSMode = C.DNSMapping
|
metadata.DNSMode = C.DNSMapping
|
||||||
metadata.Host = host
|
metadata.Host = host
|
||||||
metadata.AddrType = C.AtypDomainName
|
|
||||||
metadata.Process = C.ClashName
|
metadata.Process = C.ClashName
|
||||||
if h, port, err := net.SplitHostPort(dst); err == nil {
|
if h, port, err := net.SplitHostPort(dst); err == nil {
|
||||||
metadata.DstPort = port
|
metadata.DstPort = port
|
||||||
if host == "" {
|
if host == "" {
|
||||||
if ip, err := netip.ParseAddr(h); err == nil {
|
if ip, err := netip.ParseAddr(h); err == nil {
|
||||||
metadata.DstIP = ip
|
metadata.DstIP = ip
|
||||||
metadata.AddrType = C.AtypIPv4
|
|
||||||
if ip.Is6() {
|
|
||||||
metadata.AddrType = C.AtypIPv6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func parseSocksAddr(target socks5.Addr) *C.Metadata {
|
func parseSocksAddr(target socks5.Addr) *C.Metadata {
|
||||||
metadata := &C.Metadata{
|
metadata := &C.Metadata{}
|
||||||
AddrType: int(target[0]),
|
|
||||||
}
|
|
||||||
|
|
||||||
switch target[0] {
|
switch target[0] {
|
||||||
case socks5.AtypDomainName:
|
case socks5.AtypDomainName:
|
||||||
|
@ -46,7 +44,6 @@ func parseHTTPAddr(request *http.Request) *C.Metadata {
|
||||||
|
|
||||||
metadata := &C.Metadata{
|
metadata := &C.Metadata{
|
||||||
NetWork: C.TCP,
|
NetWork: C.TCP,
|
||||||
AddrType: C.AtypDomainName,
|
|
||||||
Host: host,
|
Host: host,
|
||||||
DstIP: netip.Addr{},
|
DstIP: netip.Addr{},
|
||||||
DstPort: port,
|
DstPort: port,
|
||||||
|
@ -54,12 +51,6 @@ func parseHTTPAddr(request *http.Request) *C.Metadata {
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(host)
|
ip, err := netip.ParseAddr(host)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
switch {
|
|
||||||
case ip.Is6():
|
|
||||||
metadata.AddrType = C.AtypIPv6
|
|
||||||
default:
|
|
||||||
metadata.AddrType = C.AtypIPv4
|
|
||||||
}
|
|
||||||
metadata.DstIP = ip
|
metadata.DstIP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,10 +44,11 @@ func getClientXSessionCache() xtls.ClientSessionCache {
|
||||||
|
|
||||||
func serializesSocksAddr(metadata *C.Metadata) []byte {
|
func serializesSocksAddr(metadata *C.Metadata) []byte {
|
||||||
var buf [][]byte
|
var buf [][]byte
|
||||||
aType := uint8(metadata.AddrType)
|
addrType := metadata.AddrType()
|
||||||
|
aType := uint8(addrType)
|
||||||
p, _ := strconv.ParseUint(metadata.DstPort, 10, 16)
|
p, _ := strconv.ParseUint(metadata.DstPort, 10, 16)
|
||||||
port := []byte{uint8(p >> 8), uint8(p & 0xff)}
|
port := []byte{uint8(p >> 8), uint8(p & 0xff)}
|
||||||
switch metadata.AddrType {
|
switch addrType {
|
||||||
case socks5.AtypDomainName:
|
case socks5.AtypDomainName:
|
||||||
lenM := uint8(len(metadata.Host))
|
lenM := uint8(len(metadata.Host))
|
||||||
host := []byte(metadata.Host)
|
host := []byte(metadata.Host)
|
||||||
|
|
|
@ -6,18 +6,19 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/Dreamacro/clash/common/convert"
|
|
||||||
tlsC "github.com/Dreamacro/clash/component/tls"
|
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/Dreamacro/clash/common/convert"
|
||||||
"github.com/Dreamacro/clash/component/dialer"
|
"github.com/Dreamacro/clash/component/dialer"
|
||||||
"github.com/Dreamacro/clash/component/resolver"
|
"github.com/Dreamacro/clash/component/resolver"
|
||||||
|
tlsC "github.com/Dreamacro/clash/component/tls"
|
||||||
C "github.com/Dreamacro/clash/constant"
|
C "github.com/Dreamacro/clash/constant"
|
||||||
"github.com/Dreamacro/clash/transport/gun"
|
"github.com/Dreamacro/clash/transport/gun"
|
||||||
|
"github.com/Dreamacro/clash/transport/socks5"
|
||||||
"github.com/Dreamacro/clash/transport/vless"
|
"github.com/Dreamacro/clash/transport/vless"
|
||||||
"github.com/Dreamacro/clash/transport/vmess"
|
"github.com/Dreamacro/clash/transport/vmess"
|
||||||
)
|
)
|
||||||
|
@ -280,16 +281,16 @@ func (v *Vless) SupportUOT() bool {
|
||||||
func parseVlessAddr(metadata *C.Metadata) *vless.DstAddr {
|
func parseVlessAddr(metadata *C.Metadata) *vless.DstAddr {
|
||||||
var addrType byte
|
var addrType byte
|
||||||
var addr []byte
|
var addr []byte
|
||||||
switch metadata.AddrType {
|
switch metadata.AddrType() {
|
||||||
case C.AtypIPv4:
|
case socks5.AtypIPv4:
|
||||||
addrType = vless.AtypIPv4
|
addrType = vless.AtypIPv4
|
||||||
addr = make([]byte, net.IPv4len)
|
addr = make([]byte, net.IPv4len)
|
||||||
copy(addr[:], metadata.DstIP.AsSlice())
|
copy(addr[:], metadata.DstIP.AsSlice())
|
||||||
case C.AtypIPv6:
|
case socks5.AtypIPv6:
|
||||||
addrType = vless.AtypIPv6
|
addrType = vless.AtypIPv6
|
||||||
addr = make([]byte, net.IPv6len)
|
addr = make([]byte, net.IPv6len)
|
||||||
copy(addr[:], metadata.DstIP.AsSlice())
|
copy(addr[:], metadata.DstIP.AsSlice())
|
||||||
case C.AtypDomainName:
|
case socks5.AtypDomainName:
|
||||||
addrType = vless.AtypDomainName
|
addrType = vless.AtypDomainName
|
||||||
addr = make([]byte, len(metadata.Host)+1)
|
addr = make([]byte, len(metadata.Host)+1)
|
||||||
addr[0] = byte(len(metadata.Host))
|
addr[0] = byte(len(metadata.Host))
|
||||||
|
|
|
@ -16,32 +16,19 @@ func addrToMetadata(rawAddress string) (addr *C.Metadata, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(host)
|
if ip, err := netip.ParseAddr(host); err != nil {
|
||||||
if err != nil {
|
|
||||||
addr = &C.Metadata{
|
addr = &C.Metadata{
|
||||||
AddrType: C.AtypDomainName,
|
|
||||||
Host: host,
|
Host: host,
|
||||||
DstIP: netip.Addr{},
|
|
||||||
DstPort: port,
|
DstPort: port,
|
||||||
}
|
}
|
||||||
err = nil
|
} else {
|
||||||
return
|
|
||||||
} else if ip.Is4() {
|
|
||||||
addr = &C.Metadata{
|
addr = &C.Metadata{
|
||||||
AddrType: C.AtypIPv4,
|
|
||||||
Host: "",
|
Host: "",
|
||||||
DstIP: ip,
|
DstIP: ip,
|
||||||
DstPort: port,
|
DstPort: port,
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = &C.Metadata{
|
|
||||||
AddrType: C.AtypIPv6,
|
|
||||||
Host: "",
|
|
||||||
DstIP: ip,
|
|
||||||
DstPort: port,
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,6 @@ func (sd *SnifferDispatcher) replaceDomain(metadata *C.Metadata, host string) {
|
||||||
metadata.Host, host)
|
metadata.Host, host)
|
||||||
}
|
}
|
||||||
|
|
||||||
metadata.AddrType = C.AtypDomainName
|
|
||||||
metadata.Host = host
|
metadata.Host = host
|
||||||
metadata.DNSMode = C.DNSNormal
|
metadata.DNSMode = C.DNSNormal
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,12 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/Dreamacro/clash/transport/socks5"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Socks addr type
|
// Socks addr type
|
||||||
const (
|
const (
|
||||||
AtypIPv4 = 1
|
|
||||||
AtypDomainName = 3
|
|
||||||
AtypIPv6 = 4
|
|
||||||
|
|
||||||
TCP NetWork = iota
|
TCP NetWork = iota
|
||||||
UDP
|
UDP
|
||||||
ALLNet
|
ALLNet
|
||||||
|
@ -105,7 +103,6 @@ type Metadata struct {
|
||||||
DstIP netip.Addr `json:"destinationIP"`
|
DstIP netip.Addr `json:"destinationIP"`
|
||||||
SrcPort string `json:"sourcePort"`
|
SrcPort string `json:"sourcePort"`
|
||||||
DstPort string `json:"destinationPort"`
|
DstPort string `json:"destinationPort"`
|
||||||
AddrType int `json:"-"`
|
|
||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
DNSMode DNSMode `json:"dnsMode"`
|
DNSMode DNSMode `json:"dnsMode"`
|
||||||
Uid *int32 `json:"uid"`
|
Uid *int32 `json:"uid"`
|
||||||
|
@ -138,6 +135,17 @@ func (m *Metadata) SourceDetail() string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Metadata) AddrType() int {
|
||||||
|
switch true {
|
||||||
|
case m.Host != "" || !m.DstIP.IsValid():
|
||||||
|
return socks5.AtypDomainName
|
||||||
|
case m.DstIP.Is4():
|
||||||
|
return socks5.AtypIPv4
|
||||||
|
default:
|
||||||
|
return socks5.AtypIPv6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Metadata) Resolved() bool {
|
func (m *Metadata) Resolved() bool {
|
||||||
return m.DstIP.IsValid()
|
return m.DstIP.IsValid()
|
||||||
}
|
}
|
||||||
|
@ -148,11 +156,6 @@ func (m *Metadata) Pure() *Metadata {
|
||||||
if (m.DNSMode == DNSMapping || m.DNSMode == DNSHosts) && m.DstIP.IsValid() {
|
if (m.DNSMode == DNSMapping || m.DNSMode == DNSHosts) && m.DstIP.IsValid() {
|
||||||
copyM := *m
|
copyM := *m
|
||||||
copyM.Host = ""
|
copyM.Host = ""
|
||||||
if copyM.DstIP.Is4() {
|
|
||||||
copyM.AddrType = AtypIPv4
|
|
||||||
} else {
|
|
||||||
copyM.AddrType = AtypIPv6
|
|
||||||
}
|
|
||||||
return ©M
|
return ©M
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,14 +156,8 @@ func dialContextExtra(ctx context.Context, adapterName string, network string, d
|
||||||
networkType = C.UDP
|
networkType = C.UDP
|
||||||
}
|
}
|
||||||
|
|
||||||
addrType := C.AtypIPv4
|
|
||||||
if dstIP.Is6() {
|
|
||||||
addrType = C.AtypIPv6
|
|
||||||
}
|
|
||||||
|
|
||||||
metadata := &C.Metadata{
|
metadata := &C.Metadata{
|
||||||
NetWork: networkType,
|
NetWork: networkType,
|
||||||
AddrType: addrType,
|
|
||||||
Host: "",
|
Host: "",
|
||||||
DstIP: dstIP,
|
DstIP: dstIP,
|
||||||
DstPort: port,
|
DstPort: port,
|
||||||
|
|
|
@ -19,9 +19,6 @@ func (d *Domain) RuleType() C.RuleType {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Domain) Match(metadata *C.Metadata) (bool, string) {
|
func (d *Domain) Match(metadata *C.Metadata) (bool, string) {
|
||||||
if metadata.AddrType != C.AtypDomainName {
|
|
||||||
return false, ""
|
|
||||||
}
|
|
||||||
return metadata.Host == d.domain, d.adapter
|
return metadata.Host == d.domain, d.adapter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,6 @@ func (dk *DomainKeyword) RuleType() C.RuleType {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dk *DomainKeyword) Match(metadata *C.Metadata) (bool, string) {
|
func (dk *DomainKeyword) Match(metadata *C.Metadata) (bool, string) {
|
||||||
if metadata.AddrType != C.AtypDomainName {
|
|
||||||
return false, ""
|
|
||||||
}
|
|
||||||
domain := metadata.Host
|
domain := metadata.Host
|
||||||
return strings.Contains(domain, dk.keyword), dk.adapter
|
return strings.Contains(domain, dk.keyword), dk.adapter
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,6 @@ func (ds *DomainSuffix) RuleType() C.RuleType {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *DomainSuffix) Match(metadata *C.Metadata) (bool, string) {
|
func (ds *DomainSuffix) Match(metadata *C.Metadata) (bool, string) {
|
||||||
if metadata.AddrType != C.AtypDomainName {
|
|
||||||
return false, ""
|
|
||||||
}
|
|
||||||
domain := metadata.Host
|
domain := metadata.Host
|
||||||
return strings.HasSuffix(domain, "."+ds.suffix) || domain == ds.suffix, ds.adapter
|
return strings.HasSuffix(domain, "."+ds.suffix) || domain == ds.suffix, ds.adapter
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,6 @@ func (gs *GEOSITE) RuleType() C.RuleType {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *GEOSITE) Match(metadata *C.Metadata) (bool, string) {
|
func (gs *GEOSITE) Match(metadata *C.Metadata) (bool, string) {
|
||||||
if metadata.AddrType != C.AtypDomainName {
|
|
||||||
return false, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
domain := metadata.Host
|
domain := metadata.Host
|
||||||
return gs.matcher.ApplyDomain(domain), gs.adapter
|
return gs.matcher.ApplyDomain(domain), gs.adapter
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,6 @@ func TestAND(t *testing.T) {
|
||||||
assert.Equal(t, false, and.ShouldResolveIP())
|
assert.Equal(t, false, and.ShouldResolveIP())
|
||||||
m, _ := and.Match(&C.Metadata{
|
m, _ := and.Match(&C.Metadata{
|
||||||
Host: "baidu.com",
|
Host: "baidu.com",
|
||||||
AddrType: C.AtypDomainName,
|
|
||||||
NetWork: C.TCP,
|
NetWork: C.TCP,
|
||||||
DstPort: "20000",
|
DstPort: "20000",
|
||||||
})
|
})
|
||||||
|
|
|
@ -557,7 +557,6 @@ func testSuit(t *testing.T, proxy C.ProxyAdapter) {
|
||||||
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
||||||
Host: localIP.String(),
|
Host: localIP.String(),
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypDomainName,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return conn
|
return conn
|
||||||
|
@ -567,7 +566,6 @@ func testSuit(t *testing.T, proxy C.ProxyAdapter) {
|
||||||
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
||||||
Host: localIP.String(),
|
Host: localIP.String(),
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypDomainName,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return conn
|
return conn
|
||||||
|
@ -581,7 +579,6 @@ func testSuit(t *testing.T, proxy C.ProxyAdapter) {
|
||||||
NetWork: C.UDP,
|
NetWork: C.UDP,
|
||||||
DstIP: localIP,
|
DstIP: localIP,
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypIPv4,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer pc.Close()
|
defer pc.Close()
|
||||||
|
@ -592,7 +589,6 @@ func testSuit(t *testing.T, proxy C.ProxyAdapter) {
|
||||||
NetWork: C.UDP,
|
NetWork: C.UDP,
|
||||||
DstIP: localIP,
|
DstIP: localIP,
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypIPv4,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer pc.Close()
|
defer pc.Close()
|
||||||
|
@ -603,7 +599,6 @@ func testSuit(t *testing.T, proxy C.ProxyAdapter) {
|
||||||
NetWork: C.UDP,
|
NetWork: C.UDP,
|
||||||
DstIP: localIP,
|
DstIP: localIP,
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypIPv4,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer pc.Close()
|
defer pc.Close()
|
||||||
|
@ -641,7 +636,6 @@ func benchmarkProxy(b *testing.B, proxy C.ProxyAdapter) {
|
||||||
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
conn, err := proxy.DialContext(context.Background(), &C.Metadata{
|
||||||
Host: localIP.String(),
|
Host: localIP.String(),
|
||||||
DstPort: "10001",
|
DstPort: "10001",
|
||||||
AddrType: socks5.AtypDomainName,
|
|
||||||
})
|
})
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
|
|
||||||
|
|
|
@ -169,11 +169,6 @@ func preHandleMetadata(metadata *C.Metadata) error {
|
||||||
if ip, err := netip.ParseAddr(metadata.Host); err == nil {
|
if ip, err := netip.ParseAddr(metadata.Host); err == nil {
|
||||||
metadata.DstIP = ip
|
metadata.DstIP = ip
|
||||||
metadata.Host = ""
|
metadata.Host = ""
|
||||||
if ip.Is4() {
|
|
||||||
metadata.AddrType = C.AtypIPv4
|
|
||||||
} else {
|
|
||||||
metadata.AddrType = C.AtypIPv6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// preprocess enhanced-mode metadata
|
// preprocess enhanced-mode metadata
|
||||||
|
@ -181,7 +176,6 @@ func preHandleMetadata(metadata *C.Metadata) error {
|
||||||
host, exist := resolver.FindHostByIP(metadata.DstIP)
|
host, exist := resolver.FindHostByIP(metadata.DstIP)
|
||||||
if exist {
|
if exist {
|
||||||
metadata.Host = host
|
metadata.Host = host
|
||||||
metadata.AddrType = C.AtypDomainName
|
|
||||||
metadata.DNSMode = C.DNSMapping
|
metadata.DNSMode = C.DNSMapping
|
||||||
if resolver.FakeIPEnabled() {
|
if resolver.FakeIPEnabled() {
|
||||||
metadata.DstIP = netip.Addr{}
|
metadata.DstIP = netip.Addr{}
|
||||||
|
|
Loading…
Reference in a new issue