100.00% Lines (148/148) 100.00% Functions (18/18)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3   // Copyright (c) 2023 Alan de Freitas (alandefreitas@gmail.com) 3   // Copyright (c) 2023 Alan de Freitas (alandefreitas@gmail.com)
4   // 4   //
5   // Distributed under the Boost Software License, Version 1.0. (See accompanying 5   // Distributed under the Boost Software License, Version 1.0. (See accompanying
6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7   // 7   //
8   // Official repository: https://github.com/boostorg/url 8   // Official repository: https://github.com/boostorg/url
9   // 9   //
10   10  
11   #ifndef BOOST_URL_IMPL_AUTHORITY_VIEW_HPP 11   #ifndef BOOST_URL_IMPL_AUTHORITY_VIEW_HPP
12   #define BOOST_URL_IMPL_AUTHORITY_VIEW_HPP 12   #define BOOST_URL_IMPL_AUTHORITY_VIEW_HPP
13   13  
14   #include <boost/url/detail/config.hpp> 14   #include <boost/url/detail/config.hpp>
15   #include <boost/url/detail/memcpy.hpp> 15   #include <boost/url/detail/memcpy.hpp>
16   #include <boost/url/grammar/parse.hpp> 16   #include <boost/url/grammar/parse.hpp>
17   #include <boost/url/rfc/authority_rule.hpp> 17   #include <boost/url/rfc/authority_rule.hpp>
18   18  
19   namespace boost { 19   namespace boost {
20   namespace urls { 20   namespace urls {
21   21  
22   //------------------------------------------------ 22   //------------------------------------------------
23   23  
24   namespace detail { 24   namespace detail {
25   25  
26   // Forward declarations for normalize functions 26   // Forward declarations for normalize functions
27   // defined in src/detail/normalize.cpp 27   // defined in src/detail/normalize.cpp
28   BOOST_URL_DECL 28   BOOST_URL_DECL
29   int 29   int
30   compare_encoded( 30   compare_encoded(
31   core::string_view lhs, 31   core::string_view lhs,
32   core::string_view rhs) noexcept; 32   core::string_view rhs) noexcept;
33   33  
34   BOOST_URL_DECL 34   BOOST_URL_DECL
35   int 35   int
36   ci_compare_encoded( 36   ci_compare_encoded(
37   core::string_view lhs, 37   core::string_view lhs,
38   core::string_view rhs) noexcept; 38   core::string_view rhs) noexcept;
39   39  
40   BOOST_URL_DECL 40   BOOST_URL_DECL
41   int 41   int
42   compare( 42   compare(
43   core::string_view lhs, 43   core::string_view lhs,
44   core::string_view rhs) noexcept; 44   core::string_view rhs) noexcept;
45   45  
46   } // detail 46   } // detail
47   47  
48   //------------------------------------------------ 48   //------------------------------------------------
49   // 49   //
50   // Special Members 50   // Special Members
51   // 51   //
52   //------------------------------------------------ 52   //------------------------------------------------
53   53  
54   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 54   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
HITCBC 55   2 authority_view:: 55   2 authority_view::
56   authority_view( 56   authority_view(
HITCBC 57   2 core::string_view s) 57   2 core::string_view s)
58   : authority_view( 58   : authority_view(
HITCBC 59   2 parse_authority(s 59   2 parse_authority(s
HITCBC 60   2 ).value(BOOST_URL_POS)) 60   2 ).value(BOOST_URL_POS))
61   { 61   {
HITCBC 62   2 } 62   2 }
63   63  
64   //------------------------------------------------ 64   //------------------------------------------------
65   // 65   //
66   // Userinfo 66   // Userinfo
67   // 67   //
68   //------------------------------------------------ 68   //------------------------------------------------
69   69  
70   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 70   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
71   bool 71   bool
HITCBC 72   641 authority_view:: 72   641 authority_view::
73   has_userinfo() const noexcept 73   has_userinfo() const noexcept
74   { 74   {
HITCBC 75   641 auto n = u_.len(id_pass); 75   641 auto n = u_.len(id_pass);
HITCBC 76   641 if(n == 0) 76   641 if(n == 0)
HITCBC 77   549 return false; 77   549 return false;
HITCBC 78   92 BOOST_ASSERT(u_.get( 78   92 BOOST_ASSERT(u_.get(
79   id_pass).ends_with('@')); 79   id_pass).ends_with('@'));
HITCBC 80   92 return true; 80   92 return true;
81   } 81   }
82   82  
83   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 83   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
84   pct_string_view 84   pct_string_view
HITCBC 85   53 authority_view:: 85   53 authority_view::
86   encoded_userinfo() const noexcept 86   encoded_userinfo() const noexcept
87   { 87   {
HITCBC 88   53 auto s = u_.get( 88   53 auto s = u_.get(
89   id_user, id_host); 89   id_user, id_host);
HITCBC 90   53 if(s.empty()) 90   53 if(s.empty())
HITCBC 91   2 return s; 91   2 return s;
HITCBC 92   51 BOOST_ASSERT( 92   51 BOOST_ASSERT(
93   s.ends_with('@')); 93   s.ends_with('@'));
HITCBC 94   51 s.remove_suffix(1); 94   51 s.remove_suffix(1);
HITCBC 95   51 return make_pct_string_view_unsafe( 95   51 return make_pct_string_view_unsafe(
96   s.data(), 96   s.data(),
97   s.size(), 97   s.size(),
HITCBC 98   51 u_.decoded_[id_user] + 98   51 u_.decoded_[id_user] +
HITCBC 99   102 u_.decoded_[id_pass] + 99   102 u_.decoded_[id_pass] +
HITCBC 100   102 has_password()); 100   102 has_password());
101   } 101   }
102   102  
103   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 103   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
104   pct_string_view 104   pct_string_view
HITCBC 105   75 authority_view:: 105   75 authority_view::
106   encoded_user() const noexcept 106   encoded_user() const noexcept
107   { 107   {
HITCBC 108   75 auto s = u_.get(id_user); 108   75 auto s = u_.get(id_user);
HITCBC 109   75 return make_pct_string_view_unsafe( 109   75 return make_pct_string_view_unsafe(
110   s.data(), 110   s.data(),
111   s.size(), 111   s.size(),
HITCBC 112   150 u_.decoded_[id_user]); 112   150 u_.decoded_[id_user]);
113   } 113   }
114   114  
115   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 115   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
116   bool 116   bool
HITCBC 117   113 authority_view:: 117   113 authority_view::
118   has_password() const noexcept 118   has_password() const noexcept
119   { 119   {
HITCBC 120   113 auto const n = u_.len(id_pass); 120   113 auto const n = u_.len(id_pass);
HITCBC 121   113 if(n > 1) 121   113 if(n > 1)
122   { 122   {
HITCBC 123   80 BOOST_ASSERT(u_.get(id_pass 123   80 BOOST_ASSERT(u_.get(id_pass
124   ).starts_with(':')); 124   ).starts_with(':'));
HITCBC 125   80 BOOST_ASSERT(u_.get(id_pass 125   80 BOOST_ASSERT(u_.get(id_pass
126   ).ends_with('@')); 126   ).ends_with('@'));
HITCBC 127   80 return true; 127   80 return true;
128   } 128   }
HITCBC 129   33 BOOST_ASSERT(n == 0 || u_.get( 129   33 BOOST_ASSERT(n == 0 || u_.get(
130   id_pass).ends_with('@')); 130   id_pass).ends_with('@'));
HITCBC 131   33 return false; 131   33 return false;
132   } 132   }
133   133  
134   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 134   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
135   pct_string_view 135   pct_string_view
HITCBC 136   59 authority_view:: 136   59 authority_view::
137   encoded_password() const noexcept 137   encoded_password() const noexcept
138   { 138   {
HITCBC 139   59 auto s = u_.get(id_pass); 139   59 auto s = u_.get(id_pass);
HITCBC 140   59 switch(s.size()) 140   59 switch(s.size())
141   { 141   {
HITCBC 142   8 case 1: 142   8 case 1:
HITCBC 143   8 BOOST_ASSERT( 143   8 BOOST_ASSERT(
144   s.starts_with('@')); 144   s.starts_with('@'));
HITCBC 145   8 s.remove_prefix(1); 145   8 s.remove_prefix(1);
146   BOOST_FALLTHROUGH; 146   BOOST_FALLTHROUGH;
HITCBC 147   8 case 0: 147   8 case 0:
HITCBC 148   8 return make_pct_string_view_unsafe( 148   8 return make_pct_string_view_unsafe(
HITCBC 149   8 s.data(), s.size(), 0); 149   8 s.data(), s.size(), 0);
HITCBC 150   51 default: 150   51 default:
HITCBC 151   51 break; 151   51 break;
152   } 152   }
HITCBC 153   51 BOOST_ASSERT(s.ends_with('@')); 153   51 BOOST_ASSERT(s.ends_with('@'));
HITCBC 154   51 BOOST_ASSERT(s.starts_with(':')); 154   51 BOOST_ASSERT(s.starts_with(':'));
HITCBC 155   51 return make_pct_string_view_unsafe( 155   51 return make_pct_string_view_unsafe(
HITCBC 156   51 s.data() + 1, 156   51 s.data() + 1,
HITCBC 157   51 s.size() - 2, 157   51 s.size() - 2,
HITCBC 158   102 u_.decoded_[id_pass]); 158   102 u_.decoded_[id_pass]);
159   } 159   }
160   160  
161   //------------------------------------------------ 161   //------------------------------------------------
162   // 162   //
163   // Host 163   // Host
164   // 164   //
165   //------------------------------------------------ 165   //------------------------------------------------
166   /* 166   /*
167   host_type host_type() // ipv4, ipv6, ipvfuture, name 167   host_type host_type() // ipv4, ipv6, ipvfuture, name
168   168  
169   std::string host() // return encoded_host().decode() 169   std::string host() // return encoded_host().decode()
170   pct_string_view encoded_host() // return host part, as-is 170   pct_string_view encoded_host() // return host part, as-is
171   std::string host_address() // return encoded_host_address().decode() 171   std::string host_address() // return encoded_host_address().decode()
172   pct_string_view encoded_host_address() // ipv4, ipv6, ipvfut, or encoded name, no brackets 172   pct_string_view encoded_host_address() // ipv4, ipv6, ipvfut, or encoded name, no brackets
173   173  
174   ipv4_address host_ipv4_address() // return ipv4_address or {} 174   ipv4_address host_ipv4_address() // return ipv4_address or {}
175   ipv6_address host_ipv6_address() // return ipv6_address or {} 175   ipv6_address host_ipv6_address() // return ipv6_address or {}
176   core::string_view host_ipvfuture() // return ipvfuture or {} 176   core::string_view host_ipvfuture() // return ipvfuture or {}
177   std::string host_name() // return decoded name or "" 177   std::string host_name() // return decoded name or ""
178   pct_string_view encoded_host_name() // return encoded host name or "" 178   pct_string_view encoded_host_name() // return encoded host name or ""
179   */ 179   */
180   180  
181   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 181   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
182   pct_string_view 182   pct_string_view
HITCBC 183   409 authority_view:: 183   409 authority_view::
184   encoded_host() const noexcept 184   encoded_host() const noexcept
185   { 185   {
HITCBC 186   409 return u_.pct_get(id_host); 186   409 return u_.pct_get(id_host);
187   } 187   }
188   188  
189   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 189   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
190   pct_string_view 190   pct_string_view
HITCBC 191   34 authority_view:: 191   34 authority_view::
192   encoded_host_address() const noexcept 192   encoded_host_address() const noexcept
193   { 193   {
HITCBC 194   34 core::string_view s = u_.get(id_host); 194   34 core::string_view s = u_.get(id_host);
195   std::size_t n; 195   std::size_t n;
HITCBC 196   34 switch(u_.host_type_) 196   34 switch(u_.host_type_)
197   { 197   {
HITCBC 198   5 case urls::host_type::name: 198   5 case urls::host_type::name:
199   case urls::host_type::ipv4: 199   case urls::host_type::ipv4:
HITCBC 200   5 n = u_.decoded_[id_host]; 200   5 n = u_.decoded_[id_host];
HITCBC 201   5 break; 201   5 break;
202   202  
HITCBC 203   29 case urls::host_type::ipv6: 203   29 case urls::host_type::ipv6:
204   case urls::host_type::ipvfuture: 204   case urls::host_type::ipvfuture:
205   { 205   {
HITCBC 206   29 BOOST_ASSERT(s.size() >= 2); 206   29 BOOST_ASSERT(s.size() >= 2);
HITCBC 207   29 BOOST_ASSERT(s.front() == '['); 207   29 BOOST_ASSERT(s.front() == '[');
HITCBC 208   29 BOOST_ASSERT(s.back() == ']'); 208   29 BOOST_ASSERT(s.back() == ']');
HITCBC 209   29 s = s.substr(1, s.size() - 2); 209   29 s = s.substr(1, s.size() - 2);
HITCBC 210   29 n = u_.decoded_[id_host] - 2; 210   29 n = u_.decoded_[id_host] - 2;
HITCBC 211   29 break; 211   29 break;
212   } 212   }
213   // LCOV_EXCL_START 213   // LCOV_EXCL_START
214   default: 214   default:
215   case urls::host_type::none: 215   case urls::host_type::none:
216   /* 216   /*
217   * This condition is for correctness 217   * This condition is for correctness
218   * only. 218   * only.
219   * This should never happen, because 219   * This should never happen, because
220   * the `host_rule` will set the host 220   * the `host_rule` will set the host
221   * type to `name` when it's empty. 221   * type to `name` when it's empty.
222   * This is correct because `reg-name` 222   * This is correct because `reg-name`
223   * accepts empty strings. 223   * accepts empty strings.
224   */ 224   */
225   BOOST_ASSERT(s.empty()); 225   BOOST_ASSERT(s.empty());
226   n = 0; 226   n = 0;
227   break; 227   break;
228   // LCOV_EXCL_STOP 228   // LCOV_EXCL_STOP
229   } 229   }
HITCBC 230   34 return make_pct_string_view_unsafe( 230   34 return make_pct_string_view_unsafe(
HITCBC 231   34 s.data(), s.size(), n); 231   34 s.data(), s.size(), n);
232   } 232   }
233   233  
234   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 234   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
235   ipv4_address 235   ipv4_address
HITCBC 236   2 authority_view:: 236   2 authority_view::
237   host_ipv4_address() const noexcept 237   host_ipv4_address() const noexcept
238   { 238   {
HITCBC 239   2 if(u_.host_type_ != 239   2 if(u_.host_type_ !=
240   urls::host_type::ipv4) 240   urls::host_type::ipv4)
HITCBC 241   1 return {}; 241   1 return {};
HITCBC 242   1 ipv4_address::bytes_type b{{}}; 242   1 ipv4_address::bytes_type b{{}};
HITCBC 243   1 detail::memcpy( 243   1 detail::memcpy(
HITCBC 244   1 &b[0], &u_.ip_addr_[0], b.size()); 244   1 &b[0], &u_.ip_addr_[0], b.size());
HITCBC 245   1 return urls::ipv4_address(b); 245   1 return urls::ipv4_address(b);
246   } 246   }
247   247  
248   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 248   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
249   ipv6_address 249   ipv6_address
HITCBC 250   2 authority_view:: 250   2 authority_view::
251   host_ipv6_address() const noexcept 251   host_ipv6_address() const noexcept
252   { 252   {
HITCBC 253   2 if(u_.host_type_ != 253   2 if(u_.host_type_ !=
254   urls::host_type::ipv6) 254   urls::host_type::ipv6)
HITCBC 255   1 return {}; 255   1 return {};
HITCBC 256   1 ipv6_address::bytes_type b{{}}; 256   1 ipv6_address::bytes_type b{{}};
HITCBC 257   1 detail::memcpy( 257   1 detail::memcpy(
HITCBC 258   1 &b[0], &u_.ip_addr_[0], b.size()); 258   1 &b[0], &u_.ip_addr_[0], b.size());
HITCBC 259   1 return urls::ipv6_address(b); 259   1 return urls::ipv6_address(b);
260   } 260   }
261   261  
262   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 262   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
263   core::string_view 263   core::string_view
HITCBC 264   2 authority_view:: 264   2 authority_view::
265   host_ipvfuture() const noexcept 265   host_ipvfuture() const noexcept
266   { 266   {
HITCBC 267   2 if(u_.host_type_ != 267   2 if(u_.host_type_ !=
268   urls::host_type::ipvfuture) 268   urls::host_type::ipvfuture)
HITCBC 269   1 return {}; 269   1 return {};
HITCBC 270   1 core::string_view s = u_.get(id_host); 270   1 core::string_view s = u_.get(id_host);
HITCBC 271   1 BOOST_ASSERT(s.size() >= 6); 271   1 BOOST_ASSERT(s.size() >= 6);
HITCBC 272   1 BOOST_ASSERT(s.front() == '['); 272   1 BOOST_ASSERT(s.front() == '[');
HITCBC 273   1 BOOST_ASSERT(s.back() == ']'); 273   1 BOOST_ASSERT(s.back() == ']');
HITCBC 274   1 s = s.substr(1, s.size() - 2); 274   1 s = s.substr(1, s.size() - 2);
HITCBC 275   1 return s; 275   1 return s;
276   } 276   }
277   277  
278   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 278   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
279   pct_string_view 279   pct_string_view
HITCBC 280   3 authority_view:: 280   3 authority_view::
281   encoded_host_name() const noexcept 281   encoded_host_name() const noexcept
282   { 282   {
HITCBC 283   3 if(u_.host_type_ != 283   3 if(u_.host_type_ !=
284   urls::host_type::name) 284   urls::host_type::name)
HITCBC 285   1 return {}; 285   1 return {};
HITCBC 286   2 return u_.pct_get(id_host); 286   2 return u_.pct_get(id_host);
287   } 287   }
288   288  
289   //------------------------------------------------ 289   //------------------------------------------------
290   // 290   //
291   // Port 291   // Port
292   // 292   //
293   //------------------------------------------------ 293   //------------------------------------------------
294   294  
295   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 295   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
296   bool 296   bool
HITCBC 297   640 authority_view:: 297   640 authority_view::
298   has_port() const noexcept 298   has_port() const noexcept
299   { 299   {
HITCBC 300   640 auto const n = u_.len(id_port); 300   640 auto const n = u_.len(id_port);
HITCBC 301   640 if(n == 0) 301   640 if(n == 0)
HITCBC 302   348 return false; 302   348 return false;
HITCBC 303   292 BOOST_ASSERT( 303   292 BOOST_ASSERT(
304   u_.get(id_port).starts_with(':')); 304   u_.get(id_port).starts_with(':'));
HITCBC 305   292 return true; 305   292 return true;
306   } 306   }
307   307  
308   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 308   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
309   core::string_view 309   core::string_view
HITCBC 310   115 authority_view:: 310   115 authority_view::
311   port() const noexcept 311   port() const noexcept
312   { 312   {
HITCBC 313   115 auto s = u_.get(id_port); 313   115 auto s = u_.get(id_port);
HITCBC 314   115 if(s.empty()) 314   115 if(s.empty())
HITCBC 315   4 return s; 315   4 return s;
HITCBC 316   111 BOOST_ASSERT(has_port()); 316   111 BOOST_ASSERT(has_port());
HITCBC 317   111 return s.substr(1); 317   111 return s.substr(1);
318   } 318   }
319   319  
320   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 320   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
321   std::uint16_t 321   std::uint16_t
HITCBC 322   22 authority_view:: 322   22 authority_view::
323   port_number() const noexcept 323   port_number() const noexcept
324   { 324   {
HITCBC 325   22 BOOST_ASSERT( 325   22 BOOST_ASSERT(
326   has_port() || 326   has_port() ||
327   u_.port_number_ == 0); 327   u_.port_number_ == 0);
HITCBC 328   22 return u_.port_number_; 328   22 return u_.port_number_;
329   } 329   }
330   330  
331   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 331   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
332   pct_string_view 332   pct_string_view
HITCBC 333   10 authority_view:: 333   10 authority_view::
334   encoded_host_and_port() const noexcept 334   encoded_host_and_port() const noexcept
335   { 335   {
HITCBC 336   10 return u_.pct_get(id_host, id_end); 336   10 return u_.pct_get(id_host, id_end);
337   } 337   }
338   338  
339   //------------------------------------------------ 339   //------------------------------------------------
340   // 340   //
341   // Comparisons 341   // Comparisons
342   // 342   //
343   //------------------------------------------------ 343   //------------------------------------------------
344   344  
345   inline 345   inline
346   int 346   int
HITCBC 347   206 authority_view:: 347   206 authority_view::
348   compare(const authority_view& other) const noexcept 348   compare(const authority_view& other) const noexcept
349   { 349   {
HITCBC 350   206 auto comp = static_cast<int>(has_userinfo()) - 350   206 auto comp = static_cast<int>(has_userinfo()) -
HITCBC 351   206 static_cast<int>(other.has_userinfo()); 351   206 static_cast<int>(other.has_userinfo());
HITCBC 352   206 if ( comp != 0 ) 352   206 if ( comp != 0 )
HITCBC 353   1 return comp; 353   1 return comp;
354   354  
HITCBC 355   205 if (has_userinfo()) 355   205 if (has_userinfo())
356   { 356   {
HITCBC 357   46 comp = detail::compare_encoded( 357   46 comp = detail::compare_encoded(
HITCBC 358   23 encoded_user(), 358   23 encoded_user(),
HITCBC 359   23 other.encoded_user()); 359   23 other.encoded_user());
HITCBC 360   23 if ( comp != 0 ) 360   23 if ( comp != 0 )
HITCBC 361   7 return comp; 361   7 return comp;
362   362  
HITCBC 363   16 comp = static_cast<int>(has_password()) - 363   16 comp = static_cast<int>(has_password()) -
HITCBC 364   16 static_cast<int>(other.has_password()); 364   16 static_cast<int>(other.has_password());
HITCBC 365   16 if ( comp != 0 ) 365   16 if ( comp != 0 )
HITCBC 366   1 return comp; 366   1 return comp;
367   367  
HITCBC 368   15 if (has_password()) 368   15 if (has_password())
369   { 369   {
HITCBC 370   30 comp = detail::compare_encoded( 370   30 comp = detail::compare_encoded(
HITCBC 371   15 encoded_password(), 371   15 encoded_password(),
HITCBC 372   15 other.encoded_password()); 372   15 other.encoded_password());
HITCBC 373   15 if ( comp != 0 ) 373   15 if ( comp != 0 )
HITCBC 374   14 return comp; 374   14 return comp;
375   } 375   }
376   } 376   }
377   377  
HITCBC 378   366 comp = detail::ci_compare_encoded( 378   366 comp = detail::ci_compare_encoded(
HITCBC 379   183 encoded_host(), 379   183 encoded_host(),
HITCBC 380   183 other.encoded_host()); 380   183 other.encoded_host());
HITCBC 381   183 if ( comp != 0 ) 381   183 if ( comp != 0 )
HITCBC 382   19 return comp; 382   19 return comp;
383   383  
HITCBC 384   164 comp = static_cast<int>(has_port()) - 384   164 comp = static_cast<int>(has_port()) -
HITCBC 385   164 static_cast<int>(other.has_port()); 385   164 static_cast<int>(other.has_port());
HITCBC 386   164 if ( comp != 0 ) 386   164 if ( comp != 0 )
HITCBC 387   7 return comp; 387   7 return comp;
388   388  
HITCBC 389   157 if (has_port()) 389   157 if (has_port())
390   { 390   {
HITCBC 391   46 comp = detail::compare( 391   46 comp = detail::compare(
392   port(), 392   port(),
393   other.port()); 393   other.port());
HITCBC 394   46 if ( comp != 0 ) 394   46 if ( comp != 0 )
HITCBC 395   42 return comp; 395   42 return comp;
396   } 396   }
397   397  
HITCBC 398   115 return 0; 398   115 return 0;
399   } 399   }
400   400  
401   //------------------------------------------------ 401   //------------------------------------------------
402   402  
403   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 403   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
404   system::result<authority_view> 404   system::result<authority_view>
HITCBC 405   53 parse_authority( 405   53 parse_authority(
406   core::string_view s) noexcept 406   core::string_view s) noexcept
407   { 407   {
HITCBC 408   53 return grammar::parse(s, authority_rule); 408   53 return grammar::parse(s, authority_rule);
409   } 409   }
410   410  
411   } // urls 411   } // urls
412   } // boost 412   } // boost
413   413  
414   #endif 414   #endif