Branch Coverage

src/panda/uri/URI.cc
Criterion Covered Total %
branch 193 326 59.2


line true false branch
18 0 0 register_scheme(scheme, &typeid(URI), [](const URI& u)->URI*{ return new URI(u); }, default_port, secure);
0 0 register_scheme(scheme, &typeid(URI), [](const URI& u)->URI*{ return new URI(u); }, default_port, secure);
22 117 0 if (scheme_map.find(scheme) != scheme_map.end())
0 117 if (scheme_map.find(scheme) != scheme_map.end())
23 0 0 throw std::invalid_argument("URI::register_scheme: scheme '" + scheme + "' has been already registered");
0 0 throw std::invalid_argument("URI::register_scheme: scheme '" + scheme + "' has been already registered");
0 0 throw std::invalid_argument("URI::register_scheme: scheme '" + scheme + "' has been already registered");
0 0 throw std::invalid_argument("URI::register_scheme: scheme '" + scheme + "' has been already registered");
32 117 0 schemas.push_back(&inf);
37 13 0 URI::register_scheme("http", &typeid(URI::http), [](const URI& u)->URI*{ return new URI::http(u); }, 80 );
11 0 URI::register_scheme("http", &typeid(URI::http), [](const URI& u)->URI*{ return new URI::http(u); }, 80 );
38 13 0 URI::register_scheme("https", &typeid(URI::https), [](const URI& u)->URI*{ return new URI::https(u); }, 443, true);
1 0 URI::register_scheme("https", &typeid(URI::https), [](const URI& u)->URI*{ return new URI::https(u); }, 443, true);
39 13 0 URI::register_scheme("ws", &typeid(URI::ws), [](const URI& u)->URI*{ return new URI::ws(u); }, 80 );
1 0 URI::register_scheme("ws", &typeid(URI::ws), [](const URI& u)->URI*{ return new URI::ws(u); }, 80 );
40 13 0 URI::register_scheme("wss", &typeid(URI::wss), [](const URI& u)->URI*{ return new URI::wss(u); }, 443, true);
1 0 URI::register_scheme("wss", &typeid(URI::wss), [](const URI& u)->URI*{ return new URI::wss(u); }, 443, true);
41 13 0 URI::register_scheme("ftp", &typeid(URI::ftp), [](const URI& u)->URI*{ return new URI::ftp(u); }, 21 );
1 0 URI::register_scheme("ftp", &typeid(URI::ftp), [](const URI& u)->URI*{ return new URI::ftp(u); }, 21 );
42 13 0 URI::register_scheme("socks5", &typeid(URI::socks), [](const URI& u)->URI*{ return new URI::socks(u); }, 1080 );
1 0 URI::register_scheme("socks5", &typeid(URI::socks), [](const URI& u)->URI*{ return new URI::socks(u); }, 1080 );
43 13 0 URI::register_scheme("ssh", &typeid(URI::ssh), [](const URI& u)->URI*{ return new URI::ssh(u); }, 22, true);
1 0 URI::register_scheme("ssh", &typeid(URI::ssh), [](const URI& u)->URI*{ return new URI::ssh(u); }, 22, true);
44 13 0 URI::register_scheme("telnet", &typeid(URI::telnet), [](const URI& u)->URI*{ return new URI::telnet(u); }, 23 );
1 0 URI::register_scheme("telnet", &typeid(URI::telnet), [](const URI& u)->URI*{ return new URI::telnet(u); }, 23 );
45 13 0 URI::register_scheme("sftp", &typeid(URI::sftp), [](const URI& u)->URI*{ return new URI::sftp(u); }, 22, true);
1 0 URI::register_scheme("sftp", &typeid(URI::sftp), [](const URI& u)->URI*{ return new URI::sftp(u); }, 22, true);
47 13 0 http_si = &scheme_map.find("http")->second;
48 13 0 https_si = &scheme_map.find("https")->second;
56 145 1 bool ok = !(_flags & Flags::allow_extended_chars) ? _parse(str, authority_has_pct) : _parse_ext(str, authority_has_pct);
145 0 bool ok = !(_flags & Flags::allow_extended_chars) ? _parse(str, authority_has_pct) : _parse_ext(str, authority_has_pct);
1 0 bool ok = !(_flags & Flags::allow_extended_chars) ? _parse(str, authority_has_pct) : _parse_ext(str, authority_has_pct);
58 7 139 if (!ok) {
59 7 0 clear();
63 0 139 if (authority_has_pct) {
64 0 0 decode_uri_component(_user_info, _user_info);
65 0 0 decode_uri_component(_host, _host);
68 39 100 if (_qstr) ok_qstr();
69 9 130 if (_flags & Flags::allow_suffix_reference && !_host.length()) guess_suffix_reference();
9 0 if (_flags & Flags::allow_suffix_reference && !_host.length()) guess_suffix_reference();
9 130 if (_flags & Flags::allow_suffix_reference && !_host.length()) guess_suffix_reference();
9 0 if (_flags & Flags::allow_suffix_reference && !_host.length()) guess_suffix_reference();
70 139 0 sync_scheme_info();
79 3 6 if (!_scheme.length()) {
81 1 2 if (delim == string::npos) {
95 16 2 for (; i < plen; ++i) {
97 14 2 if (c >= '0' && c <= '9') {
12 2 if (c >= '0' && c <= '9') {
102 2 2 if (c != '/') { _port = 0; return; }
106 2 2 if (!ok) return;
115 335 2 if (!relative) approx_len += (_scheme.length()+3) + (_user_info.length()*3 + 1) + (_host.length()*3 + 6);
118 335 2 if (!relative) {
119 258 77 if (_scheme.length()) {
120 258 0 str += _scheme;
121 193 65 if (_host.length()) str += "://";
193 0 if (_host.length()) str += "://";
122 65 0 else str += ':';
124 52 25 else if (_host.length()) str += "//";
52 0 else if (_host.length()) str += "//";
126 245 90 if (_host.length()) {
127 50 195 if (_user_info.length()) {
128 50 0 _encode_uri_component_append(_user_info, str, URIComponent::user_info);
129 50 0 str += '@';
133 35 210 if (chost.front() == '[' && chost.back() == ']') str += _host;
35 0 if (chost.front() == '[' && chost.back() == ']') str += _host;
35 210 if (chost.front() == '[' && chost.back() == ']') str += _host;
35 0 if (chost.front() == '[' && chost.back() == ']') str += _host;
134 210 0 else _encode_uri_component_append(_host, str, URIComponent::host);
136 65 180 if (_port) {
137 65 0 str += ':';
138 65 0 str += string::from_number(_port);
65 0 str += string::from_number(_port);
143 185 152 if (_path.length()) str += _path;
185 0 if (_path.length()) str += _path;
144 2 150 else if (relative) str += '/'; // relative path MUST NOT be empty
2 0 else if (relative) str += '/'; // relative path MUST NOT be empty
146 103 234 if (_qstr.length()) {
147 103 0 str += '?';
148 103 0 str += _qstr; // as is, because already encoded either by raw_query setter or by compile_query
151 98 239 if (_fragment.length()) {
152 98 0 str += '#';
153 98 0 str += _fragment;
165 1 8 const char delim = _flags & Flags::query_param_semicolon ? ';' : '&';
170 8 1 if (len) for (int i = 0; i <= len; ++i) {
124 8 if (len) for (int i = 0; i <= len; ++i) {
171 116 8 char c = (i == len) ? delim : str[i];
172 18 106 if (c == '=' && mode == PARSE_MODE_KEY) {
18 0 if (c == '=' && mode == PARSE_MODE_KEY) {
177 3 103 else if (c == '%') {
180 19 84 else if (c == delim) {
181 1 18 if (mode == PARSE_MODE_KEY) {
186 3 16 if (has_pct) {
189 3 0 if (klen > 0) decode_uri_component(string_view(str+key_start, klen), key);
3 0 if (klen > 0) decode_uri_component(string_view(str+key_start, klen), key);
192 3 0 if (vlen > 0) decode_uri_component(string_view(str+val_start, vlen), value);
3 0 if (vlen > 0) decode_uri_component(string_view(str+val_start, vlen), value);
195 3 0 _query.emplace(key, value);
197 16 0 _query.emplace(_qstr.substr(key_start, key_end - key_start), _qstr.substr(val_start, i - val_start));
16 0 _query.emplace(_qstr.substr(key_start, key_end - key_start), _qstr.substr(val_start, i - val_start));
210 0 7 const char delim = _flags & Flags::query_param_semicolon ? ';' : '&';
215 18 7 for (auto it = begin; it != end; ++it) bufsize += (it->first.length() + it->second.length())*3 + 2;
216 7 0 if (bufsize) --bufsize;
218 7 0 _qstr.reserve(bufsize);
220 7 0 char* bufp = _qstr.buf();
222 18 7 for (auto it = begin; it != end; ++it) {
223 11 7 if (it != begin) *ptr++ = delim;
224 18 0 ptr += encode_uri_component(it->first, ptr);
226 18 0 ptr += encode_uri_component(it->second, ptr);
234 0 0 sync_query();
236 0 0 for (auto it = addquery.cbegin(); it != end; ++it) _query.emplace(it->first, it->second);
0 0 for (auto it = addquery.cbegin(); it != end; ++it) _query.emplace(it->first, it->second);
242 1 4 if (!plen) return std::vector();
244 4 0 ret.reserve(7);
247 30 4 for (size_t i = 0; i < plen; ++i) {
248 22 8 if (p[i] != '/') continue;
249 4 4 if (i == start) { start++; continue; }
250 4 0 ret.push_back(decode_uri_component(string_view(p+start, i-start)));
4 0 ret.push_back(decode_uri_component(string_view(p+start, i-start)));
253 2 2 if (p[plen-1] != '/') ret.push_back(string(p+start, plen-start));
2 0 if (p[plen-1] != '/') ret.push_back(string(p+start, plen-start));
2 0 if (p[plen-1] != '/') ret.push_back(string(p+start, plen-start));
272 25 129 if (!_scheme) {
278 105 24 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
105 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 18 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 42 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 42 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 42 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
105 24 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
87 42 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
0 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
0 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
0 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
0 0 if (len >= 4 && (_scheme[0]|0x20) == 'h' && (_scheme[1]|0x20) == 't' && (_scheme[2]|0x20) == 't' && (_scheme[3]|0x20) == 'p') {
279 59 28 if (len == 4) {
281 59 0 _scheme = "http";
283 28 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
28 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
28 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
28 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
28 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
0 0 else if (len == 5 && (_scheme[4]|0x20) == 's') {
285 28 0 _scheme = "https";
292 42 0 char* p = _scheme.buf();
294 160 42 for (;p != end; ++p) *p = tolower(*p);
296 42 0 auto it = scheme_map.find(_scheme);
297 18 24 if (it == scheme_map.cend()) scheme_info = NULL;
302 0 0 auto it = scheme_ti_map.find(ti);
303 0 0 return it == scheme_ti_map.end() ? nullptr : it->second;
308 0 0 if (delim == string::npos) return _user_info;
314 0 0 if (delim == string::npos) _user_info = user;
320 0 0 if (delim == string::npos) return string();
326 0 0 if (delim == string::npos) {
334 0 0 string tmp = uri.to_string();
335 0 0 return os.write(tmp.data(), tmp.length());
338 13 0 }}
13 0 }}