mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-05-09 13:48:41 +00:00
Merge branch 'dns' into dns-geo
This commit is contained in:
commit
8a7cd65fc2
35 changed files with 458 additions and 180 deletions
|
@ -16,6 +16,7 @@ import (
|
|||
|
||||
type NameServerConfig struct {
|
||||
Address *Address
|
||||
ClientIP *Address
|
||||
Port uint16
|
||||
Domains []string
|
||||
ExpectIPs StringList
|
||||
|
@ -30,12 +31,14 @@ func (c *NameServerConfig) UnmarshalJSON(data []byte) error {
|
|||
|
||||
var advanced struct {
|
||||
Address *Address `json:"address"`
|
||||
ClientIP *Address `json:"clientIp"`
|
||||
Port uint16 `json:"port"`
|
||||
Domains []string `json:"domains"`
|
||||
ExpectIPs StringList `json:"expectIps"`
|
||||
}
|
||||
if err := json.Unmarshal(data, &advanced); err == nil {
|
||||
c.Address = advanced.Address
|
||||
c.ClientIP = advanced.ClientIP
|
||||
c.Port = advanced.Port
|
||||
c.Domains = advanced.Domains
|
||||
c.ExpectIPs = advanced.ExpectIPs
|
||||
|
@ -76,12 +79,20 @@ func (c *NameServerConfig) Build() (*dns.NameServer, error) {
|
|||
return nil, newError("invalid IP rule: ", c.ExpectIPs).Base(err)
|
||||
}
|
||||
|
||||
var myClientIP []byte
|
||||
if c.ClientIP != nil {
|
||||
if !c.ClientIP.Family().IsIP() {
|
||||
return nil, newError("not an IP address:", c.ClientIP.String())
|
||||
}
|
||||
myClientIP = []byte(c.ClientIP.IP())
|
||||
}
|
||||
return &dns.NameServer{
|
||||
Address: &net.Endpoint{
|
||||
Network: net.Network_UDP,
|
||||
Address: c.Address.Build(),
|
||||
Port: uint32(c.Port),
|
||||
},
|
||||
ClientIp: myClientIP,
|
||||
PrioritizedDomain: domains,
|
||||
Geoip: geoipList,
|
||||
OriginalRules: originalRules,
|
||||
|
|
|
@ -68,6 +68,7 @@ func TestDNSConfigParsing(t *testing.T) {
|
|||
Input: `{
|
||||
"servers": [{
|
||||
"address": "8.8.8.8",
|
||||
"clientIp": "10.0.0.1",
|
||||
"port": 5353,
|
||||
"domains": ["domain:example.com"]
|
||||
}],
|
||||
|
@ -95,6 +96,7 @@ func TestDNSConfigParsing(t *testing.T) {
|
|||
Network: net.Network_UDP,
|
||||
Port: 5353,
|
||||
},
|
||||
ClientIp: []byte{10, 0, 0, 1},
|
||||
PrioritizedDomain: []*domain.Domain{
|
||||
{
|
||||
Type: domain.MatchingType_Subdomain,
|
||||
|
|
|
@ -321,6 +321,7 @@ type TLSConfig struct {
|
|||
MaxVersion string `json:"maxVersion"`
|
||||
CipherSuites string `json:"cipherSuites"`
|
||||
PreferServerCipherSuites bool `json:"preferServerCipherSuites"`
|
||||
Fingerprint string `json:"fingerprint"`
|
||||
}
|
||||
|
||||
// Build implements Buildable.
|
||||
|
@ -348,6 +349,7 @@ func (c *TLSConfig) Build() (proto.Message, error) {
|
|||
config.MaxVersion = c.MaxVersion
|
||||
config.CipherSuites = c.CipherSuites
|
||||
config.PreferServerCipherSuites = c.PreferServerCipherSuites
|
||||
config.Fingerprint = strings.ToLower(c.Fingerprint)
|
||||
return config, nil
|
||||
}
|
||||
|
||||
|
@ -476,22 +478,19 @@ type SocketConfig struct {
|
|||
|
||||
// Build implements Buildable.
|
||||
func (c *SocketConfig) Build() (*internet.SocketConfig, error) {
|
||||
tfo := int32(-1)
|
||||
tfo := int32(0) // don't invoke setsockopt() for TFO
|
||||
if c.TFO != nil {
|
||||
switch v := c.TFO.(type) {
|
||||
case bool:
|
||||
if v {
|
||||
tfo = 256
|
||||
} else {
|
||||
tfo = 0
|
||||
tfo = -1 // TFO need to be disabled
|
||||
}
|
||||
case float64:
|
||||
if v < 0 {
|
||||
return nil, newError("tcpFastOpen: only boolean and non-negative integer value is acceptable")
|
||||
}
|
||||
tfo = int32(math.Min(v, math.MaxInt32))
|
||||
default:
|
||||
return nil, newError("tcpFastOpen: only boolean and non-negative integer value is acceptable")
|
||||
return nil, newError("tcpFastOpen: only boolean and integer value is acceptable")
|
||||
}
|
||||
}
|
||||
var tproxy internet.SocketConfig_TProxyMode
|
||||
|
|
|
@ -31,6 +31,13 @@ func TestSocketConfig(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": true, queue length 256 is expected. other parameters are tested here too
|
||||
expectedOutput := &internet.SocketConfig{
|
||||
Mark: 1,
|
||||
Tfo: 256,
|
||||
DomainStrategy: internet.DomainStrategy_USE_IP,
|
||||
DialerProxy: "tag",
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
|
@ -40,38 +47,118 @@ func TestSocketConfig(t *testing.T) {
|
|||
"dialerProxy": "tag"
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: &internet.SocketConfig{
|
||||
Mark: 1,
|
||||
Tfo: 256,
|
||||
DomainStrategy: internet.DomainStrategy_USE_IP,
|
||||
DialerProxy: "tag",
|
||||
},
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != 256 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be 256")
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": false, disabled TFO is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: -1,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
"tcpFastOpen": false
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 0,
|
||||
},
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != 0 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be 0")
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": 65535, queue length 65535 is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 65535,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
"tcpFastOpen": 65535
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 65535,
|
||||
},
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != 65535 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be 65535")
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": -65535, disable TFO is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: -65535,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
"tcpFastOpen": -65535
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != 0 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be 0")
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": 0, no operation is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 0,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
"tcpFastOpen": 0
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != -1 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
||||
}
|
||||
|
||||
// test omit "tcpFastOpen", no operation is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 0,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{}`,
|
||||
Parser: createParser(),
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != -1 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
||||
}
|
||||
|
||||
// test "tcpFastOpen": null, no operation is expected
|
||||
expectedOutput = &internet.SocketConfig{
|
||||
Mark: 0,
|
||||
Tfo: 0,
|
||||
}
|
||||
runMultiTestCase(t, []TestCase{
|
||||
{
|
||||
Input: `{
|
||||
"tcpFastOpen": null
|
||||
}`,
|
||||
Parser: createParser(),
|
||||
Output: expectedOutput,
|
||||
},
|
||||
})
|
||||
if expectedOutput.ParseTFOValue() != -1 {
|
||||
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTransportConfig(t *testing.T) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue