46 if (
host_.size() ) ss <<
"//";
57 return std::isalpha(c) ||
65 return std::isalpha(c) ||
74 return ( ( c >=
'a' && c <=
'f' ) || ( c >=
'A' && c <=
'F' ) ) ||
111 uint16_t prev_state, return_state, state;
115 prev_state = psError;
116 return_state = psError;
117 state = psSchemeStart;
118 while ( state != psDone && state != psError && idx < s.size() ) {
123 if ( prev_state != psSchemeStart && !std::isalpha(s[idx] ) ) state = psError;
124 else if ( ( s[idx] ) ==
':' ) state = psSchemeEnd;
else {
130 scheme_ = s.substr(mark,idx-mark);
133 if ( s[idx] ==
'/' ) {
135 if ( s[idx] ==
'/' ) {
137 state = psAuthorityStart;
138 }
else state = psError;
145 case psAuthorityStart:
146 if ( s[idx] ==
'@' ) {
147 state = psUserInfoEnd;
148 }
else if ( s[idx] ==
'/' ) {
150 }
else if ( s[idx] ==
':' ) {
152 }
else if ( s[idx] ==
'[' ) {
155 }
else if ( s[idx] ==
'%' ) {
156 return_state = state;
157 state = psPCTEncoded;
161 }
else state = psError;
171 }
else state = psError;
175 if ( s[idx] ==
'[' ) {
179 else if ( s[idx] ==
':' || s[idx] ==
'/' ) state = psHostEnd;
181 else if ( s[idx] ==
'%' ) {
182 return_state = state;
183 state = psPCTEncoded;
185 else state = psError;
189 if ( s[idx] ==
']' ) {
194 else state = psError;
199 host_ = s.substr(mark,idx-mark);
201 if ( s[idx] ==
':' ) {
208 }
else state = psError;
212 if ( ! std::isdigit( s[idx] ) ) state = psPortEnd;
else idx++;
217 port_ = s.substr(mark,idx-mark);
221 }
else state = psError;
225 if ( s[idx] ==
'?' ) state = psPathEnd;
226 else if ( s[idx] ==
'#' ) state = psPathEnd;
228 else if ( s[idx] ==
'%' ) {
229 return_state = state;
230 state = psPCTEncoded;
231 }
else state = psError;
236 path_ = s.substr(mark,idx-mark);
238 if ( s[idx] ==
'?' ) state = psQueryStart;
239 else if ( s[idx] ==
'#' ) state = psFragmentStart;
241 }
else state = psError;
248 else if ( s[idx] ==
'%' ) {
249 return_state = state;
250 state = psPCTEncoded;
252 else state = psError;
257 query_ = s.substr(mark,idx-mark);
259 state = psFragmentStart;
261 }
else state = psError;
264 case psFragmentStart:
266 else if ( s[idx] ==
'%' ) {
267 return_state = state;
268 state = psPCTEncoded;
270 else state = psError;
274 if ( s[idx] ==
'%' ) {
276 if ( idx < s.size() && std::isxdigit( s[idx] ) ) {
278 if ( idx < s.size() && std::isxdigit( s[idx] ) ) {
280 state = return_state;
281 }
else state = psError;
282 }
else state = psError;
283 }
else state = psError;
293 case psAuthorityStart:
294 host_ = s.substr(mark,s.size()-mark);
298 path_ = s.substr(mark,s.size()-mark);
302 query_ = s.substr(mark,s.size()-mark);
305 case psFragmentStart:
306 fragment_ = s.substr(mark,s.size()-mark);
310 return state != psError;