Skip to content

Commit 965a24f

Browse files
committed
uploader: fix space unescape
1 parent cb9dd51 commit 965a24f

File tree

10 files changed

+315
-145
lines changed

10 files changed

+315
-145
lines changed

helper/escape/unescape.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package escape
2+
3+
import "strings"
4+
5+
func ishex(c byte) bool {
6+
switch {
7+
case '0' <= c && c <= '9':
8+
return true
9+
case 'a' <= c && c <= 'f':
10+
return true
11+
case 'A' <= c && c <= 'F':
12+
return true
13+
}
14+
return false
15+
}
16+
17+
func unhex(c byte) byte {
18+
switch {
19+
case '0' <= c && c <= '9':
20+
return c - '0'
21+
case 'a' <= c && c <= 'f':
22+
return c - 'a' + 10
23+
case 'A' <= c && c <= 'F':
24+
return c - 'A' + 10
25+
}
26+
return 0
27+
}
28+
29+
func isPercentEscape(s string, i int) bool {
30+
return i+2 < len(s) && ishex(s[i+1]) && ishex(s[i+2])
31+
}
32+
33+
// unescape unescapes a string; the mode specifies
34+
// which section of the URL string is being unescaped.
35+
func Unescape(s string) string {
36+
first := strings.IndexAny(s, "%+")
37+
if first == -1 {
38+
return s
39+
}
40+
var t strings.Builder
41+
t.Grow(len(s))
42+
t.WriteString(s[:first])
43+
44+
LOOP:
45+
for i := first; i < len(s); i++ {
46+
switch s[i] {
47+
case '%':
48+
if len(s) < i+3 {
49+
t.WriteString(s[i:])
50+
break LOOP
51+
}
52+
if !isPercentEscape(s, i) {
53+
t.WriteString(s[i : i+3])
54+
} else {
55+
t.WriteByte(unhex(s[i+1])<<4 | unhex(s[i+2]))
56+
}
57+
i += 2
58+
case '+':
59+
t.WriteByte(' ')
60+
default:
61+
t.WriteByte(s[i])
62+
}
63+
}
64+
65+
return t.String()
66+
}

helper/escape/unescape_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package escape
2+
3+
import (
4+
"strconv"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func Test_unescape(t *testing.T) {
11+
var tests = []struct {
12+
in string
13+
want string
14+
}{
15+
{
16+
"", ""},
17+
{"abc", "abc"},
18+
{"1%41", "1A"},
19+
{"1%41%42%43", "1ABC"},
20+
{"%4a", "J"},
21+
{"%6F", "o"},
22+
{
23+
"%", // not enough characters after %
24+
"%",
25+
},
26+
{
27+
"%a", // not enough characters after %
28+
"%a",
29+
},
30+
{
31+
"%1", // not enough characters after %
32+
"%1",
33+
},
34+
{
35+
"123%45%6", // not enough characters after %
36+
"123E%6",
37+
},
38+
{
39+
"%zzzzz", // invalid hex digits
40+
"%zzzzz",
41+
},
42+
{"a+b", "a b"},
43+
{"a+%3D+b", "a = b"},
44+
}
45+
46+
for i, tt := range tests {
47+
t.Run("["+strconv.Itoa(i)+"] "+tt.in, func(t *testing.T) {
48+
assert := assert.New(t)
49+
50+
got := Unescape(tt.in)
51+
assert.Equal(tt.want, got)
52+
})
53+
}
54+
}
55+
56+
func Test_Query_Unescape(t *testing.T) {
57+
var tests = []struct {
58+
in string
59+
wantEscape string
60+
}{
61+
{"", ""},
62+
{"abc", "abc"},
63+
{"%", "%25"},
64+
{"%a", "%25a"},
65+
{"a+b", "a%2Bb"},
66+
{"a b", "a+b"},
67+
{"a = b", "a+%3D+b"},
68+
}
69+
70+
for i, tt := range tests {
71+
t.Run("["+strconv.Itoa(i)+"] "+tt.in, func(t *testing.T) {
72+
gotEscape := Query(tt.in)
73+
if tt.wantEscape != gotEscape {
74+
t.Fatalf("Query(%q) = %q, want %q", tt.in, gotEscape, tt.wantEscape)
75+
}
76+
gotUnescape := Unescape(gotEscape)
77+
if tt.in != gotUnescape {
78+
t.Fatalf("Unescape(%q) = %q, want %q", gotEscape, gotUnescape, tt.in)
79+
}
80+
})
81+
}
82+
}

receiver/receiver.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,8 @@ func New(dsn string, config tags.TagConfig, opts ...Option) (Receiver, error) {
119119
}
120120

121121
return r, err
122-
}
123122

