mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-04 06:14:21 +07:00
Extract parse_int_in_range from parse_port
parse_port and the NO_PROXY CIDR prefix parsing each repeated the same from_chars call, full-consumption check and range check. Move that into a parse_int_in_range helper and use it in both places.
This commit is contained in:
@@ -831,16 +831,21 @@ inline from_chars_result<double> from_chars(const char *first, const char *last,
|
||||
return {p, std::errc{}};
|
||||
}
|
||||
|
||||
inline bool parse_port(const char *s, size_t len, int &port) {
|
||||
inline bool parse_int_in_range(const char *s, size_t len, int lo, int hi,
|
||||
int &out) {
|
||||
int val = 0;
|
||||
auto r = from_chars(s, s + len, val);
|
||||
if (r.ec != std::errc{} || r.ptr != s + len || val < 1 || val > 65535) {
|
||||
if (r.ec != std::errc{} || r.ptr != s + len || val < lo || val > hi) {
|
||||
return false;
|
||||
}
|
||||
port = val;
|
||||
out = val;
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool parse_port(const char *s, size_t len, int &port) {
|
||||
return parse_int_in_range(s, len, 1, 65535, port);
|
||||
}
|
||||
|
||||
inline bool parse_port(const std::string &s, int &port) {
|
||||
return parse_port(s.data(), s.size(), port);
|
||||
}
|
||||
@@ -12470,14 +12475,10 @@ inline bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out) {
|
||||
struct in_addr v4;
|
||||
if (inet_pton(AF_INET, addr_part.c_str(), &v4) == 1) {
|
||||
int prefix = 32;
|
||||
if (!prefix_part.empty()) {
|
||||
auto r = from_chars(prefix_part.data(),
|
||||
prefix_part.data() + prefix_part.size(), prefix);
|
||||
if (r.ec != std::errc{} ||
|
||||
r.ptr != prefix_part.data() + prefix_part.size()) {
|
||||
return false;
|
||||
}
|
||||
if (prefix < 0 || prefix > 32) { return false; }
|
||||
if (!prefix_part.empty() &&
|
||||
!parse_int_in_range(prefix_part.data(), prefix_part.size(), 0, 32,
|
||||
prefix)) {
|
||||
return false;
|
||||
}
|
||||
out.kind = NoProxyKind::IPv4Cidr;
|
||||
std::memcpy(out.net.data(), &v4, sizeof(v4));
|
||||
@@ -12489,14 +12490,10 @@ inline bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out) {
|
||||
struct in6_addr v6;
|
||||
if (inet_pton(AF_INET6, addr_part.c_str(), &v6) == 1) {
|
||||
int prefix = 128;
|
||||
if (!prefix_part.empty()) {
|
||||
auto r = from_chars(prefix_part.data(),
|
||||
prefix_part.data() + prefix_part.size(), prefix);
|
||||
if (r.ec != std::errc{} ||
|
||||
r.ptr != prefix_part.data() + prefix_part.size()) {
|
||||
return false;
|
||||
}
|
||||
if (prefix < 0 || prefix > 128) { return false; }
|
||||
if (!prefix_part.empty() &&
|
||||
!parse_int_in_range(prefix_part.data(), prefix_part.size(), 0, 128,
|
||||
prefix)) {
|
||||
return false;
|
||||
}
|
||||
out.kind = NoProxyKind::IPv6Cidr;
|
||||
std::memcpy(out.net.data(), &v6, sizeof(v6));
|
||||
|
||||
Reference in New Issue
Block a user