mirror of https://github.com/v2ray/v2ray-core
simplify stringlist
parent
a403859105
commit
2d233295e6
|
@ -1,5 +1,14 @@
|
|||
package dns
|
||||
|
||||
type CacheConfig interface {
|
||||
IsTrustedSource(tag string) bool
|
||||
import (
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
type CacheConfig struct {
|
||||
TrustedTags map[serial.StringLiteral]bool
|
||||
}
|
||||
|
||||
func (this *CacheConfig) IsTrustedSource(tag serial.StringLiteral) bool {
|
||||
_, found := this.TrustedTags[tag]
|
||||
return found
|
||||
}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// +build json
|
||||
|
||||
package dns
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
func (this *CacheConfig) UnmarshalJSON(data []byte) error {
|
||||
var strlist serial.StringLiteralList
|
||||
if err := json.Unmarshal(data, strlist); err != nil {
|
||||
return err
|
||||
}
|
||||
config := &CacheConfig{
|
||||
TrustedTags: make(map[serial.StringLiteral]bool, strlist.Len()),
|
||||
}
|
||||
for _, str := range strlist {
|
||||
config.TrustedTags[str.TrimSpace()] = true
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -34,10 +34,10 @@ func (this *entry) Extend() {
|
|||
|
||||
type DnsCache struct {
|
||||
cache *collect.ValidityMap
|
||||
config CacheConfig
|
||||
config *CacheConfig
|
||||
}
|
||||
|
||||
func NewCache(config CacheConfig) *DnsCache {
|
||||
func NewCache(config *CacheConfig) *DnsCache {
|
||||
cache := &DnsCache{
|
||||
cache: collect.NewValidityMap(3600),
|
||||
config: config,
|
||||
|
@ -47,7 +47,7 @@ func NewCache(config CacheConfig) *DnsCache {
|
|||
|
||||
func (this *DnsCache) Add(context app.Context, domain string, ip net.IP) {
|
||||
callerTag := context.CallerTag()
|
||||
if !this.config.IsTrustedSource(callerTag) {
|
||||
if !this.config.IsTrustedSource(serial.StringLiteral(callerTag)) {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/v2ray/v2ray-core/app/dns"
|
||||
dnstesting "github.com/v2ray/v2ray-core/app/dns/testing"
|
||||
apptesting "github.com/v2ray/v2ray-core/app/testing"
|
||||
netassert "github.com/v2ray/v2ray-core/common/net/testing/assert"
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
v2testing "github.com/v2ray/v2ray-core/testing"
|
||||
)
|
||||
|
||||
|
@ -15,9 +15,9 @@ func TestDnsAdd(t *testing.T) {
|
|||
v2testing.Current(t)
|
||||
|
||||
domain := "v2ray.com"
|
||||
cache := dns.NewCache(&dnstesting.CacheConfig{
|
||||
TrustedTags: map[string]bool{
|
||||
"testtag": true,
|
||||
cache := dns.NewCache(&dns.CacheConfig{
|
||||
TrustedTags: map[serial.StringLiteral]bool{
|
||||
serial.StringLiteral("testtag"): true,
|
||||
},
|
||||
})
|
||||
ip := cache.Get(&apptesting.Context{}, domain)
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
package json
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
serialjson "github.com/v2ray/v2ray-core/common/serial/json"
|
||||
)
|
||||
|
||||
type TagList map[string]bool
|
||||
|
||||
func NewTagList(tags []string) TagList {
|
||||
list := TagList(make(map[string]bool))
|
||||
for _, tag := range tags {
|
||||
list[strings.TrimSpace(tag)] = true
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
func (this *TagList) UnmarshalJSON(data []byte) error {
|
||||
tags, err := serialjson.UnmarshalStringList(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*this = NewTagList(tags)
|
||||
return nil
|
||||
}
|
||||
|
||||
type CacheConfig struct {
|
||||
TrustedTags TagList `json:"trustedTags"`
|
||||
}
|
||||
|
||||
func (this *CacheConfig) IsTrustedSource(tag string) bool {
|
||||
_, found := this.TrustedTags[tag]
|
||||
return found
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package testing
|
||||
|
||||
type CacheConfig struct {
|
||||
TrustedTags map[string]bool
|
||||
}
|
||||
|
||||
func (this *CacheConfig) IsTrustedSource(tag string) bool {
|
||||
_, found := this.TrustedTags[tag]
|
||||
return found
|
||||
}
|
|
@ -8,39 +8,9 @@ import (
|
|||
"strings"
|
||||
|
||||
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
type StringList []string
|
||||
|
||||
func NewStringList(str ...string) *StringList {
|
||||
list := StringList(str)
|
||||
return &list
|
||||
}
|
||||
|
||||
func (this *StringList) UnmarshalJSON(data []byte) error {
|
||||
var strList []string
|
||||
err := json.Unmarshal(data, &strList)
|
||||
if err == nil {
|
||||
*this = make([]string, len(strList))
|
||||
copy(*this, strList)
|
||||
return nil
|
||||
}
|
||||
|
||||
var str string
|
||||
err = json.Unmarshal(data, &str)
|
||||
if err == nil {
|
||||
*this = make([]string, 0, 1)
|
||||
*this = append(*this, str)
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("Failed to unmarshal string list: " + string(data))
|
||||
}
|
||||
|
||||
func (this *StringList) Len() int {
|
||||
return len([]string(*this))
|
||||
}
|
||||
|
||||
type DomainMatcher interface {
|
||||
Match(domain string) bool
|
||||
}
|
||||
|
@ -138,10 +108,10 @@ func (this *FieldRule) Apply(dest v2net.Destination) bool {
|
|||
func (this *FieldRule) UnmarshalJSON(data []byte) error {
|
||||
type RawFieldRule struct {
|
||||
Rule
|
||||
Domain *StringList `json:"domain"`
|
||||
IP *StringList `json:"ip"`
|
||||
Port *v2net.PortRange `json:"port"`
|
||||
Network *v2net.NetworkList `json:"network"`
|
||||
Domain *serial.StringLiteralList `json:"domain"`
|
||||
IP *serial.StringLiteralList `json:"ip"`
|
||||
Port *v2net.PortRange `json:"port"`
|
||||
Network *v2net.NetworkList `json:"network"`
|
||||
}
|
||||
rawFieldRule := RawFieldRule{}
|
||||
err := json.Unmarshal(data, &rawFieldRule)
|
||||
|
@ -156,14 +126,14 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
|
|||
this.Domain = make([]DomainMatcher, rawFieldRule.Domain.Len())
|
||||
for idx, rawDomain := range *(rawFieldRule.Domain) {
|
||||
var matcher DomainMatcher
|
||||
if strings.HasPrefix(rawDomain, "regexp:") {
|
||||
rawMatcher, err := NewRegexpDomainMatcher(rawDomain[7:])
|
||||
if strings.HasPrefix(rawDomain.String(), "regexp:") {
|
||||
rawMatcher, err := NewRegexpDomainMatcher(rawDomain.String()[7:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
matcher = rawMatcher
|
||||
} else {
|
||||
matcher = NewPlainDomainMatcher(rawDomain)
|
||||
matcher = NewPlainDomainMatcher(rawDomain.String())
|
||||
}
|
||||
this.Domain[idx] = matcher
|
||||
}
|
||||
|
@ -173,7 +143,7 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
|
|||
if rawFieldRule.IP != nil && rawFieldRule.IP.Len() > 0 {
|
||||
this.IP = make([]*net.IPNet, 0, rawFieldRule.IP.Len())
|
||||
for _, ipStr := range *(rawFieldRule.IP) {
|
||||
_, ipNet, err := net.ParseCIDR(ipStr)
|
||||
_, ipNet, err := net.ParseCIDR(ipStr.String())
|
||||
if err != nil {
|
||||
return errors.New("Invalid IP range in router rule: " + err.Error())
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package json
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||
|
@ -9,26 +8,6 @@ import (
|
|||
"github.com/v2ray/v2ray-core/testing/assert"
|
||||
)
|
||||
|
||||
func TestStringListParsingList(t *testing.T) {
|
||||
v2testing.Current(t)
|
||||
|
||||
rawJson := `["a", "b", "c", "d"]`
|
||||
var strList StringList
|
||||
err := json.Unmarshal([]byte(rawJson), &strList)
|
||||
assert.Error(err).IsNil()
|
||||
assert.Int(strList.Len()).Equals(4)
|
||||
}
|
||||
|
||||
func TestStringListParsingString(t *testing.T) {
|
||||
v2testing.Current(t)
|
||||
|
||||
rawJson := `"abcd"`
|
||||
var strList StringList
|
||||
err := json.Unmarshal([]byte(rawJson), &strList)
|
||||
assert.Error(err).IsNil()
|
||||
assert.Int(strList.Len()).Equals(1)
|
||||
}
|
||||
|
||||
func TestDomainMatching(t *testing.T) {
|
||||
v2testing.Current(t)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package net
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -9,14 +9,14 @@ const (
|
|||
UDPNetwork = Network("udp")
|
||||
)
|
||||
|
||||
type Network string
|
||||
type Network serial.StringLiteral
|
||||
|
||||
type NetworkList []Network
|
||||
|
||||
func NewNetworkList(networks []string) NetworkList {
|
||||
list := NetworkList(make([]Network, len(networks)))
|
||||
func NewNetworkList(networks serial.StringLiteralList) NetworkList {
|
||||
list := NetworkList(make([]Network, networks.Len()))
|
||||
for idx, network := range networks {
|
||||
list[idx] = Network(strings.ToLower(strings.TrimSpace(network)))
|
||||
list[idx] = Network(network.TrimSpace().ToLower())
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
|
|
@ -3,12 +3,14 @@
|
|||
package net
|
||||
|
||||
import (
|
||||
serialjson "github.com/v2ray/v2ray-core/common/serial/json"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
func (this *NetworkList) UnmarshalJSON(data []byte) error {
|
||||
strlist, err := serialjson.UnmarshalStringList(data)
|
||||
if err != nil {
|
||||
var strlist serial.StringLiteralList
|
||||
if err := json.Unmarshal(data, &strlist); err != nil {
|
||||
return err
|
||||
}
|
||||
*this = NewNetworkList(strlist)
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
package json
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func UnmarshalStringList(data []byte) ([]string, error) {
|
||||
var strarray []string
|
||||
if err := json.Unmarshal(data, &strarray); err == nil {
|
||||
return strarray, nil
|
||||
}
|
||||
|
||||
var rawstr string
|
||||
if err := json.Unmarshal(data, &rawstr); err == nil {
|
||||
strlist := strings.Split(rawstr, ",")
|
||||
return strlist, nil
|
||||
}
|
||||
return nil, errors.New("Unknown format of a string list: " + string(data))
|
||||
}
|
|
@ -1,5 +1,9 @@
|
|||
package serial
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// An interface for any objects that has string presentation.
|
||||
type String interface {
|
||||
String() string
|
||||
|
@ -7,6 +11,22 @@ type String interface {
|
|||
|
||||
type StringLiteral string
|
||||
|
||||
func NewStringLiteral(str String) StringLiteral {
|
||||
return StringLiteral(str.String())
|
||||
}
|
||||
|
||||
func (this StringLiteral) String() string {
|
||||
return string(this)
|
||||
}
|
||||
|
||||
func (this StringLiteral) ToLower() StringLiteral {
|
||||
return StringLiteral(strings.ToLower(string(this)))
|
||||
}
|
||||
|
||||
func (this StringLiteral) ToUpper() StringLiteral {
|
||||
return StringLiteral(strings.ToUpper(string(this)))
|
||||
}
|
||||
|
||||
func (this StringLiteral) TrimSpace() StringLiteral {
|
||||
return StringLiteral(strings.TrimSpace(string(this)))
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
package serial
|
||||
|
||||
type StringLiteralList []StringLiteral
|
||||
|
||||
func NewStringLiteralList(raw []string) *StringLiteralList {
|
||||
list := StringLiteralList(make([]StringLiteral, len(raw)))
|
||||
for idx, str := range raw {
|
||||
list[idx] = StringLiteral(str)
|
||||
}
|
||||
return &list
|
||||
}
|
||||
|
||||
func (this *StringLiteralList) Len() int {
|
||||
return len(*this)
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
// +build json
|
||||
|
||||
package serial
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (this *StringLiteralList) UnmarshalJSON(data []byte) error {
|
||||
var strarray []string
|
||||
if err := json.Unmarshal(data, &strarray); err == nil {
|
||||
*this = *NewStringLiteralList(strarray)
|
||||
return nil
|
||||
}
|
||||
|
||||
var rawstr string
|
||||
if err := json.Unmarshal(data, &rawstr); err == nil {
|
||||
strlist := strings.Split(rawstr, ",")
|
||||
*this = *NewStringLiteralList(strlist)
|
||||
return nil
|
||||
}
|
||||
return errors.New("Unknown format of a string list: " + string(data))
|
||||
}
|
Loading…
Reference in New Issue