GCC Code Coverage Report


Directory: libs/url/
File: src/rfc/detail/host_rule.cpp
Date: 2025-11-10 19:06:22
Exec Total Coverage
Lines: 52 52 100.0%
Functions: 1 1 100.0%
Branches: 18 18 100.0%

Line Branch Exec Source
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/boostorg/url
8 //
9
10
11 #include <boost/url/detail/config.hpp>
12 #include <boost/url/rfc/ipv4_address_rule.hpp>
13 #include "host_rule.hpp"
14 #include "ip_literal_rule.hpp"
15 #include "reg_name_rule.hpp"
16 #include <boost/url/grammar/parse.hpp>
17
18 namespace boost {
19 namespace urls {
20 namespace detail {
21
22 auto
23 1964 host_rule_t::
24 parse(
25 char const*& it,
26 char const* const end
27 ) const noexcept ->
28 system::result<value_type>
29 {
30 1964 value_type t;
31
32
2/2
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 1739 times.
1964 if(it == end)
33 {
34 // empty host
35 225 t.host_type =
36 urls::host_type::name;
37 225 return t;
38 }
39
40 1739 auto const it0 = it;
41
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 1676 times.
1739 if(*it == '[')
42 {
43 // IP-literal
44 63 auto rv = grammar::parse(
45 it, end,
46 detail::ip_literal_rule);
47
2/2
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 39 times.
63 if(! rv)
48 24 return rv.error();
49 39 auto v = *rv;
50
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 5 times.
39 if(v.is_ipv6)
51 {
52 // IPv6address
53 auto const b =
54 34 v.ipv6.to_bytes();
55 68 std::memcpy(
56 t.addr,
57 34 b.data(),
58 b.size());
59 34 t.host_type =
60 urls::host_type::ipv6;
61 68 t.match = core::string_view(
62 34 it0, it - it0);
63 34 return t;
64 }
65
66 // IPvFuture
67 5 t.host_type =
68 urls::host_type::ipvfuture;
69 10 t.match = core::string_view(
70 5 it0, it - it0);
71 5 return t;
72 }
73
74 // IPv4address
75 {
76 1676 auto rv = grammar::parse(
77 it, end, ipv4_address_rule);
78
2/2
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 1648 times.
1676 if( rv )
79 {
80 28 auto it02 = it;
81 28 auto rv2 = grammar::parse(
82 it, end,
83 detail::reg_name_rule);
84
4/4
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 22 times.
55 if (rv2.has_value() &&
85
2/2
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 21 times.
27 !rv2->empty())
86 {
87 6 t.name = core::string_view(
88 6 it0, it - it0);
89 6 t.host_type =
90 urls::host_type::name;
91 12 t.match = core::string_view(
92 6 it0, it - it0);
93 6 return t;
94 }
95 22 it = it02;
96 auto const b =
97 22 rv->to_bytes();
98 44 std::memcpy(
99 t.addr,
100 22 b.data(),
101 b.size());
102 22 t.host_type =
103 urls::host_type::ipv4;
104 44 t.match = core::string_view(
105 22 it0, it - it0);
106 22 return t;
107 }
108
109 1648 it = it0; // rewind
110 }
111
112 // reg-name
113 {
114 1648 auto rv = grammar::parse(
115 it, end,
116 detail::reg_name_rule);
117
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1641 times.
1648 if(! rv)
118 7 return rv.error();
119 1641 t.name = *rv;
120 1641 t.host_type =
121 urls::host_type::name;
122 3282 t.match = core::string_view(
123 1641 it0, it - it0);
124 1641 return t;
125 }
126 }
127
128 } // detail
129 } // urls
130 } // boost
131
132