[cpp-sp] 02/05: WinHttpCerts
Rod Widdowson
rdw at steadingsoftware.com
Thu May 8 15:27:27 UTC 2025
This is an automated email from the git hooks/post-receive script.
rdw pushed a commit to branch dev/SPPSP-8-playpen
in repository cpp-sp.
View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=14330daafc1c2a5851dd6e9794f44065de9e35f6
commit 14330daafc1c2a5851dd6e9794f44065de9e35f6
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Tue Apr 29 20:10:25 2025 +0100
WinHttpCerts
---
Projects/WinHttpProject/WinHttpProject.cpp | 185 +++++++++++++++++++++
Projects/WinHttpProject/WinHttpProject.vcxproj | 139 ++++++++++++++++
.../WinHttpProject/WinHttpProject.vcxproj.filters | 22 +++
3 files changed, 346 insertions(+)
diff --git a/Projects/WinHttpProject/WinHttpProject.cpp b/Projects/WinHttpProject/WinHttpProject.cpp
new file mode 100644
index 00000000..63ad25ee
--- /dev/null
+++ b/Projects/WinHttpProject/WinHttpProject.cpp
@@ -0,0 +1,185 @@
+// WinHttpProject.cpp : This file contains the 'main' function. Program execution begins and ends there.
+//
+
+#include <iostream>
+
+
+#include <Windows.h>
+#include <winhttp.h>
+
+using namespace std;
+
+//static WINHTTP_STATUS_CALLBACK Callback;
+
+static void Callback(
+ HINTERNET hInternet,
+ DWORD_PTR dwContext,
+ DWORD dwInternetStatus,
+ LPVOID lpvStatusInformation,
+ DWORD dwStatusInformationLength)
+{
+ PCCERT_CONTEXT pCert = NULL;
+ DWORD dwSize = sizeof(pCert);
+ cout << "Handle " << hex << hInternet <<endl;
+ cout << "Context " << dec << dwContext << endl;
+ switch (dwInternetStatus) {
+ case WINHTTP_CALLBACK_STATUS_SENDING_REQUEST:
+ wcout << L"Sending Request (" << dwInternetStatus << L") " << endl;
+ if (!WinHttpQueryOption(hInternet, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &pCert, &dwSize)) {
+ cout << "Gack " << GetLastError() << endl;
+ } else {
+ CHAR buffer[1024];
+ CertNameToStrA(X509_ASN_ENCODING, &pCert->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, buffer, sizeof(buffer));
+ cout << "Subject name " << buffer << endl;
+ CertFreeCertificateContext(pCert);
+ }
+ break;
+
+ case WINHTTP_CALLBACK_STATUS_READ_COMPLETE:
+ cout << "Read Complete " << dwStatusInformationLength <<endl;
+ cout << "Data " << (PCHAR*) lpvStatusInformation;
+ break;
+ default:
+ cout << "Unknow status " << dwInternetStatus << endl;
+ break;
+ }
+}
+
+static
+wstring
+Utf8ToUtf16(string InputString) {
+ DWORD sizeNeeded = MultiByteToWideChar(CP_UTF8, 0, InputString.c_str(), -1, nullptr, 0);
+
+ LPWSTR output = new WCHAR[sizeNeeded +1];
+
+ ZeroMemory(output, sizeNeeded+1);
+
+ if (MultiByteToWideChar(CP_UTF8, 0, InputString.c_str(), -1, output, sizeNeeded) == 0) {
+ cerr << "MultiByteToWideChar failure: " << GetLastError() << endl;
+ throw runtime_error("WinHHHTP failed to initialize");
+ }
+
+ wstring result(output);
+ delete[] output;
+
+ return result;
+}
+
+int main()
+{
+ string url("https://shibboleth.net/downloads/PGP_KEYS");
+
+ wstring wUrl(Utf8ToUtf16(url));
+ URL_COMPONENTS components = { 0 };
+ components.dwStructSize= sizeof(components);
+ components.dwHostNameLength = -1;
+ components.dwUrlPathLength = -1;
+ if (!WinHttpCrackUrl(wUrl.c_str(), 0, 0, &components)) {
+ cerr << "WinHttpCrackUrl failure: " << GetLastError() << endl;
+ throw runtime_error("WinHHHTP failed to initialize");
+ }
+ wstring host(components.lpszHostName, components.dwHostNameLength);
+ wstring baseUrl(components.lpszUrlPath, components.dwUrlPathLength);
+
+ DWORD dwSize = 0;
+ DWORD dwDownloaded = 0;
+ LPSTR pszOutBuffer;
+ BOOL bResults = FALSE;
+ HINTERNET hSession = NULL,
+ hConnect = NULL,
+ hRequest = NULL;
+
+ // Use WinHttpOpen to obtain a session handle.
+ hSession = WinHttpOpen(L"WinHTTP Example/1.0",
+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
+ WINHTTP_NO_PROXY_NAME,
+ WINHTTP_NO_PROXY_BYPASS, 0);
+
+ if (hSession) {
+ // arrange to be called back so e
+ if (WINHTTP_INVALID_STATUS_CALLBACK == WinHttpSetStatusCallback(hSession, Callback, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, NULL)) {
+ cerr << "Urk " << GetLastError() << endl;
+ return 1;
+ }
+
+ // Specify an HTTP server.
+ hConnect = WinHttpConnect(hSession, host.c_str(),
+ INTERNET_DEFAULT_HTTPS_PORT, 0);
+
+ }
+
+ // Create an HTTP request handle.
+ if (hConnect)
+ hRequest = WinHttpOpenRequest(hConnect, L"GET", baseUrl.c_str(),
+ NULL, WINHTTP_NO_REFERER,
+ WINHTTP_DEFAULT_ACCEPT_TYPES,
+ WINHTTP_FLAG_SECURE);
+
+ // Send a request.
+ if (hRequest)
+ bResults = WinHttpSendRequest(hRequest,
+ WINHTTP_NO_ADDITIONAL_HEADERS, 0,
+ WINHTTP_NO_REQUEST_DATA, 0,
+ 0, 0);
+
+
+ // End the request.
+ if (bResults)
+ bResults = WinHttpReceiveResponse(hRequest, NULL);
+
+ // Keep checking for data until there is nothing left.
+ if (bResults)
+ {
+ do
+ {
+ // Check for available data.
+ dwSize = 0;
+ if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
+ printf("Error %u in WinHttpQueryDataAvailable.\n",
+ GetLastError());
+
+ // Allocate space for the buffer.
+ pszOutBuffer = new char[dwSize + 1];
+ if (!pszOutBuffer)
+ {
+ printf("Out of memory\n");
+ dwSize = 0;
+ }
+ else
+ {
+ // Read the data.
+ ZeroMemory(pszOutBuffer, dwSize + 1);
+
+ if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer,
+ dwSize, &dwDownloaded))
+ printf("Error %u in WinHttpReadData.\n", GetLastError());
+ else
+ printf("%s", pszOutBuffer);
+
+ // Free the memory allocated to the buffer.
+ delete[] pszOutBuffer;
+ }
+ } while (dwSize > 0);
+ }
+
+
+ // Report any errors.
+ if (!bResults)
+ printf("Error %d has occurred.\n", GetLastError());
+
+ // Close any open handles.
+ if (hRequest) WinHttpCloseHandle(hRequest);
+ if (hConnect) WinHttpCloseHandle(hConnect);
+ if (hSession) WinHttpCloseHandle(hSession);
+}
+
+// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
+// Debug program: F5 or Debug > Start Debugging menu
+
+// Tips for Getting Started:
+// 1. Use the Solution Explorer window to add/manage files
+// 2. Use the Team Explorer window to connect to source control
+// 3. Use the Output window to see build output and other messages
+// 4. Use the Error List window to view errors
+// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
+// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
diff --git a/Projects/WinHttpProject/WinHttpProject.vcxproj b/Projects/WinHttpProject/WinHttpProject.vcxproj
new file mode 100644
index 00000000..f5c04f71
--- /dev/null
+++ b/Projects/WinHttpProject/WinHttpProject.vcxproj
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <VCProjectVersion>17.0</VCProjectVersion>
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{86b86059-3e57-4fb3-8d28-45206f540c1e}</ProjectGuid>
+ <RootNamespace>WinHttpProject</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v143</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v143</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v143</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v143</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>crypt32.lib;Winhttp.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>crypt32.lib;Winhttp.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>crypt32.lib;Winhttp.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>crypt32.lib;Winhttp.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="WinHttpProject.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/Projects/WinHttpProject/WinHttpProject.vcxproj.filters b/Projects/WinHttpProject/WinHttpProject.vcxproj.filters
new file mode 100644
index 00000000..aa36c5af
--- /dev/null
+++ b/Projects/WinHttpProject/WinHttpProject.vcxproj.filters
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="WinHttpProject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list