@@ -18,7 +18,6 @@ import (
18
18
"flag"
19
19
"fmt"
20
20
"io"
21
- "net/url"
22
21
"os"
23
22
"os/signal"
24
23
"strings"
@@ -69,7 +68,7 @@ func main() {
69
68
args .proxyPort = flag .Int ("proxyPort" , 0 , "Shadowsocks proxy port number" )
70
69
args .proxyPassword = flag .String ("proxyPassword" , "" , "Shadowsocks proxy password" )
71
70
args .proxyCipher = flag .String ("proxyCipher" , "chacha20-ietf-poly1305" , "Shadowsocks proxy encryption cipher" )
72
- args .proxyPrefix = flag .String ("proxyPrefix" , "" , "Shadowsocks connection prefix, URI -encoded (unsafe)" )
71
+ args .proxyPrefix = flag .String ("proxyPrefix" , "" , "Shadowsocks connection prefix, UTF8 -encoded (unsafe)" )
73
72
args .logLevel = flag .String ("logLevel" , "info" , "Logging level: debug|info|warn|error|none" )
74
73
args .dnsFallback = flag .Bool ("dnsFallback" , false , "Enable DNS fallback over TCP (overrides the UDP handler)." )
75
74
args .checkConnectivity = flag .Bool ("checkConnectivity" , false , "Check the proxy TCP and UDP connectivity and exit." )
@@ -99,18 +98,25 @@ func main() {
99
98
os .Exit (oss .IllegalConfiguration )
100
99
}
101
100
102
- prefix , err := url .PathUnescape (* args .proxyPrefix )
103
- if err != nil {
104
- log .Errorf ("\" %s\" could not be URI-decoded" , * args .proxyPrefix )
105
- os .Exit (oss .IllegalConfiguration )
106
- }
107
101
config := oss.Config {
108
102
Host : * args .proxyHost ,
109
103
Port : * args .proxyPort ,
110
104
Password : * args .proxyPassword ,
111
105
CipherName : * args .proxyCipher ,
112
- Prefix : []byte (prefix ),
113
106
}
107
+
108
+ // The prefix is an 8-bit-clean byte sequence, stored in the codepoint
109
+ // values of a unicode string, which arrives here encoded in UTF-8.
110
+ prefixRunes := []rune (* args .proxyPrefix )
111
+ config .Prefix = make ([]byte , len (prefixRunes ))
112
+ for i , r := range prefixRunes {
113
+ if (r & 0xFF ) != r {
114
+ log .Errorf ("Character out of range: %r" , r )
115
+ os .Exit (oss .IllegalConfiguration )
116
+ }
117
+ config .Prefix [i ] = byte (r )
118
+ }
119
+
114
120
client , err := oss .NewClient (& config )
115
121
if err != nil {
116
122
log .Errorf ("Failed to construct Shadowsocks client: %v" , err )
0 commit comments