fix: do not percent encode character tilde (#2139)
This commit is contained in:
@ -438,7 +438,7 @@ func decodeTimeout(s string) (time.Duration, error) {
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
spaceByte = ' '
|
spaceByte = ' '
|
||||||
tildaByte = '~'
|
tildeByte = '~'
|
||||||
percentByte = '%'
|
percentByte = '%'
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -456,7 +456,7 @@ func encodeGrpcMessage(msg string) string {
|
|||||||
lenMsg := len(msg)
|
lenMsg := len(msg)
|
||||||
for i := 0; i < lenMsg; i++ {
|
for i := 0; i < lenMsg; i++ {
|
||||||
c := msg[i]
|
c := msg[i]
|
||||||
if !(c >= spaceByte && c < tildaByte && c != percentByte) {
|
if !(c >= spaceByte && c <= tildeByte && c != percentByte) {
|
||||||
return encodeGrpcMessageUnchecked(msg)
|
return encodeGrpcMessageUnchecked(msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -478,7 +478,7 @@ func encodeGrpcMessageUnchecked(msg string) string {
|
|||||||
// utf8.RuneError.
|
// utf8.RuneError.
|
||||||
//
|
//
|
||||||
// fmt.Sprintf("%%%02X", utf8.RuneError) gives "%FFFD".
|
// fmt.Sprintf("%%%02X", utf8.RuneError) gives "%FFFD".
|
||||||
if b >= spaceByte && b < tildaByte && b != percentByte {
|
if b >= spaceByte && b <= tildeByte && b != percentByte {
|
||||||
buf.WriteByte(b)
|
buf.WriteByte(b)
|
||||||
} else {
|
} else {
|
||||||
buf.WriteString(fmt.Sprintf("%%%02X", b))
|
buf.WriteString(fmt.Sprintf("%%%02X", b))
|
||||||
|
@ -112,6 +112,23 @@ func TestEncodeGrpcMessage(t *testing.T) {
|
|||||||
t.Errorf("encodeGrpcMessage(%q) = %q, want %q", tt.input, actual, tt.expected)
|
t.Errorf("encodeGrpcMessage(%q) = %q, want %q", tt.input, actual, tt.expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure that all the visible ASCII chars except '%' are not percent encoded.
|
||||||
|
for i := ' '; i <= '~' && i != '%'; i++ {
|
||||||
|
output := encodeGrpcMessage(string(i))
|
||||||
|
if output != string(i) {
|
||||||
|
t.Errorf("encodeGrpcMessage(%v) = %v, want %v", string(i), output, string(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure that all the invisible ASCII chars and '%' are percent encoded.
|
||||||
|
for i := rune(0); i == '%' || (i >= rune(0) && i < ' ') || (i > '~' && i <= rune(127)); i++ {
|
||||||
|
output := encodeGrpcMessage(string(i))
|
||||||
|
expected := fmt.Sprintf("%%%02X", i)
|
||||||
|
if output != expected {
|
||||||
|
t.Errorf("encodeGrpcMessage(%v) = %v, want %v", string(i), output, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDecodeGrpcMessage(t *testing.T) {
|
func TestDecodeGrpcMessage(t *testing.T) {
|
||||||
@ -129,7 +146,23 @@ func TestDecodeGrpcMessage(t *testing.T) {
|
|||||||
} {
|
} {
|
||||||
actual := decodeGrpcMessage(tt.input)
|
actual := decodeGrpcMessage(tt.input)
|
||||||
if tt.expected != actual {
|
if tt.expected != actual {
|
||||||
t.Errorf("dncodeGrpcMessage(%q) = %q, want %q", tt.input, actual, tt.expected)
|
t.Errorf("decodeGrpcMessage(%q) = %q, want %q", tt.input, actual, tt.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure that all the visible ASCII chars except '%' are not percent decoded.
|
||||||
|
for i := ' '; i <= '~' && i != '%'; i++ {
|
||||||
|
output := decodeGrpcMessage(string(i))
|
||||||
|
if output != string(i) {
|
||||||
|
t.Errorf("decodeGrpcMessage(%v) = %v, want %v", string(i), output, string(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure that all the invisible ASCII chars and '%' are percent decoded.
|
||||||
|
for i := rune(0); i == '%' || (i >= rune(0) && i < ' ') || (i > '~' && i <= rune(127)); i++ {
|
||||||
|
output := decodeGrpcMessage(fmt.Sprintf("%%%02X", i))
|
||||||
|
if output != string(i) {
|
||||||
|
t.Errorf("decodeGrpcMessage(%v) = %v, want %v", fmt.Sprintf("%%%02X", i), output, string(i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user