Skip to content

Commit

Permalink
Merge pull request gooaclok819#13 from lay-g/main
Browse files Browse the repository at this point in the history
fix: resolve missing port in SS protocol
  • Loading branch information
gooaclok819 authored Oct 4, 2024
2 parents 7c3f742 + 0e82f2f commit d66d502
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 18 deletions.
42 changes: 24 additions & 18 deletions node/ss.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package node

import (
"fmt"
"log"
"net/url"
"strconv"
"strings"
Expand All @@ -27,26 +28,31 @@ func parsingSS(s string) (string, string, string) {
第二部分 为服务器地址和端口,格式为:服务器地址:端口 示例:xxx.xxx:12345
第三部分 为备注,格式为:#备注 示例:#备注
*/
s = strings.Replace(s, "ss://", "", 1)
addrIndex := strings.Index(s, "@")
NameIndex := strings.Index(s, "#")
var addr, name string
par := s
if NameIndex != -1 {
name, _ = url.QueryUnescape(s[NameIndex+1:])
par = s[:NameIndex]
u, err := url.Parse(s)
if err != nil {
log.Println("ss url parse fail.", err)
return "", "", ""
}

if addrIndex != -1 {
addr = s[addrIndex+1:]
par = s[:addrIndex]

} else {
addr = strings.Split(Base64Decode(par), "@")[1]
par = strings.Split(Base64Decode(par), "@")[0]
if u.Scheme != "ss" {
log.Println("ss url parse fail, not ss url.")
return "", "", ""
}
// 处理url全编码的情况
if u.User == nil {
// 截取ss://后的字符串
raw := s[5:]
s = "ss://" + Base64Decode(raw)
u, err = url.Parse(s)
}
var auth, addr, name string
auth = u.User.String()
if u.Host != "" {
addr = u.Host
}
if u.Fragment != "" {
name = u.Fragment
}
// log.Println(par, name, addr)
return par, addr, name
return auth, addr, name
}

// 开发者测试
Expand Down
46 changes: 46 additions & 0 deletions node/ss_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package node

import (
"fmt"
"testing"
)

func TestDecodeSSURL(t *testing.T) {
type args struct {
s string
}
tests := []struct {
name string
args args
want Ss
wantErr bool
}{
{
name: "ss",
args: args{
s: "ss://YWVzLTI1Ni1nY206NEhrdSt0Vk53SnFyblVZR2JycE95YkVhck03QmhxYmdhRTFxRk1JPQ==@127.0.0.1:34020?type=tcp#ocent-ss-ndptvd0p",
},
}, {
name: "ss2",
args: args{
s: "ss://YWVzLTI1Ni1jZmI6S1NYTmhuWnBqd0M2UGM2Q0A1NC4xNjkuMzUuMjI4OjMxNDQ0",
},
}, {
name: "no ss schema",
args: args{
s: "noss://YWVzLTI1Ni1jZmI6S1NYTmhuWnBqd0M2UGM2Q0A1NC4xNjkuMzUuMjI4OjMxNDQ0",
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := DecodeSSURL(tt.args.s)
if (err != nil) != tt.wantErr {
t.Errorf("DecodeSSURL() error = %v, wantErr %v", err, tt.wantErr)
return
}
fmt.Println(got)
})
}
}

0 comments on commit d66d502

Please sign in to comment.