124-
if u.Scheme == "pickle" {
123+
} else if u.Scheme == "pickle" {
125124
addr, err := net.ResolveTCPAddr("tcp", u.Host)
126125
if err != nil {
127126
return nil, err
@@ -137,9 +136,8 @@ func New(dsn string, config tags.TagConfig, opts ...Option) (Receiver, error) {
137136
}
138137

139138
return r, err
140-
}
141139

142-
if u.Scheme == "udp" {
140+
} else if u.Scheme == "udp" {
143141
addr, err := net.ResolveUDPAddr("udp", u.Host)
144142
if err != nil {
145143
return nil, err
@@ -155,9 +153,8 @@ func New(dsn string, config tags.TagConfig, opts ...Option) (Receiver, error) {
155153
}
156154

157155
return r, err
158-
}
159156

160-
if u.Scheme == "grpc" {
157+
} else if u.Scheme == "grpc" {
161158
addr, err := net.ResolveTCPAddr("tcp", u.Host)
162159
if err != nil {
163160
return nil, err
@@ -172,9 +169,8 @@ func New(dsn string, config tags.TagConfig, opts ...Option) (Receiver, error) {
172169
}
173170

174171
return r, err
175-
}
176172

177-
if u.Scheme == "prometheus" {
173+
} else if u.Scheme == "prometheus" {
178174
addr, err := net.ResolveTCPAddr("tcp", u.Host)
179175
if err != nil {
180176
return nil, err
@@ -189,9 +185,8 @@ func New(dsn string, config tags.TagConfig, opts ...Option) (Receiver, error) {
189185
}
190186

191187
return r, err
192-
}
193188

194-
if u.Scheme == "telegraf+http+json" {
189+
} else if u.Scheme == "telegraf+http+json" {
195190
addr, err := net.ResolveTCPAddr("tcp", u.Host)
196191
if err != nil {
197192
return nil, err

receiver/tcp_test.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,37 +47,32 @@ func TestTCP(t *testing.T) {
4747
Value: 1.0,
4848
Timestamp: 1559465760,
4949
Days: 18049,
50-
Version: now,
5150
},
5251
{
5352
Path: "carbon.agents.carbon-clickhouse.writer.writtenBytes",
5453
Value: 2.0,
5554
Timestamp: 1559465800,
5655
Days: 18049,
57-
Version: now,
5856
},
5957
{
6058
Path: "carbon.agents.carbon-clickhouse.tcp.receiver.errors",
6159
Value: 2.0,
6260
Timestamp: 1559465800,
6361
Days: 18049,
64-
Version: now,
6562
},
6663
{
6764
// next day
6865
Path: "carbon.agents.carbon-clickhouse.tcp.receiver.errors",
6966
Value: 1.0,
7067
Timestamp: 1662098177,
7168
Days: 19237,
72-
Version: now,
7369
},
7470
{
7571
// tagged metric
7672
Path: "errors?app=carbon-clickhouse&scope=tcp",
7773
Value: 1.0,
7874
Timestamp: 1662098177,
7975
Days: 19237,
80-
Version: now,
8176
},
8277
}
8378
for _, p := range points_part1 {
@@ -96,7 +91,6 @@ func TestTCP(t *testing.T) {
9691
Value: 2.0,
9792
Timestamp: 1662098177,
9893
Days: 19237,
99-
Version: now + 1,
10094
}
10195
pointToBuf(&sb, &points_part3)
10296

@@ -106,37 +100,32 @@ func TestTCP(t *testing.T) {
106100
Value: 1.1,
107101
Timestamp: 1559465761,
108102
Days: 18049,
109-
Version: now + 1,
110103
},
111104
{
112105
Path: "carbon.agents.carbon-clickhouse.writer.writtenBytes",
113106
Value: 2.1,
114107
Timestamp: 1559465801,
115108
Days: 18049,
116-
Version: now + 1,
117109
},
118110
{
119111
Path: "carbon.agents.carbon-clickhouse.tcp.receiver.errors",
120112
Value: 2.1,
121113
Timestamp: 1559465801,
122114
Days: 18049,
123-
Version: now + 1,
124115
},
125116
{
126117
// next day
127118
Path: "carbon.agents.carbon-clickhouse.tcp.receiver.errors",
128119
Value: 1.1,
129120
Timestamp: 1662098178,
130121
Days: 19237,
131-
Version: now + 1,
132122
},
133123
{
134124
// tagged metric
135125
Path: "errors?app=carbon-clickhouse&scope=tcp",
136126
Value: 1.1,
137127
Timestamp: 1662098178,
138128
Days: 19237,
139-
Version: now + 1,
140129
},
141130
}
142131
for _, p := range points_part4 {
@@ -207,5 +196,5 @@ func TestTCP(t *testing.T) {
207196
cancel()
208197
wg.Wait()
209198

210-
verifyIndexUploaded(t, &rawBuf, wantPoints)
199+
verifyIndexUploaded(t, &rawBuf, wantPoints, now, uint32(time.Now().Unix()))
211200
}

0 commit comments

Comments
 (0)