@@ -94,12 +94,12 @@ class UrlParser
94
94
path_ = std::string (" /" ); // use default path
95
95
if (is_port)
96
96
{
97
- auto port_str = url_.substr (cpos, url_. length () );
97
+ auto port_str = url_.substr (cpos);
98
98
port_ = GetPort (port_str);
99
99
}
100
100
else
101
101
{
102
- host_ = url_.substr (cpos, url_. length () );
102
+ host_ = url_.substr (cpos);
103
103
}
104
104
return ;
105
105
}
@@ -119,21 +119,20 @@ class UrlParser
119
119
pos = url_.find (' ?' , cpos);
120
120
if (pos == std::string::npos)
121
121
{
122
- path_ = url_.substr (cpos, url_.length ());
123
- query_ = " " ;
122
+ path_ = url_.substr (cpos);
124
123
}
125
124
else
126
125
{
127
126
path_ = url_.substr (cpos, pos - cpos);
128
127
cpos = pos + 1 ;
129
- query_ = url_.substr (cpos, url_. length () );
128
+ query_ = url_.substr (cpos);
130
129
}
131
130
return ;
132
131
}
133
132
path_ = std::string (" /" );
134
133
if (url_[cpos] == ' ?' )
135
134
{
136
- query_ = url_.substr (cpos, url_. length () );
135
+ query_ = url_.substr (cpos);
137
136
}
138
137
}
139
138
@@ -207,16 +206,23 @@ class UrlDecoder
207
206
for (size_t pos = 0 ; pos < encoded.size (); pos++)
208
207
{
209
208
auto c = encoded[pos];
210
- if (c == ' %' && pos + 2 < encoded. size () )
209
+ if (c == ' %' )
211
210
{
211
+ if (pos + 2 >= encoded.size ())
212
+ {
213
+ return encoded;
214
+ }
215
+
212
216
int hi = hex_to_int (encoded[pos + 1 ]);
213
217
int lo = hex_to_int (encoded[pos + 2 ]);
214
218
215
- if (hi != -1 && lo ! = -1 )
219
+ if (hi == -1 || lo = = -1 )
216
220
{
217
- c = static_cast <char >((hi << 4 ) | lo);
218
- pos += 2 ;
221
+ return encoded;
219
222
}
223
+
224
+ c = static_cast <char >((hi << 4 ) | lo);
225
+ pos += 2 ;
220
226
}
221
227
222
228
result.push_back (c);
0 commit comments