LCOV - code coverage report
Current view: top level - libs/url/src/rfc/detail/host_rule.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 52 52
Test Date: 2024-09-08 09:46:47 Functions: 100.0 % 1 1

            Line data    Source code
       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         1946 : host_rule_t::
      24              : parse(
      25              :     char const*& it,
      26              :     char const* const end
      27              :         ) const noexcept ->
      28              :     system::result<value_type>
      29              : {
      30         1946 :     value_type t;
      31              : 
      32         1946 :     if(it == end)
      33              :     {
      34              :         // empty host
      35          225 :         t.host_type =
      36              :             urls::host_type::name;
      37          225 :         return t;
      38              :     }
      39              : 
      40         1721 :     auto const it0 = it;
      41         1721 :     if(*it == '[')
      42              :     {
      43              :         // IP-literal
      44           61 :         auto rv = grammar::parse(
      45              :             it, end,
      46              :             detail::ip_literal_rule);
      47           61 :         if(! rv)
      48           24 :             return rv.error();
      49           37 :         auto v = *rv;
      50           37 :         if(v.is_ipv6)
      51              :         {
      52              :             // IPv6address
      53              :             auto const b =
      54           32 :                 v.ipv6.to_bytes();
      55           32 :             std::memcpy(
      56              :                 t.addr,
      57           32 :                 b.data(),
      58              :                 b.size());
      59           32 :             t.host_type =
      60              :                 urls::host_type::ipv6;
      61           64 :             t.match = core::string_view(
      62           32 :                 it0, it - it0);
      63           32 :             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         1660 :         auto rv = grammar::parse(
      77              :             it, end, ipv4_address_rule);
      78         1660 :         if( rv )
      79              :         {
      80           27 :             auto it02 = it;
      81           27 :             auto rv2 = grammar::parse(
      82              :                 it, end,
      83              :                 detail::reg_name_rule);
      84           53 :             if (rv2.has_value() &&
      85           26 :                 !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           21 :             it = it02;
      96              :             auto const b =
      97           21 :                 rv->to_bytes();
      98           21 :             std::memcpy(
      99              :                 t.addr,
     100           21 :                 b.data(),
     101              :                 b.size());
     102           21 :             t.host_type =
     103              :                 urls::host_type::ipv4;
     104           42 :             t.match = core::string_view(
     105           21 :                 it0, it - it0);
     106           21 :             return t;
     107              :         }
     108              : 
     109         1633 :         it = it0; // rewind
     110              :     }
     111              : 
     112              :     // reg-name
     113              :     {
     114         1633 :         auto rv = grammar::parse(
     115              :             it, end,
     116              :             detail::reg_name_rule);
     117         1633 :         if(! rv)
     118            7 :             return rv.error();
     119         1626 :         t.name = *rv;
     120         1626 :         t.host_type =
     121              :             urls::host_type::name;
     122         3252 :         t.match = core::string_view(
     123         1626 :             it0, it - it0);
     124         1626 :         return t;
     125              :     }
     126              : }
     127              : 
     128              : } // detail
     129              : } // urls
     130              : } // boost
     131              : 
        

Generated by: LCOV version 2.1