GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/url.cc
Date: 2024-04-28 02:33:07
Exec Total Coverage
Lines: 51 53 96.2%
Branches: 47 73 64.4%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "url.h"
6
7 #include <algorithm>
8
9 #include "util/string.h"
10
11 const int Url::kDefaultPort = 80;
12 const char* Url::kDefaultProtocol = "http";
13
14 18 Url* Url::Parse(const std::string& url, const std::string& default_protocol,
15 int default_port) {
16
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 17 times.
18 if (url.empty()) {
17 1 return NULL;
18 }
19
20 17 size_t cursor = 0;
21
22 // Is there a protocol prefix?
23
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 std::string protocol = default_protocol;
24 17 size_t sep_pos = url.find("://");
25
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 10 times.
17 if (sep_pos != std::string::npos) {
26
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 protocol = url.substr(0, sep_pos);
27 7 cursor = sep_pos + 3;
28 }
29
30 17 std::string host;
31 17 std::string path;
32 17 uint64_t port = default_port;
33
34 // Try to find another ":", preceding a port number
35 17 size_t col_pos = url.find(":", cursor);
36
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 10 times.
17 if (col_pos != std::string::npos) {
37 // Port number was given
38
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 host = url.substr(cursor, col_pos - cursor);
39 7 cursor = col_pos + 1;
40
41 7 size_t slash_pos = url.find("/", cursor);
42
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (slash_pos == 0) {
43 return NULL;
44 }
45
46 // Check that part between ":" and "/" or the end of the string is an
47 // unsigned number
48 7 size_t port_end =
49
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
7 slash_pos == std::string::npos ? std::string::npos : slash_pos - cursor;
50
4/7
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✓ Branch 8 taken 2 times.
7 if (!String2Uint64Parse(url.substr(cursor, port_end), &port)) {
51 5 return NULL;
52 }
53
54
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (slash_pos != std::string::npos) {
55
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 path = url.substr(slash_pos);
56 }
57 } else {
58 // No port number was given
59 10 size_t slash_pos = url.find("/", cursor);
60
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 6 times.
10 if (slash_pos != std::string::npos) {
61
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 host = url.substr(cursor, slash_pos - cursor);
62
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 path = url.substr(slash_pos);
63 } else {
64
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 host = url.substr(cursor);
65 }
66 }
67
68 // At the moment, host name validation is very basic
69
3/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 8 times.
12 if (!ValidateHost(host)) {
70 4 return NULL;
71 }
72
73
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 return new Url(protocol, host, path, port);
74 17 }
75
76 12 bool Url::ValidateHost(const std::string& host) {
77
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 9 times.
12 if (host.empty()) {
78 3 return false;
79 }
80
81 // Host must not be just a number
82 uint64_t test;
83
3/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 8 times.
9 if (String2Uint64Parse(host, &test)) {
84 1 return false;
85 }
86
87 8 return true;
88 }
89
90 Url::Url() : protocol_(), host_(), path_(), port_(), address_() {}
91
92 8 Url::Url(const std::string& protocol, const std::string& host,
93 8 const std::string& path, int port)
94 8 : protocol_(protocol),
95
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 host_(host),
96
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 path_(path),
97 8 port_(port),
98 8 address_() {
99
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
8 if (port_ != kDefaultPort) {
100
6/12
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
3 address_ = protocol + "://" + host + ":" + StringifyInt(port_) + path;
101 } else {
102
3/6
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
5 address_ = protocol + "://" + host + path;
103 }
104 8 }
105 8 Url::~Url() {}
106