#include <iostream>
#include <Windows.h>
#include <wininet.h>
BOOL EnableProxy(LPCSTR addr, UINT port, const std::wstring& issuer)
{
INTERNET_PER_CONN_OPTION_LIST option_list;
INTERNET_PER_CONN_OPTION options[3];
option_list.dwSize = sizeof(option_list);
option_list.pszConnection = NULL;
option_list.dwOptionCount = 3;
option_list.pOptions = options;
options[0].dwOption = INTERNET_PER_CONN_FLAGS;
options[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
char proxy_server[128];
_snprintf_s(proxy_server, sizeof(proxy_server) - 1, "%s:%d", addr, port);
options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
options[1].Value.pszValue = proxy_server;
options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
options[2].Value.pszValue = (LPSTR)"localhost";
if (InternetSetOption(nullptr, INTERNET_OPTION_PER_CONNECTION_OPTION, &option_list, option_list.dwSize) == TRUE)
{
const auto h_store = CertOpenSystemStoreA(0, "ROOT");
if (!issuer.empty() && h_store)
{
HINTERNET hint = InternetOpen(
"WebTestClient",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if(hint)
{
PCCERT_CONTEXT certContext = nullptr;
while(true)
{
certContext = CertFindCertificateInStore(h_store,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR_W,
issuer.c_str(),
certContext);
if (certContext)
{
auto error = GetLastError();
InternetSetOption(hint,
INTERNET_OPTION_CLIENT_CERT_CONTEXT,
(void *) certContext,
sizeof(CERT_CONTEXT));
error = GetLastError();
std::cerr << error << std::endl;
}
else
{
break;
}
}
}
}
InternetSetOption(nullptr, INTERNET_OPTION_SETTINGS_CHANGED, nullptr, 0);
InternetSetOption(nullptr, INTERNET_OPTION_REFRESH, nullptr, 0);
return TRUE;
}
else
{
return FALSE;
}
}
int main()
{
std::cout << "Hello, World!" << std::endl;
EnableProxy("localhost", 8080, L"My");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8V2luZG93cy5oPgojaW5jbHVkZSA8d2luaW5ldC5oPgoKCkJPT0wgRW5hYmxlUHJveHkoTFBDU1RSIGFkZHIsIFVJTlQgcG9ydCwgY29uc3Qgc3RkOjp3c3RyaW5nJiBpc3N1ZXIpCnsKICAgIElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUIG9wdGlvbl9saXN0OwogICAgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OIG9wdGlvbnNbM107CgogICAgb3B0aW9uX2xpc3QuZHdTaXplID0gc2l6ZW9mKG9wdGlvbl9saXN0KTsKICAgIG9wdGlvbl9saXN0LnBzekNvbm5lY3Rpb24gPSBOVUxMOwogICAgb3B0aW9uX2xpc3QuZHdPcHRpb25Db3VudCA9IDM7CiAgICBvcHRpb25fbGlzdC5wT3B0aW9ucyA9IG9wdGlvbnM7CgogICAgb3B0aW9uc1swXS5kd09wdGlvbiA9IElOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwogICAgb3B0aW9uc1swXS5WYWx1ZS5kd1ZhbHVlID0gUFJPWFlfVFlQRV9ESVJFQ1QgfCBQUk9YWV9UWVBFX1BST1hZOwoKICAgIGNoYXIgcHJveHlfc2VydmVyWzEyOF07CiAgICBfc25wcmludGZfcyhwcm94eV9zZXJ2ZXIsIHNpemVvZihwcm94eV9zZXJ2ZXIpIC0gMSwgIiVzOiVkIiwgYWRkciwgcG9ydCk7CgogICAgb3B0aW9uc1sxXS5kd09wdGlvbiA9IElOVEVSTkVUX1BFUl9DT05OX1BST1hZX1NFUlZFUjsKICAgIG9wdGlvbnNbMV0uVmFsdWUucHN6VmFsdWUgPSBwcm94eV9zZXJ2ZXI7CgogICAgb3B0aW9uc1syXS5kd09wdGlvbiA9IElOVEVSTkVUX1BFUl9DT05OX1BST1hZX0JZUEFTUzsKICAgIG9wdGlvbnNbMl0uVmFsdWUucHN6VmFsdWUgPSAoTFBTVFIpImxvY2FsaG9zdCI7CgogICAgaWYgKEludGVybmV0U2V0T3B0aW9uKG51bGxwdHIsIElOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04sICZvcHRpb25fbGlzdCwgb3B0aW9uX2xpc3QuZHdTaXplKSA9PSBUUlVFKQogICAgewogICAgICAgIGNvbnN0IGF1dG8gaF9zdG9yZSA9IENlcnRPcGVuU3lzdGVtU3RvcmVBKDAsICJST09UIik7CiAgICAgICAgaWYgKCFpc3N1ZXIuZW1wdHkoKSAmJiBoX3N0b3JlKQogICAgICAgIHsKICAgICAgICAgICAgSElOVEVSTkVUIGhpbnQgPSBJbnRlcm5ldE9wZW4oCiAgICAgICAgICAgICAgICAgICAgIldlYlRlc3RDbGllbnQiLAogICAgICAgICAgICAgICAgICAgIElOVEVSTkVUX09QRU5fVFlQRV9QUkVDT05GSUcsCiAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICAgICBpZihoaW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQQ0NFUlRfQ09OVEVYVCBjZXJ0Q29udGV4dCA9IG51bGxwdHI7CiAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlcnRDb250ZXh0ID0gQ2VydEZpbmRDZXJ0aWZpY2F0ZUluU3RvcmUoaF9zdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQVNOX0VOQ09ESU5HIHwgUEtDU183X0FTTl9FTkNPRElORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJUX0ZJTkRfU1VCSkVDVF9TVFJfVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlci5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydENvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0Q29udGV4dCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuZXRTZXRPcHRpb24oaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJORVRfT1BUSU9OX0NMSUVOVF9DRVJUX0NPTlRFWFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGNlcnRDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ0VSVF9DT05URVhUKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgSW50ZXJuZXRTZXRPcHRpb24obnVsbHB0ciwgSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQsIG51bGxwdHIsIDApOwogICAgICAgIEludGVybmV0U2V0T3B0aW9uKG51bGxwdHIsIElOVEVSTkVUX09QVElPTl9SRUZSRVNILCBudWxscHRyLCAwKTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9Cn0KCmludCBtYWluKCkgCnsKICAgIHN0ZDo6Y291dCA8PCAiSGVsbG8sIFdvcmxkISIgPDwgc3RkOjplbmRsOwogICAgRW5hYmxlUHJveHkoImxvY2FsaG9zdCIsIDgwODAsIEwiTXkiKTsKfQ==