@@ -15,13 +15,13 @@ void Url::remove_all_chars(std::string& target, char remove) {
15
15
target.erase (it, target.end ());
16
16
}
17
17
18
- void Url::parse_key_optional_value_list (
19
- KeyOptionalValueData& target, std::string forbidden_chars,
20
- std::string delimiter) {
18
+ std::vector<KeyOptionalValue> Url::parse_key_optional_value_str (
19
+ std::string target, std::string forbidden_chars, std::string delimiter) {
21
20
std::smatch matchs;
22
- std::string::const_iterator search_start = target.base_string .cbegin ();
21
+ std::string::const_iterator search_start = target.cbegin ();
22
+ std::vector<KeyOptionalValue> kov_arr;
23
23
while (std::regex_search (
24
- search_start, target.base_string . cend (), matchs,
24
+ search_start, target.cend (), matchs,
25
25
std::regex (R"( ([^)" + forbidden_chars + delimiter + R"( ]+(?:)"
26
26
+ delimiter + R"( [^)" + forbidden_chars + delimiter
27
27
+ R"( ]+)?))" ))) {
@@ -38,11 +38,12 @@ void Url::parse_key_optional_value_list(
38
38
if (key_value_matchs.size () > 2 ) {
39
39
kov.value = key_value_matchs[2 ].str ();
40
40
}
41
- target. map .push_back (kov);
41
+ kov_arr .push_back (kov);
42
42
}
43
43
}
44
44
search_start = matchs.suffix ().first ;
45
45
}
46
+ return kov_arr;
46
47
}
47
48
48
49
bool Url::is_valid (std::string url) {
@@ -52,39 +53,55 @@ bool Url::is_valid(std::string url) {
52
53
ParsedUrl Url::parse_url (std::string url) {
53
54
std::smatch parts;
54
55
ParsedUrl purl;
56
+ std::string parameter;
57
+ std::string fragment;
55
58
if (std::regex_match (url, parts, url_parts)) {
56
59
purl.origin = parts[1 ].str ();
57
60
if (parts[2 ].str ().size ())
58
61
purl.path = parts[2 ].str ();
59
62
else
60
63
purl.path = " /" ;
61
- purl. parameter . base_string = parts[3 ].str ();
62
- purl. fragment . base_string = parts[4 ].str ();
64
+ parameter = parts[3 ].str ();
65
+ fragment = parts[4 ].str ();
63
66
}
64
- parse_key_optional_value_list (purl.parameter , R"( ?#&)" , R"( =)" );
65
- parse_key_optional_value_list (purl.fragment , R"( #&)" , R"( =)" );
67
+ if (parameter.length ())
68
+ purl.parameter =
69
+ parse_key_optional_value_str (parameter, R"( ?#&)" , R"( =)" );
70
+ if (fragment.length ())
71
+ purl.fragment =
72
+ parse_key_optional_value_str (fragment, R"( #&)" , R"( =)" );
66
73
return purl;
67
74
}
68
75
69
- std::string Url::full_url () {
76
+ std::string Url::stringify_key_optional_value_vec (
77
+ std::vector<KeyOptionalValue> kov_arr, char initial_char) {
78
+ if (kov_arr.size () < 1 )
79
+ return " " ;
70
80
std::stringstream ss;
71
- ss << parsed_url.origin << parsed_url.path
72
- << parsed_url.parameter .base_string
73
- << parsed_url.fragment .base_string ;
81
+ ss << initial_char;
82
+ for (size_t i = 0 ; i < kov_arr.size (); ++i) {
83
+ if (kov_arr[i].value .length () == 0 ) {
84
+ ss << kov_arr[i].key ;
85
+ } else {
86
+ ss << kov_arr[i].key << " =" << kov_arr[i].value ;
87
+ }
88
+ if (i < kov_arr.size ()-1 )
89
+ ss << " &" ;
90
+ }
74
91
return ss.str ();
75
92
}
76
93
77
- void Url::update_url () {
78
- remove_all_chars (parsed_url. origin , ' \\ ' ) ;
79
- remove_all_chars ( parsed_url.path , ' \\ ' );
80
- remove_all_chars (parsed_url.parameter . base_string , ' \\ ' );
81
- remove_all_chars (parsed_url.fragment . base_string , ' \\ ' );
82
- parsed_url = parse_url ( this -> full_url () );
94
+ std::string Url::full_url () {
95
+ std::stringstream ss ;
96
+ ss << parsed_url.origin << parsed_url. path
97
+ << stringify_key_optional_value_vec (parsed_url.parameter , ' ? ' )
98
+ << stringify_key_optional_value_vec (parsed_url.fragment , ' # ' );
99
+ return ss. str ( );
83
100
}
84
101
85
102
void Url::set_url (std::string new_url) {
103
+ remove_all_chars (new_url, ' \\ ' );
86
104
parsed_url = parse_url (new_url);
87
- update_url ();
88
105
}
89
106
90
107
Url::Url (std::string url) {
@@ -148,8 +165,10 @@ const std::string Url::color_chars(
148
165
const void Url::print_colored_url () {
149
166
std::string o = parsed_url.origin ;
150
167
std::string p = parsed_url.path ;
151
- std::string q = parsed_url.parameter .base_string ;
152
- std::string f = parsed_url.fragment .base_string ;
168
+ std::string q =
169
+ stringify_key_optional_value_vec (parsed_url.parameter , ' ?' );
170
+ std::string f =
171
+ stringify_key_optional_value_vec (parsed_url.fragment , ' #' );
153
172
std::cout
154
173
<< color_chars (origin_chars, o, " " , color_1_1, " " )
155
174
<< color_chars (path_chars, p, " " , color_2_1, " " )
@@ -215,8 +234,10 @@ const void Url::print_key_optional_value_list(
215
234
const void Url::print_parsed_url (bool decode) {
216
235
std::string o = parsed_url.origin ;
217
236
std::string p = parsed_url.path ;
218
- std::string q = parsed_url.parameter .base_string ;
219
- std::string f = parsed_url.fragment .base_string ;
237
+ std::string q =
238
+ stringify_key_optional_value_vec (parsed_url.parameter , ' ?' );
239
+ std::string f =
240
+ stringify_key_optional_value_vec (parsed_url.fragment , ' #' );
220
241
if (decode) {
221
242
o = decode_uri_component (o);
222
243
p = decode_uri_component (p);
@@ -229,20 +250,20 @@ const void Url::print_parsed_url(bool decode) {
229
250
<< color_str (" →" , color_dim) << " " << color_str (" Path" , color_2)
230
251
<< color_str (" :" , color_dim) << " "
231
252
<< color_chars (path_chars, p, color_2_1, " " , " " ) << " \n " ;
232
- if (parsed_url.parameter .base_string . size ()) {
253
+ if (parsed_url.parameter .size ()) {
233
254
std::cout << color_str (" →" , color_dim) << " "
234
255
<< color_str (" Parameter" , color_3) << color_str (" :" , color_dim)
235
256
<< " " << color_chars (key_optional_value_chars, q,
236
257
color_3_1, " " , color_3) << " \n " ;
237
258
print_key_optional_value_list (
238
- parsed_url.parameter . map , decode, color_3_1, color_3);
259
+ parsed_url.parameter , decode, color_3_1, color_3);
239
260
}
240
- if (parsed_url.fragment .base_string . size ()) {
261
+ if (parsed_url.fragment .size ()) {
241
262
std::cout << color_str (" →" , color_dim) << " "
242
263
<< color_str (" Fragment" , color_4) << color_str (" :" , color_dim)
243
264
<< " " << color_chars (key_optional_value_chars, f,
244
265
color_4_1, " " , color_4) << " \n " ;
245
266
print_key_optional_value_list (
246
- parsed_url.fragment . map , decode, color_4_1, color_4);
267
+ parsed_url.fragment , decode, color_4_1, color_4);
247
268
}
248
269
}
0 commit comments