add link export for ss & trojan
This commit is contained in:
34
pkg/proxy/link_test.go
Normal file
34
pkg/proxy/link_test.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSSLink(t *testing.T) {
|
||||
ss, err := ParseSSLink("ss://YWVzLTI1Ni1jZmI6ZUlXMERuazY5NDU0ZTZuU3d1c3B2OURtUzIwMXRRMERAMTcyLjEwNC4xNjEuNTQ6ODA5OQ==#翻墙党223.13新加坡")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
fmt.Println(ss)
|
||||
fmt.Println(ss.Link())
|
||||
ss, err = ParseSSLink(ss.Link())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
fmt.Println(ss)
|
||||
}
|
||||
|
||||
func TestTrojanLink(t *testing.T) {
|
||||
trojan, err := ParseTrojanLink("trojan://65474277@sqcu.hostmsu.ru:55551?allowinsecure=0&peer=mza.hkfq.xyz&mux=1&ws=0&wspath=&wshost=&ss=0&ssmethod=aes-128-gcm&sspasswd=&group=#%E9%A6%99%E6%B8%AFCN2-MZA%E8%8A%82%E7%82%B9-%E5%AE%BF%E8%BF%81%E8%81%94%E9%80%9A%E4%B8%AD%E8%BD%AC")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
fmt.Println(trojan)
|
||||
fmt.Println(trojan.Link())
|
||||
trojan, err = ParseTrojanLink(trojan.Link())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
fmt.Println(trojan)
|
||||
}
|
||||
@@ -65,6 +65,13 @@ func (ss Shadowsocks) Clone() Proxy {
|
||||
return &ss
|
||||
}
|
||||
|
||||
// https://shadowsocks.org/en/config/quick-guide.html
|
||||
func (ss Shadowsocks) Link() (link string) {
|
||||
payload := fmt.Sprintf("%s:%s@%s:%d", ss.Cipher, ss.Password, ss.Server, ss.Port)
|
||||
payload = tool.Base64EncodeString(payload)
|
||||
return fmt.Sprintf("ss://%s#%s", payload, ss.Name)
|
||||
}
|
||||
|
||||
func ParseSSLink(link string) (*Shadowsocks, error) {
|
||||
if !strings.HasPrefix(link, "ss://") {
|
||||
return nil, ErrorNotSSRLink
|
||||
|
||||
@@ -66,6 +66,24 @@ func (t Trojan) Clone() Proxy {
|
||||
return &t
|
||||
}
|
||||
|
||||
// https://p4gefau1t.github.io/trojan-go/developer/url/
|
||||
func (t Trojan) Link() (link string) {
|
||||
query := url.Values{}
|
||||
if t.SNI != "" {
|
||||
query.Set("sni", url.QueryEscape(t.SNI))
|
||||
}
|
||||
|
||||
uri := url.URL{
|
||||
Scheme: "trojan",
|
||||
User: url.User(url.QueryEscape(t.Password)),
|
||||
Host: net.JoinHostPort(t.Server, strconv.Itoa(t.Port)),
|
||||
RawQuery: query.Encode(),
|
||||
Fragment: t.Name,
|
||||
}
|
||||
|
||||
return uri.String()
|
||||
}
|
||||
|
||||
func ParseTrojanLink(link string) (*Trojan, error) {
|
||||
if !strings.HasPrefix(link, "trojan://") && !strings.HasPrefix(link, "trojan-go://") {
|
||||
return nil, ErrorNotTrojanink
|
||||
|
||||
@@ -26,3 +26,7 @@ func Base64DecodeString(src string) (dst string, err error) {
|
||||
dst = string(dstbytes)
|
||||
return
|
||||
}
|
||||
|
||||
func Base64EncodeString(origin string) (result string) {
|
||||
return base64.StdEncoding.EncodeToString([]byte(origin))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user