mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-10-26 17:14:24 +00:00
Implement YAML unmarshalling for various proxy types and update SOCKS parser to support "socks5" prefix.
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
type HTTPOptions struct {
|
type HTTPOptions struct {
|
||||||
Method string `yaml:"method,omitempty"`
|
Method string `yaml:"method,omitempty"`
|
||||||
@@ -144,7 +148,137 @@ func (p Proxy) MarshalYAML() (any, error) {
|
|||||||
Name: p.Name,
|
Name: p.Name,
|
||||||
Vmess: p.Vmess,
|
Vmess: p.Vmess,
|
||||||
}, nil
|
}, 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:
|
default:
|
||||||
return nil, fmt.Errorf("unsupported proxy type: %s", p.Type)
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func (p *SocksParser) SupportMeta() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *SocksParser) GetPrefixes() []string {
|
func (p *SocksParser) GetPrefixes() []string {
|
||||||
return []string{"socks://"}
|
return []string{"socks://", "socks5://"}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SocksParser) GetType() string {
|
func (p *SocksParser) GetType() string {
|
||||||
|
|||||||
Reference in New Issue
Block a user