| 6804 | } |
| 6805 | |
| 6806 | ada_really_inline size_t url::parse_port(std::string_view view, |
| 6807 | bool check_trailing_content) noexcept { |
| 6808 | ada_log("parse_port('", view, "') ", view.size()); |
| 6809 | if (!view.empty() && view[0] == '-') { |
| 6810 | ada_log("parse_port: view[0] == '0' && view.size() > 1"); |
| 6811 | is_valid = false; |
| 6812 | return 0; |
| 6813 | } |
| 6814 | uint16_t parsed_port{}; |
| 6815 | auto r = std::from_chars(view.data(), view.data() + view.size(), parsed_port); |
| 6816 | if (r.ec == std::errc::result_out_of_range) { |
| 6817 | ada_log("parse_port: r.ec == std::errc::result_out_of_range"); |
| 6818 | is_valid = false; |
| 6819 | return 0; |
| 6820 | } |
| 6821 | ada_log("parse_port: ", parsed_port); |
| 6822 | const auto consumed = size_t(r.ptr - view.data()); |
| 6823 | ada_log("parse_port: consumed ", consumed); |
| 6824 | if (check_trailing_content) { |
| 6825 | is_valid &= |
| 6826 | (consumed == view.size() || view[consumed] == '/' || |
| 6827 | view[consumed] == '?' || (is_special() && view[consumed] == '\\')); |
| 6828 | } |
| 6829 | ada_log("parse_port: is_valid = ", is_valid); |
| 6830 | if (is_valid) { |
| 6831 | // scheme_default_port can return 0, and we should allow 0 as a base port. |
| 6832 | auto default_port = scheme_default_port(); |
| 6833 | bool is_port_valid = (default_port == 0 && parsed_port == 0) || |
| 6834 | (default_port != parsed_port); |
| 6835 | port = (r.ec == std::errc() && is_port_valid) ? std::optional(parsed_port) |
| 6836 | : std::nullopt; |
| 6837 | } |
| 6838 | return consumed; |
| 6839 | } |
| 6840 | |
| 6841 | } // namespace ada |
| 6842 |
no test coverage detected