Implement YAML unmarshalling for various proxy types and update SOCKS parser to support "socks5" prefix.

This commit is contained in:
2025-07-15 20:14:37 +08:00
parent a178d06248
commit 83a728a415
2 changed files with 136 additions and 2 deletions

View File

@@ -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
}

View File

@@ -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 {