v2rayA / shadowsocksR

ShadowsocksR(SSR) library for Go. Deprecated. Use https://github.com/mzz2017/softwind/tree/main/transport/shadowsocksr instead.
MIT License
101 stars 38 forks source link

希望文档再完善一下 #3

Closed horsley closed 4 years ago

horsley commented 4 years ago
  1. example中的链接为非标准ssr url格式,库可以提供从标准url转换的方法

  2. 我写了这个转换方法,但是测试不通过,http get 均出现EOF,有否调试方法?

  3. obfs param/ protocol param没有标注是否提供原值/b64值

horsley commented 4 years ago

补充,调试已经找到了问题,从标准链接转过来 obfs param/protocal param/password 都需要b64解码

func convertDialerURL(stdSSRLink string) string {
    if strings.HasPrefix(stdSSRLink, "ssr://") {
        stdSSRLink = stdSSRLink[6:]
    }

    stdSSRLink = ssrB64Decode(stdSSRLink)
    parts := strings.Split(stdSSRLink, "/?")
    basicParams := strings.Split(parts[0], ":")
    extraParams, _ := url.ParseQuery(parts[1])

    //标准格式 server:server_port:protocol:method:obfs:password/?obfsparam=obfs_param&protoparam=protocol_param

    //dailer 使用如下格式
    //"ssr://rc4-md5:xxxxx@xxxxx:51954?obfs=plain&obfs_param=&protocol=origin&protocol_param="
    dialerParam := make(url.Values)
    dialerParam.Set("obfs", basicParams[4])
    dialerParam.Set("obfs_param", ssrB64Decode(extraParams.Get("obfsparam")))
    dialerParam.Set("protocol", basicParams[2])
    dialerParam.Set("protocol_param", extraParams.Get("protoparam"))

    return fmt.Sprintf("ssr://%s:%s@%s:%s?%s",
        basicParams[3],               //method
        url.QueryEscape(ssrB64Decode(basicParams[5])), //pwd
        basicParams[0],               //svr
        basicParams[1],               //port
        dialerParam.Encode(),
    )
}

func ssrB64Decode(origin string) string {
    padLen := 4 - len(origin)%4
    origin += strings.Repeat("=", padLen)
    d, _ := base64.URLEncoding.DecodeString(origin)
    return string(d)
}
mzz2017 commented 4 years ago

已补充,谢谢