uses winhttp_tlb;
...
begin
DWORD ChooseAuthScheme(DWORD dwSupportedSchemes)
begin
if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_NEGOTIATE) then
return WINHTTP_AUTH_SCHEME_NEGOTIATE
else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_NTLM) then
return WINHTTP_AUTH_SCHEME_NTLM
else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_PASSPORT) then
return WINHTTP_AUTH_SCHEME_PASSPORT
else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_DIGEST) then
return WINHTTP_AUTH_SCHEME_DIGEST
else
return 0;
end;
struct SWinHttpSampleGet
begin
LPCWSTR szServer;
LPCWSTR szPath;
BOOL fUseSSL;
LPCWSTR szServerUsername;
LPCWSTR szServerPassword;
LPCWSTR szProxyUsername;
LPCWSTR szProxyPassword;
end;
void WinHttpAuthSample(IN SWinHttpSampleGet * pGetRequest)
begin
DWORD dwStatusCode := 0;
DWORD dwSupportedSchemes;
DWORD dwFirstScheme;
DWORD dwSelectedScheme;
DWORD dwTarget;
DWORD dwLastStatus := 0;
DWORD dwSize := sizeof(DWORD);
BOOL bResults := FALSE;
BOOL bDone := FALSE;
DWORD dwProxyAuthScheme := 0;
HINTERNET hSession := NULL, hConnect := NULL, hRequest := NULL;
hSession := WinHttpOpen(L " WinHTTP Example / 1.0 ",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
INTERNET_PORT nPort := (pGetRequest - > fUseSSL)
? INTERNET_DEFAULT_HTTPS_PORT: INTERNET_DEFAULT_HTTP_PORT;
if (hSession) then
hConnect := WinHttpConnect(hSession, pGetRequest - > szServer, nPort, 0);
if (hConnect) then
hRequest := WinHttpOpenRequest(hConnect, L " GET ",
pGetRequest - > szPath, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, (pGetRequest - > fUseSSL)
? WINHTTP_FLAG_SECURE: 0);
if (hRequest = = NULL) then
bDone := TRUE;
while not(bDone) do
begin
if (dwProxyAuthScheme not = 0)bResults = WinHttpSetCredentials(hRequest,
WINHTTP_AUTH_TARGET_PROXY, dwProxyAuthScheme,
pGetRequest - > szProxyUsername, pGetRequest - > szProxyPassword, NULL);
bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
if (bResults) then
bResults = WinHttpReceiveResponse(hRequest, NULL);
if (not bResults and GetLastError() = = ERROR_WINHTTP_RESEND_REQUEST) then
continue;
if (bResults) then
bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE or
WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL);
if (bResults) then
begin
switch(dwStatusCode)
begin
case 200: begin printf
(" The resource was successfully retrieved.\ n ");
bDone := TRUE;
break;
end;
case 401:
begin
printf(" The server requires authentication.Sending
credentials .. .\ n ");
bResults := WinHttpQueryAuthSchemes(hRequest,
&dwSupportedSchemes, &dwFirstScheme, &dwTarget);
if (bResults) then
begin
dwSelectedScheme := ChooseAuthScheme(dwSupportedSchemes);
if (dwSelectedScheme = = 0) then
bDone := TRUE
else
bResults := WinHttpSetCredentials(hRequest, dwTarget,
dwSelectedScheme, pGetRequest - > szServerUsername,
pGetRequest - > szServerPassword, NULL);
end;
if (dwLastStatus = = 401) then
bDone := TRUE;
break;
end;
case 407: printf(" The proxy requires authentication.Sending
credentials .. .\ n ");
bResults = WinHttpQueryAuthSchemes(hRequest, &dwSupportedSchemes,
&dwFirstScheme, &dwTarget);
if (bResults) then dwProxyAuthScheme :=
ChooseAuthScheme(dwSupportedSchemes);
if (dwLastStatus = = 407) then bDone := TRUE;
break;
default:
printf(" Error.Status code % d returned.\ n ", dwStatusCode);
bDone := TRUE;
end;
end;
dwLastStatus := dwStatusCode;
if (not bResults) then bDone := TRUE;
end;
if (not bResults) then begin DWORD dwLastError = GetLastError();
printf(" Error % d has occurred.\ n ", dwLastError);
end;
if (hRequest) then WinHttpCloseHandle(hRequest);
if (hConnect) then WinHttpCloseHandle(hConnect);
if (hSession) then WinHttpCloseHandle(hSession);
end;
end;