#include "framework.h" #include #include "clients/proxy.h" using namespace molo::clients; TEST(proxy, no_proxy_match_matrix) { ASSERT_TRUE(no_proxy_match("*", "anything.example.com")); ASSERT_TRUE(no_proxy_match("example.com", "example.com")); ASSERT_TRUE(no_proxy_match("example.com", "a.example.com")); ASSERT_FALSE(no_proxy_match("example.com", "example.com.evil.com")); ASSERT_TRUE(no_proxy_match(".example.com", "a.example.com")); ASSERT_TRUE(no_proxy_match(".example.com", "example.com")); ASSERT_TRUE(no_proxy_match("*.example.com", "a.example.com")); ASSERT_FALSE(no_proxy_match("*.example.com", "example.com.evil.com")); ASSERT_TRUE(no_proxy_match("10.0.0.0/8", "10.1.2.3")); ASSERT_FALSE(no_proxy_match("10.0.0.0/8", "11.0.0.1")); ASSERT_TRUE(no_proxy_match("192.168.1.0/24", "192.168.1.200")); ASSERT_FALSE(no_proxy_match("192.168.1.0/24", "192.168.2.1")); ASSERT_TRUE(no_proxy_match("127.0.0.1/32", "127.0.0.1")); ASSERT_FALSE(no_proxy_match("not a cidr/8", "10.0.0.1")); ASSERT_FALSE(no_proxy_match("", "example.com")); } TEST(proxy, ipv4_parse) { std::uint32_t out = 0; ASSERT_TRUE(parse_ipv4("127.0.0.1", out)); ASSERT_EQ(out, 0x7F000001u); ASSERT_FALSE(parse_ipv4("999.1.1.1", out)); ASSERT_FALSE(parse_ipv4("1.2.3", out)); ASSERT_FALSE(parse_ipv4("::1", out)); } TEST(proxy, select_and_bypass) { ProxyConfig config; config.http_proxy = "http://proxy:8080"; config.https_proxy = "http://proxy:8443"; config.no_proxy = {"internal.test", "10.0.0.0/8"}; ProxySelector selector(config); auto plain = selector.select(Url::parse("http://example.com/x")); ASSERT_TRUE(plain.has_value()); ASSERT_EQ(*plain, "http://proxy:8080"); auto secure = selector.select(Url::parse("https://example.com/x")); ASSERT_TRUE(secure.has_value()); ASSERT_EQ(*secure, "http://proxy:8443"); ASSERT_FALSE(selector.select(Url::parse("http://internal.test/x")).has_value()); ASSERT_FALSE(selector.select(Url::parse("http://10.9.9.9/x")).has_value()); ASSERT_TRUE(selector.is_bypassed("internal.test:8080")); } TEST(proxy, from_env) { setenv("HTTP_PROXY", "http://env:8080", 1); setenv("NO_PROXY", "localhost, 127.0.0.1", 1); unsetenv("HTTPS_PROXY"); unsetenv("https_proxy"); ProxyConfig config = ProxyConfig::from_env(); ASSERT_EQ(config.http_proxy, "http://env:8080"); ASSERT_EQ(config.no_proxy.size(), 2u); ProxySelector selector(config); ASSERT_FALSE(selector.select(Url::parse("http://localhost/x")).has_value()); auto other = selector.select(Url::parse("http://example.com/x")); ASSERT_TRUE(other.has_value()); unsetenv("HTTP_PROXY"); unsetenv("NO_PROXY"); }