@@ -35,71 +35,49 @@ static inline int hex2int(char ch, int errorValue = 0) {
35
35
return errorValue;
36
36
}
37
37
38
- std::string urlEncode ( char const * src, size_t const len) {
38
+ void urlEncode ( std::string& out, char const * src, size_t len) {
39
39
static char hexChars[16 ] = {' 0' , ' 1' , ' 2' , ' 3' , ' 4' , ' 5' , ' 6' , ' 7' ,
40
40
' 8' , ' 9' , ' A' , ' B' , ' C' , ' D' , ' E' , ' F' };
41
41
42
- char const * end = src + len;
43
-
44
42
if (len >= (SIZE_MAX - 1 ) / 3 ) {
45
43
throw std::overflow_error (" out of memory" );
46
44
}
47
45
48
- std::string result;
49
- result.reserve (3 * len);
46
+ out.reserve (out.size () + 3 * len);
50
47
48
+ char const * end = src + len;
51
49
for (; src < end; ++src) {
52
50
if (' 0' <= *src && *src <= ' 9' ) {
53
- result.push_back (*src);
54
- }
55
-
56
- else if (' a' <= *src && *src <= ' z' ) {
57
- result.push_back (*src);
58
- }
59
-
60
- else if (' A' <= *src && *src <= ' Z' ) {
61
- result.push_back (*src);
62
- }
63
-
64
- else if (*src == ' -' || *src == ' _' || *src == ' ~' ) {
65
- result.push_back (*src);
66
- }
67
-
68
- else {
51
+ out.push_back (*src);
52
+ } else if (' a' <= *src && *src <= ' z' ) {
53
+ out.push_back (*src);
54
+ } else if (' A' <= *src && *src <= ' Z' ) {
55
+ out.push_back (*src);
56
+ } else if (*src == ' -' || *src == ' _' || *src == ' ~' ) {
57
+ out.push_back (*src);
58
+ } else {
69
59
uint8_t n = (uint8_t )(*src);
70
60
uint8_t n1 = n >> 4 ;
71
61
uint8_t n2 = n & 0x0F ;
72
62
73
- result .push_back (' %' );
74
- result .push_back (hexChars[n1]);
75
- result .push_back (hexChars[n2]);
63
+ out .push_back (' %' );
64
+ out .push_back (hexChars[n1]);
65
+ out .push_back (hexChars[n2]);
76
66
}
77
67
}
78
-
79
- return result;
80
68
}
81
69
82
- std::string urlEncode (char const * src) {
83
- if (src != nullptr ) {
84
- size_t len = strlen (src);
85
- return urlEncode (src, len);
86
- }
87
- return " " ;
88
- }
89
-
90
- std::string urlDecode (std::string const & str) {
91
- std::string result;
70
+ void urlDecode (std::string& out, char const * src, size_t len) {
92
71
// reserve enough room so we do not need to re-alloc
93
- result .reserve (str .size () + 16 );
72
+ out .reserve (out .size () + len + 16 );
94
73
95
- char const * src = str.c_str ();
96
- char const * end = src + str.size ();
74
+ char const * end = src + len;
97
75
98
76
for (; src < end && *src != ' %' ; ++src) {
99
77
if (*src == ' +' ) {
100
- result .push_back (' ' );
78
+ out .push_back (' ' );
101
79
} else {
102
- result .push_back (*src);
80
+ out .push_back (*src);
103
81
}
104
82
}
105
83
@@ -112,10 +90,10 @@ std::string urlDecode(std::string const& str) {
112
90
src += 1 ;
113
91
} else {
114
92
if (h2 == -1 ) {
115
- result .push_back (h1);
93
+ out .push_back (h1);
116
94
src += 2 ;
117
95
} else {
118
- result .push_back (h1 << 4 | h2);
96
+ out .push_back (h1 << 4 | h2);
119
97
src += 3 ;
120
98
}
121
99
}
@@ -125,7 +103,7 @@ std::string urlDecode(std::string const& str) {
125
103
if (h1 == -1 ) {
126
104
src += 1 ;
127
105
} else {
128
- result .push_back (h1);
106
+ out .push_back (h1);
129
107
src += 2 ;
130
108
}
131
109
} else {
@@ -134,13 +112,11 @@ std::string urlDecode(std::string const& str) {
134
112
135
113
for (; src < end && *src != ' %' ; ++src) {
136
114
if (*src == ' +' ) {
137
- result .push_back (' ' );
115
+ out .push_back (' ' );
138
116
} else {
139
- result .push_back (*src);
117
+ out .push_back (*src);
140
118
}
141
119
}
142
120
}
143
-
144
- return result;
145
121
}
146
122
}}}} // namespace arangodb::fuerte::v1::http
0 commit comments