| #include <future> |
| #include <gtest/gtest.h> |
| #include <httplib.h> |
| |
| using namespace std; |
| using namespace httplib; |
| |
| template <typename T> |
| void ProxyTest(T& cli, bool basic) { |
| cli.set_proxy("localhost", basic ? 3128 : 3129); |
| auto res = cli.Get("/httpbin/get"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(407, res->status); |
| } |
| |
| TEST(ProxyTest, NoSSLBasic) { |
| Client cli("nghttp2.org"); |
| ProxyTest(cli, true); |
| } |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| TEST(ProxyTest, SSLBasic) { |
| SSLClient cli("nghttp2.org"); |
| ProxyTest(cli, true); |
| } |
| |
| TEST(ProxyTest, NoSSLDigest) { |
| Client cli("nghttp2.org"); |
| ProxyTest(cli, false); |
| } |
| |
| TEST(ProxyTest, SSLDigest) { |
| SSLClient cli("nghttp2.org"); |
| ProxyTest(cli, false); |
| } |
| #endif |
| |
| // ---------------------------------------------------------------------------- |
| |
| template <typename T> |
| void RedirectProxyText(T& cli, const char *path, bool basic) { |
| cli.set_proxy("localhost", basic ? 3128 : 3129); |
| if (basic) { |
| cli.set_proxy_basic_auth("hello", "world"); |
| } else { |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| cli.set_proxy_digest_auth("hello", "world"); |
| #endif |
| } |
| cli.set_follow_location(true); |
| |
| auto res = cli.Get(path); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(200, res->status); |
| } |
| |
| TEST(RedirectTest, HTTPBinNoSSLBasic) { |
| Client cli("nghttp2.org"); |
| RedirectProxyText(cli, "/httpbin/redirect/2", true); |
| } |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| TEST(RedirectTest, HTTPBinNoSSLDigest) { |
| Client cli("nghttp2.org"); |
| RedirectProxyText(cli, "/httpbin/redirect/2", false); |
| } |
| |
| TEST(RedirectTest, HTTPBinSSLBasic) { |
| SSLClient cli("nghttp2.org"); |
| RedirectProxyText(cli, "/httpbin/redirect/2", true); |
| } |
| |
| TEST(RedirectTest, HTTPBinSSLDigest) { |
| SSLClient cli("nghttp2.org"); |
| RedirectProxyText(cli, "/httpbin/redirect/2", false); |
| } |
| #endif |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| TEST(RedirectTest, YouTubeNoSSLBasic) { |
| Client cli("youtube.com"); |
| RedirectProxyText(cli, "/", true); |
| } |
| |
| TEST(RedirectTest, DISABLED_YouTubeNoSSLDigest) { |
| Client cli("youtube.com"); |
| RedirectProxyText(cli, "/", false); |
| } |
| |
| TEST(RedirectTest, YouTubeSSLBasic) { |
| SSLClient cli("youtube.com"); |
| RedirectProxyText(cli, "/", true); |
| } |
| |
| TEST(RedirectTest, YouTubeSSLDigest) { |
| SSLClient cli("youtube.com"); |
| RedirectProxyText(cli, "/", false); |
| } |
| #endif |
| |
| // ---------------------------------------------------------------------------- |
| |
| template <typename T> |
| void BaseAuthTestFromHTTPWatch(T& cli) { |
| cli.set_proxy("localhost", 3128); |
| cli.set_proxy_basic_auth("hello", "world"); |
| |
| { |
| auto res = cli.Get("/basic-auth/hello/world"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(401, res->status); |
| } |
| |
| { |
| auto res = |
| cli.Get("/basic-auth/hello/world", |
| {make_basic_authentication_header("hello", "world")}); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ("{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n", res->body); |
| EXPECT_EQ(200, res->status); |
| } |
| |
| { |
| cli.set_basic_auth("hello", "world"); |
| auto res = cli.Get("/basic-auth/hello/world"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ("{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n", res->body); |
| EXPECT_EQ(200, res->status); |
| } |
| |
| { |
| cli.set_basic_auth("hello", "bad"); |
| auto res = cli.Get("/basic-auth/hello/world"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(401, res->status); |
| } |
| |
| { |
| cli.set_basic_auth("bad", "world"); |
| auto res = cli.Get("/basic-auth/hello/world"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(401, res->status); |
| } |
| } |
| |
| TEST(BaseAuthTest, NoSSL) { |
| Client cli("httpbin.org"); |
| BaseAuthTestFromHTTPWatch(cli); |
| } |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| TEST(BaseAuthTest, SSL) { |
| SSLClient cli("httpbin.org"); |
| BaseAuthTestFromHTTPWatch(cli); |
| } |
| #endif |
| |
| // ---------------------------------------------------------------------------- |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| template <typename T> |
| void DigestAuthTestFromHTTPWatch(T& cli) { |
| cli.set_proxy("localhost", 3129); |
| cli.set_proxy_digest_auth("hello", "world"); |
| |
| { |
| auto res = cli.Get("/digest-auth/auth/hello/world"); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(401, res->status); |
| } |
| |
| { |
| std::vector<std::string> paths = { |
| "/digest-auth/auth/hello/world/MD5", |
| "/digest-auth/auth/hello/world/SHA-256", |
| "/digest-auth/auth/hello/world/SHA-512", |
| "/digest-auth/auth-int/hello/world/MD5", |
| }; |
| |
| cli.set_digest_auth("hello", "world"); |
| for (auto path : paths) { |
| auto res = cli.Get(path.c_str()); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ("{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n", res->body); |
| EXPECT_EQ(200, res->status); |
| } |
| |
| cli.set_digest_auth("hello", "bad"); |
| for (auto path : paths) { |
| auto res = cli.Get(path.c_str()); |
| ASSERT_TRUE(res != nullptr); |
| EXPECT_EQ(401, res->status); |
| } |
| |
| // NOTE: Until httpbin.org fixes issue #46, the following test is commented |
| // out. Please see https://httpbin.org/digest-auth/auth/hello/world |
| // cli.set_digest_auth("bad", "world"); |
| // for (auto path : paths) { |
| // auto res = cli.Get(path.c_str()); |
| // ASSERT_TRUE(res != nullptr); |
| // EXPECT_EQ(401, res->status); |
| // } |
| } |
| } |
| |
| TEST(DigestAuthTest, SSL) { |
| SSLClient cli("httpbin.org"); |
| DigestAuthTestFromHTTPWatch(cli); |
| } |
| |
| TEST(DigestAuthTest, NoSSL) { |
| Client cli("httpbin.org"); |
| DigestAuthTestFromHTTPWatch(cli); |
| } |
| #endif |
| |
| // ---------------------------------------------------------------------------- |
| |
| template <typename T> |
| void KeepAliveTest(T& cli, bool basic) { |
| cli.set_proxy("localhost", basic ? 3128 : 3129); |
| if (basic) { |
| cli.set_proxy_basic_auth("hello", "world"); |
| } else { |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| cli.set_proxy_digest_auth("hello", "world"); |
| #endif |
| } |
| |
| cli.set_follow_location(true); |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| cli.set_digest_auth("hello", "world"); |
| #endif |
| |
| { |
| auto res = cli.Get("/httpbin/get"); |
| EXPECT_EQ(200, res->status); |
| } |
| { |
| auto res = cli.Get("/httpbin/redirect/2"); |
| EXPECT_EQ(200, res->status); |
| } |
| |
| { |
| std::vector<std::string> paths = { |
| "/httpbin/digest-auth/auth/hello/world/MD5", |
| "/httpbin/digest-auth/auth/hello/world/SHA-256", |
| "/httpbin/digest-auth/auth/hello/world/SHA-512", |
| "/httpbin/digest-auth/auth-int/hello/world/MD5", |
| }; |
| |
| for (auto path: paths) { |
| auto res = cli.Get(path.c_str()); |
| EXPECT_EQ("{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n", res->body); |
| EXPECT_EQ(200, res->status); |
| } |
| } |
| |
| { |
| int count = 10; |
| while (count--) { |
| auto res = cli.Get("/httpbin/get"); |
| EXPECT_EQ(200, res->status); |
| } |
| } |
| } |
| |
| #ifdef CPPHTTPLIB_OPENSSL_SUPPORT |
| TEST(KeepAliveTest, NoSSLWithBasic) { |
| Client cli("nghttp2.org"); |
| KeepAliveTest(cli, true); |
| } |
| |
| TEST(KeepAliveTest, SSLWithBasic) { |
| SSLClient cli("nghttp2.org"); |
| KeepAliveTest(cli, true); |
| } |
| |
| TEST(KeepAliveTest, NoSSLWithDigest) { |
| Client cli("nghttp2.org"); |
| KeepAliveTest(cli, false); |
| } |
| |
| TEST(KeepAliveTest, SSLWithDigest) { |
| SSLClient cli("nghttp2.org"); |
| KeepAliveTest(cli, false); |
| } |
| #endif |