Compare commits

...

3 Commits

Author SHA1 Message Date
1235c9a939 Fix: Direct & Reject name 2018-10-19 20:28:19 +08:00
82343c70e9 Fix: chacha20 cipher in shadowsocks 2018-10-19 19:11:26 +08:00
94d1972782 Fix: selector no longer randomly selects 2018-10-18 23:24:04 +08:00
7 changed files with 42 additions and 34 deletions

View File

@ -24,7 +24,7 @@ func (d *DirectAdapter) Conn() net.Conn {
type Direct struct{} type Direct struct{}
func (d *Direct) Name() string { func (d *Direct) Name() string {
return "Direct" return "DIRECT"
} }
func (d *Direct) Type() C.AdapterType { func (d *Direct) Type() C.AdapterType {

View File

@ -25,7 +25,7 @@ type Reject struct {
} }
func (r *Reject) Name() string { func (r *Reject) Name() string {
return "Reject" return "REJECT"
} }
func (r *Reject) Type() C.AdapterType { func (r *Reject) Type() C.AdapterType {

View File

@ -52,21 +52,20 @@ func (s *Selector) Set(name string) error {
return nil return nil
} }
func NewSelector(name string, proxies map[string]C.Proxy) (*Selector, error) { func NewSelector(name string, proxies []C.Proxy) (*Selector, error) {
if len(proxies) == 0 { if len(proxies) == 0 {
return nil, errors.New("Provide at least one proxy") return nil, errors.New("Provide at least one proxy")
} }
mapping := make(map[string]C.Proxy) mapping := make(map[string]C.Proxy)
var init string for _, proxy := range proxies {
for k, v := range proxies { mapping[proxy.Name()] = proxy
mapping[k] = v
init = k
} }
s := &Selector{ s := &Selector{
name: name, name: name,
proxies: mapping, proxies: mapping,
selected: proxies[init], selected: proxies[0],
} }
return s, nil return s, nil
} }

View File

@ -312,13 +312,9 @@ func (c *Config) parseProxies(cfg *RawConfig) error {
break break
} }
var ps []C.Proxy ps, err := getProxies(proxies, urlTestOption.Proxies)
for _, name := range urlTestOption.Proxies { if err != nil {
p, ok := proxies[name] return fmt.Errorf("ProxyGroup %s: %s", groupName, err.Error())
if !ok {
return fmt.Errorf("ProxyGroup %s: proxy or proxy group '%s' not found", groupName, name)
}
ps = append(ps, p)
} }
group, err = adapters.NewURLTest(*urlTestOption, ps) group, err = adapters.NewURLTest(*urlTestOption, ps)
case "select": case "select":
@ -327,28 +323,22 @@ func (c *Config) parseProxies(cfg *RawConfig) error {
if err != nil { if err != nil {
break break
} }
selectProxy := make(map[string]C.Proxy)
for _, name := range selectorOption.Proxies { ps, err := getProxies(proxies, selectorOption.Proxies)
proxy, exist := proxies[name] if err != nil {
if !exist { return fmt.Errorf("ProxyGroup %s: %s", groupName, err.Error())
return fmt.Errorf("ProxyGroup %s: proxy or proxy group '%s' not found", groupName, name)
} }
selectProxy[name] = proxy group, err = adapters.NewSelector(selectorOption.Name, ps)
}
group, err = adapters.NewSelector(selectorOption.Name, selectProxy)
case "fallback": case "fallback":
fallbackOption := &adapters.FallbackOption{} fallbackOption := &adapters.FallbackOption{}
err = decoder.Decode(mapping, fallbackOption) err = decoder.Decode(mapping, fallbackOption)
if err != nil { if err != nil {
break break
} }
var ps []C.Proxy
for _, name := range fallbackOption.Proxies { ps, err := getProxies(proxies, fallbackOption.Proxies)
p, ok := proxies[name] if err != nil {
if !ok { return fmt.Errorf("ProxyGroup %s: %s", groupName, err.Error())
return fmt.Errorf("ProxyGroup %s: proxy or proxy group '%s' not found", groupName, name)
}
ps = append(ps, p)
} }
group, err = adapters.NewFallback(*fallbackOption, ps) group, err = adapters.NewFallback(*fallbackOption, ps)
} }
@ -358,7 +348,12 @@ func (c *Config) parseProxies(cfg *RawConfig) error {
proxies[groupName] = group proxies[groupName] = group
} }
proxies["GLOBAL"], _ = adapters.NewSelector("GLOBAL", proxies) var ps []C.Proxy
for _, v := range proxies {
ps = append(ps, v)
}
proxies["GLOBAL"], _ = adapters.NewSelector("GLOBAL", ps)
// close old goroutine // close old goroutine
for _, proxy := range c.proxies { for _, proxy := range c.proxies {

View File

@ -3,6 +3,8 @@ package config
import ( import (
"fmt" "fmt"
"strings" "strings"
C "github.com/Dreamacro/clash/constant"
) )
func trimArr(arr []string) (r []string) { func trimArr(arr []string) (r []string) {
@ -19,6 +21,18 @@ func genAddr(port int, allowLan bool) string {
return fmt.Sprintf("127.0.0.1:%d", port) return fmt.Sprintf("127.0.0.1:%d", port)
} }
func getProxies(mapping map[string]C.Proxy, list []string) ([]C.Proxy, error) {
var ps []C.Proxy
for _, name := range list {
p, ok := mapping[name]
if !ok {
return nil, fmt.Errorf("'%s' not found", name)
}
ps = append(ps, p)
}
return ps, nil
}
func or(pointers ...*int) *int { func or(pointers ...*int) *int {
for _, p := range pointers { for _, p := range pointers {
if p != nil { if p != nil {

2
go.mod
View File

@ -1,7 +1,7 @@
module github.com/Dreamacro/clash module github.com/Dreamacro/clash
require ( require (
github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181016063207-89bf7cffdaf4 github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181019110427-0a03f1a25270
github.com/eapache/queue v1.1.0 // indirect github.com/eapache/queue v1.1.0 // indirect
github.com/go-chi/chi v3.3.3+incompatible github.com/go-chi/chi v3.3.3+incompatible
github.com/go-chi/cors v1.0.0 github.com/go-chi/cors v1.0.0

4
go.sum
View File

@ -1,5 +1,5 @@
github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181016063207-89bf7cffdaf4 h1:n+F4LoHdFCwsGohVN+4dwfmmx0h2uvdPEeiwdhFeH8g= github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181019110427-0a03f1a25270 h1:ugkI+Yw5ArFnhF8KTbJxyWIyvxMCa8jWyUF+wIAulhM=
github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181016063207-89bf7cffdaf4/go.mod h1:DlkXRxmh5K+99aTPQaVjsZ1fAZNFw42vXGcOjR3Otps= github.com/Dreamacro/go-shadowsocks2 v0.1.2-0.20181019110427-0a03f1a25270/go.mod h1:DlkXRxmh5K+99aTPQaVjsZ1fAZNFw42vXGcOjR3Otps=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=