diff --git a/model/proxy/proxy.go b/model/proxy/proxy.go index d1752a2..76599a9 100644 --- a/model/proxy/proxy.go +++ b/model/proxy/proxy.go @@ -1,6 +1,10 @@ package proxy -import "fmt" +import ( + "fmt" + + "gopkg.in/yaml.v3" +) type HTTPOptions struct { Method string `yaml:"method,omitempty"` @@ -144,7 +148,137 @@ func (p Proxy) MarshalYAML() (any, error) { Name: p.Name, Vmess: p.Vmess, }, nil + case "socks5": + return struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Socks `yaml:",inline"` + }{ + Type: p.Type, + Name: p.Name, + Socks: p.Socks, + }, nil default: return nil, fmt.Errorf("unsupported proxy type: %s", p.Type) } } + +func (p *Proxy) UnmarshalYAML(node *yaml.Node) error { + var temp struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + } + + if err := node.Decode(&temp); err != nil { + return err + } + + p.Type = temp.Type + p.Name = temp.Name + + switch temp.Type { + case "anytls": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Anytls `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Anytls = data.Anytls + + case "hysteria": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Hysteria `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Hysteria = data.Hysteria + + case "hysteria2": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Hysteria2 `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Hysteria2 = data.Hysteria2 + + case "ss": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + ShadowSocks `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.ShadowSocks = data.ShadowSocks + + case "ssr": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + ShadowSocksR `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.ShadowSocksR = data.ShadowSocksR + + case "trojan": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Trojan `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Trojan = data.Trojan + + case "vless": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Vless `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Vless = data.Vless + + case "vmess": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Vmess `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Vmess = data.Vmess + + case "socks5": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Socks `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Socks = data.Socks + + default: + return fmt.Errorf("unsupported proxy type: %s", temp.Type) + } + + return nil +} diff --git a/parser/socks.go b/parser/socks.go index 6efc36b..8a170e5 100644 --- a/parser/socks.go +++ b/parser/socks.go @@ -18,7 +18,7 @@ func (p *SocksParser) SupportMeta() bool { } func (p *SocksParser) GetPrefixes() []string { - return []string{"socks://"} + return []string{"socks://", "socks5://"} } func (p *SocksParser) GetType() string {