|
- #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(StatusCode::ProxyAuthenticationRequired_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(StatusCode::OK_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(StatusCode::Unauthorized_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(StatusCode::OK_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(StatusCode::OK_200, res->status);
- }
-
- {
- cli.set_basic_auth("hello", "bad");
- auto res = cli.Get("/basic-auth/hello/world");
- ASSERT_TRUE(res != nullptr);
- EXPECT_EQ(StatusCode::Unauthorized_401, res->status);
- }
-
- {
- cli.set_basic_auth("bad", "world");
- auto res = cli.Get("/basic-auth/hello/world");
- ASSERT_TRUE(res != nullptr);
- EXPECT_EQ(StatusCode::Unauthorized_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(StatusCode::Unauthorized_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(StatusCode::OK_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(StatusCode::Unauthorized_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(StatusCode::Unauthorized_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(StatusCode::OK_200, res->status);
- }
- {
- auto res = cli.Get("/httpbin/redirect/2");
- EXPECT_EQ(StatusCode::OK_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(StatusCode::OK_200, res->status);
- }
- }
-
- {
- int count = 10;
- while (count--) {
- auto res = cli.Get("/httpbin/get");
- EXPECT_EQ(StatusCode::OK_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
|