1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
#include <gtest/gtest.h>
#include <chrono>
#include <stdlib.h>
#include <string>
#include <sstream>
#include "cpr/cpr.h"
// TODO: This uses public servers for proxies and endpoints. This should be replaced with a source
// code implementation inside server.cpp
// NOTES:
// * For no-proxy testing need to run the tests with direct connection to the internet
// * List of free proxies for testing can be found at https://proxy-list.org/english/index.php
// Example: #define HTTP_PROXY "http://162.223.90.130:80"
#define HTTP_PROXY "51.159.4.98:80"
#define HTTPS_PROXY "51.104.53.182:8000"
using namespace cpr;
TEST(ProxyTests, SingleProxyTest) {
Url url{"http://www.httpbin.org/get"};
Response response = cpr::Get(url, Proxies{{"http", HTTP_PROXY}});
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
TEST(ProxyTests, MultipleProxyHttpTest) {
Url url{"http://www.httpbin.org/get"};
Response response = cpr::Get(url, Proxies{{"http", HTTP_PROXY}, {"https", HTTPS_PROXY}});
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
// TODO: These should be fixed after a source code implementation of an HTTPS proxy
#if defined(false)
TEST(ProxyTests, ProxyHttpsTest) {
Url url{"https://www.httpbin.org/get"};
Response response = cpr::Get(url, Proxies{{"https", HTTPS_PROXY}});
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
TEST(ProxyTests, MultipleProxyHttpsTest) {
Url url{"https://www.httpbin.org/get"};
Response response = cpr::Get(url, Proxies{{"http", HTTP_PROXY}, {"https", HTTPS_PROXY}});
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
#endif
TEST(ProxyTests, CopyProxyTest) {
Url url{"http://www.httpbin.org/get"};
Proxies proxies{{"http", HTTP_PROXY}};
Response response = cpr::Get(url, proxies);
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
TEST(ProxyTests, ProxySessionTest) {
Url url{"http://www.httpbin.org/get"};
Session session;
session.SetUrl(url);
session.SetProxies(Proxies{{"http", HTTP_PROXY}});
Response response = session.Get();
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
TEST(ProxyTests, ReferenceProxySessionTest) {
Url url{"http://www.httpbin.org/get"};
Proxies proxies{{"http", HTTP_PROXY}};
Session session;
session.SetUrl(url);
session.SetProxies(proxies);
session.SetTimeout(std::chrono::seconds(10));
Response response = session.Get();
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
TEST(ProxyTests, NoProxyTest) {
setenv("NO_PROXY", "httpbin.org", 1);
try {
Url url{"http://www.httpbin.org/get"};
Proxies proxies{{"http", HTTP_PROXY}, {"no_proxy", ""}};
Session session;
session.SetUrl(url);
session.SetProxies(proxies);
session.SetTimeout(std::chrono::seconds(10));
Response response = session.Get();
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
// check that access was performed through the proxy
std::string proxy_ip = HTTP_PROXY;
if (proxy_ip[0] == 'h') {
// drop protocol:
proxy_ip = proxy_ip.substr(proxy_ip.find(':') + 3);
}
// drop port:
proxy_ip = proxy_ip.substr(0, proxy_ip.find(':'));
// find "origin": "ip" in response:
bool found = false;
std::istringstream body(response.text);
std::string line;
while (std::getline(body, line)) {
// example: "origin": "123.456.789.123"
if (line.find("\"origin\":") != std::string::npos) {
found = line.find(proxy_ip) != std::string::npos;
break;
}
}
EXPECT_TRUE(found);
} catch (...) {
unsetenv("NO_PROXY");
throw;
}
unsetenv("NO_PROXY");
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
|