Skip to content

Commit 158be73

Browse files
committed
Further simplified the URL analysis by removing the 'base_str' since the same data is also already stored at 'obj'.
1 parent d5d2c29 commit 158be73

File tree

2 files changed

+56
-39
lines changed

2 files changed

+56
-39
lines changed

c++/inc/url_parser/url_parser.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,11 @@ struct KeyOptionalValue {
1010
std::string value;
1111
};
1212

13-
struct KeyOptionalValueData {
14-
std::string base_string;
15-
std::vector<KeyOptionalValue> map;
16-
};
17-
1813
struct ParsedUrl {
1914
std::string origin;
2015
std::string path;
21-
KeyOptionalValueData parameter;
22-
KeyOptionalValueData fragment;
16+
std::vector<KeyOptionalValue> parameter;
17+
std::vector<KeyOptionalValue> fragment;
2318
};
2419

2520
class Url {
@@ -37,12 +32,13 @@ class Url {
3732
R"(^((?:\w+:\/\/)?[^\/.:]+(?:\.[^\/.?#]+)+)((?:\/?(?:[^\/?#]+)?)*)?(\?(?:[^?#]+?)?)?(#(?:[^#]+?)?)?$)",
3833
std::regex_constants::ECMAScript | std::regex_constants::icase);
3934
void remove_all_chars(std::string& target, char remove);
40-
void parse_key_optional_value_list(
41-
KeyOptionalValueData& target, std::string forbidden_chars,
35+
std::vector<KeyOptionalValue> parse_key_optional_value_str(
36+
std::string target, std::string forbidden_chars,
4237
std::string delimiter);
4338
ParsedUrl parse_url(std::string url);
39+
std::string stringify_key_optional_value_vec(
40+
std::vector<KeyOptionalValue> kov_arr, char);
4441
std::string full_url();
45-
void update_url();
4642
const std::string color_reset = "\x1b[0m";
4743
const std::string color_dim = "\x1b[2m";
4844
const std::string color_1 = "\x1b[32m";

c++/src/url_parser/url_parser.cc

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ void Url::remove_all_chars(std::string& target, char remove) {
1515
target.erase(it, target.end());
1616
}
1717

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) {
2120
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;
2323
while (std::regex_search(
24-
search_start, target.base_string.cend(), matchs,
24+
search_start, target.cend(), matchs,
2525
std::regex(R"(([^)" + forbidden_chars + delimiter + R"(]+(?:)"
2626
+ delimiter + R"([^)" + forbidden_chars + delimiter
2727
+ R"(]+)?))"))) {
@@ -38,11 +38,12 @@ void Url::parse_key_optional_value_list(
3838
if (key_value_matchs.size() > 2) {
3939
kov.value = key_value_matchs[2].str();
4040
}
41-
target.map.push_back(kov);
41+
kov_arr.push_back(kov);
4242
}
4343
}
4444
search_start = matchs.suffix().first;
4545
}
46+
return kov_arr;
4647
}
4748

4849
bool Url::is_valid(std::string url) {
@@ -52,39 +53,55 @@ bool Url::is_valid(std::string url) {
5253
ParsedUrl Url::parse_url(std::string url) {
5354
std::smatch parts;
5455
ParsedUrl purl;
56+
std::string parameter;
57+
std::string fragment;
5558
if (std::regex_match(url, parts, url_parts)) {
5659
purl.origin = parts[1].str();
5760
if (parts[2].str().size())
5861
purl.path = parts[2].str();
5962
else
6063
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();
6366
}
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"(=)");
6673
return purl;
6774
}
6875

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 "";
7080
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+
}
7491
return ss.str();
7592
}
7693

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();
83100
}
84101

85102
void Url::set_url(std::string new_url) {
103+
remove_all_chars(new_url, '\\');
86104
parsed_url = parse_url(new_url);
87-
update_url();
88105
}
89106

90107
Url::Url(std::string url) {
@@ -148,8 +165,10 @@ const std::string Url::color_chars(
148165
const void Url::print_colored_url() {
149166
std::string o = parsed_url.origin;
150167
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, '#');
153172
std::cout
154173
<< color_chars(origin_chars, o, "", color_1_1, "")
155174
<< color_chars(path_chars, p, "", color_2_1, "")
@@ -215,8 +234,10 @@ const void Url::print_key_optional_value_list(
215234
const void Url::print_parsed_url(bool decode) {
216235
std::string o = parsed_url.origin;
217236
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, '#');
220241
if (decode) {
221242
o = decode_uri_component(o);
222243
p = decode_uri_component(p);
@@ -229,20 +250,20 @@ const void Url::print_parsed_url(bool decode) {
229250
<< color_str("", color_dim) << " " << color_str("Path", color_2)
230251
<< color_str(":", color_dim) << " "
231252
<< color_chars(path_chars, p, color_2_1, "", "") << "\n";
232-
if (parsed_url.parameter.base_string.size()) {
253+
if (parsed_url.parameter.size()) {
233254
std::cout << color_str("", color_dim) << " "
234255
<< color_str("Parameter", color_3) << color_str(":", color_dim)
235256
<< " " << color_chars(key_optional_value_chars, q,
236257
color_3_1, "", color_3) << "\n";
237258
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);
239260
}
240-
if (parsed_url.fragment.base_string.size()) {
261+
if (parsed_url.fragment.size()) {
241262
std::cout << color_str("", color_dim) << " "
242263
<< color_str("Fragment", color_4) << color_str(":", color_dim)
243264
<< " " << color_chars(key_optional_value_chars, f,
244265
color_4_1, "", color_4) << "\n";
245266
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);
247268
}
248269
}

0 commit comments

Comments
 (0)