|
|
//////////////////////////////////////////////////////////////////////
// File: AuthSecureProxyStress.cpp
//
// Copyright (c) 2001 Microsoft Corporation. All Rights Reserved.
//
// Purpose:
// This file contains your implementation of the stress test function
// WinHttp_StressTest() that is called in stressMain.cpp.
//
// Steps:
// - Set your test case name in g_szStressTestName.
// - Add your test code to WinHttp_StressTest().
//
// History:
// 04/02/01 adamb Created
//
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Includes
//////////////////////////////////////////////////////////////////////
#include "stressMain.h"
//////////////////////////////////////////////////////////////////////
// Globals and constants
//////////////////////////////////////////////////////////////////////
// ************************************
// ************************************
// ** Fill in your test case name below
// **
LPSTR g_szStressTestName = "AuthSecureProxy Stressor";
//yup, they're all global
BOOL bPost = FALSE; CHAR HttpType[10] = "HTTP"; BOOL bViaProxy = FALSE; CHAR CredType[5] = "SC";
BOOL RunStress(BOOL bPost,CHAR HttpType[],BOOL bViaProxy,CHAR CredType[],int Scheme);
////////////////////////////////////////////////////////////
// Function: WinHttp_StressTest()
//
// Purpose:
// goes through all the ways of sending a request and
// picks one of those, then uses it in a request
//
// yes, it does check for the signal before starting
// runstress (one test per call).
////////////////////////////////////////////////////////////
BOOL WinHttp_StressTest() { for(int i=0; i<2; i++) { if(i==0) bPost = FALSE; else bPost = TRUE; for(int j=0; j<2; j++) { if(j==0) strcpy(HttpType, "HTTPS"); else strcpy(HttpType, "HTTP"); for(int k=0; k<2; k++) { if(k==0) bViaProxy = FALSE; else bViaProxy = TRUE; for(int l=0; l<2; l++) { if(l==0) strcpy(CredType, "SC"); else strcpy(CredType, "SO"); for(int m=0; m<4; m++) { if(!IsTimeToExitStress()) RunStress(bPost,HttpType,bViaProxy,CredType,m); else return FALSE; } } } } }
return TRUE; }
////////////////////////////////////////////////////////////
// Function: RunStress()
//
// Purpose:
// this actually runs the tests given certain inputs.
// this is called from WinHttp_StressTest.
//
////////////////////////////////////////////////////////////
BOOL RunStress(BOOL bPost,CHAR HttpType[],BOOL bViaProxy,CHAR CredType[],int Scheme) { BOOL bContinueStress = TRUE;
HINTERNET hOpen = NULL; HINTERNET hConnect = NULL; HINTERNET hRequest = NULL;
DWORD Count = 0, dwAccessType = WINHTTP_ACCESS_TYPE_NO_PROXY, dwAuthScheme=0,dwAuthTargets=0,dwOtherScheme=0,dwOpenRequestFlags=0, dwStatus=0, cbStatus=0;
LPWSTR wszHost=NULL, wszUri=NULL, wszUserName=NULL, wszPassword=NULL, wszProxy = NULL, wszProxyUserName = NULL, wszProxyPassword = NULL, wszVerb=L"GET";
INTERNET_PORT nPort = INTERNET_DEFAULT_HTTP_PORT;
LPSTR pPostData = NULL; DWORD dwPostDataLength = 0;
if(bPost) { wszVerb=L"POST"; pPostData = "If you smelllllllll what THE ROCK is cooking??? <people's eyebrow>"; dwPostDataLength = strlen(pPostData); }
if(strcmp(HttpType, "HTTPS")) { nPort = INTERNET_DEFAULT_HTTPS_PORT; dwOpenRequestFlags = WINHTTP_FLAG_SECURE; }
//if going via proxy, then ntlm/nego aren't valid, unless going over https
if(bViaProxy && ((Scheme == 0 || Scheme == 1) || strcmp(HttpType, "HTTPS")) ) { wszProxy = L"xfluke"; wszProxyUserName = L"xfluke\\proxyuser"; wszProxyPassword = L"password"; dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; }
switch(Scheme) { case 0: //basic
wszHost = L"wiredbvt"; wszUri = L"/api/Auth/Basic/echo-post-data.asp"; wszUserName = L"ApiAuth"; wszPassword = L"test1234!"; break; case 1: //digest
wszHost = L"kerby2"; wszUri = L"/digest/echo-post-data.asp"; wszUserName = L"authdigest"; wszPassword = L"digest"; break; case 2: //negotiate
wszHost = L"kerby2"; wszUri = L"/ie/negotiate/echo-post-data.asp"; wszUserName = L"kerby2\\authnego"; wszPassword = L"nego"; break; case 3: //ntlm
wszHost = L"clapton"; wszUri = L"/test/ntlm/echo-post-data.asp"; wszUserName = L"clapton\\ntlmtest"; wszPassword = L"ntlm"; break; }
LogText("Post: %u, Proxy: %u, %s, %s, Scheme: %u", bPost, bViaProxy, HttpType, CredType, Scheme);
// ***********************************
// ** WinHttpOpen
// **
hOpen = WinHttpOpen ( L"Stress Test", dwAccessType, wszProxy, NULL, 0 );
if(hOpen == NULL) { LogText("WinHttpOpen failed with error %u.", GetLastError()); goto Exit; }
// ***********************************
// ** WinHttpConnect
// **
hConnect = WinHttpConnect ( hOpen, wszHost, nPort, 0 );
if(hConnect==NULL) { LogText("WinHttpConnect failed with error %u.", GetLastError()); goto Exit; }
hRequest = WinHttpOpenRequest ( hConnect, wszVerb, wszUri, NULL, NULL, NULL, dwOpenRequestFlags );
if(hRequest==NULL) { LogText("WinHttpOpenRequest failed with error %u.", GetLastError()); goto Exit; }
Resend:
if( Count++>3) // making sure that we don't have infinite looping
{ bContinueStress=FALSE; goto Exit; }
// Send request.
if(!WinHttpSendRequest ( hRequest, // request handle
NULL, // header string
0, // header length
(PVOID) pPostData, // post data
dwPostDataLength, // post data length
dwPostDataLength, // total post length
0 // flags
)) { LogText("WinHttpSendRequest failed with error %u.", GetLastError()); goto Exit; }
if (!WinHttpReceiveResponse(hRequest, NULL)) { LogText("WinHttpReceiveResponse failed with error %u.", GetLastError()); goto Exit; }
cbStatus = sizeof(dwStatus); WinHttpQueryHeaders ( hRequest, WINHTTP_QUERY_FLAG_NUMBER | WINHTTP_QUERY_STATUS_CODE, NULL, &dwStatus, &cbStatus, NULL );
switch( dwStatus ) { case 200: break; case 401: if(strcmp(CredType, "SC")) { if(!WinHttpQueryAuthSchemes ( hRequest, &dwOtherScheme, &dwAuthScheme, &dwAuthTargets )) { LogText("WinHttpQueryAuthSchemes failed with error %u.", GetLastError()); goto Exit; }
if(!WinHttpSetCredentials ( hRequest, dwAuthTargets, dwAuthScheme, wszUserName, wszPassword, (PVOID) NULL )) { LogText("WinHttpSetCredentials failed with error %u.", GetLastError()); goto Exit; } } else { if(!WinHttpSetOption ( hRequest, WINHTTP_OPTION_USERNAME, (PVOID) wszUserName, wcslen(wszUserName) )) { LogText("WinHttpSetOption failed with error %u.", GetLastError()); goto Exit; }
if(!WinHttpSetOption ( hRequest, WINHTTP_OPTION_PASSWORD, (PVOID) wszPassword, wcslen(wszPassword) )) { LogText("WinHttpSetOption failed with error %u.", GetLastError()); goto Exit; } } goto Resend; break;
case 407: if(strcmp(CredType, "SC")) { if(!WinHttpQueryAuthSchemes ( hRequest, &dwOtherScheme, &dwAuthScheme, &dwAuthTargets )) { LogText("WinHttpQueryAuthSchemes failed with error %u.", GetLastError()); goto Exit; }
if(!WinHttpSetCredentials ( hRequest, dwAuthTargets, dwAuthScheme, wszProxyUserName, wszProxyPassword, (PVOID) NULL )) { LogText("WinHttpSetCredentials failed with error %u.", GetLastError()); goto Exit; } } else { if(!WinHttpSetOption ( hRequest, WINHTTP_OPTION_PROXY_USERNAME, (PVOID) wszProxyUserName, wcslen(wszProxyUserName) )) { LogText("WinHttpSetOption failed with error %u.", GetLastError()); goto Exit; }
if(!WinHttpSetOption ( hRequest, WINHTTP_OPTION_PROXY_PASSWORD, (PVOID) wszProxyPassword, wcslen(wszProxyPassword) )) { LogText("WinHttpSetOption failed with error %u.", GetLastError()); goto Exit; } }
goto Resend; break;
} //end of switch (status code)
Exit:
if( hRequest != NULL ) { WinHttpCloseHandle(hRequest); hRequest = NULL; }
if( hConnect != NULL ) { WinHttpCloseHandle(hConnect); hConnect = NULL; }
if( hOpen != NULL ) { WinHttpCloseHandle(hOpen); hOpen = NULL; }
return bContinueStress; }
|