Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

201 lines
5.7 KiB

#define UNICODE
#include "windows.h"
#include "winhttp.h"
#include "stdio.h"
#define INLINE_SET
bool
ApplyCredentials(
HINTERNET hRequest
);
bool
ApplyServerCredentials(
HINTERNET hRequest
);
void wmain (int argc, wchar_t *argv[])
{
DWORD dwFlags = 0;
HINTERNET hInternet = 0;
HINTERNET hConnect = 0;
HINTERNET hRequest = 0;
if (argc < 5 || (0 != wcsicmp(argv[1], L"HEAD") && 0 != wcsicmp(argv[1], L"GET")))
{
printf("usage: \n"
" https {GET | HEAD} <proxy> <proxy-username> <proxy-password>\n"
);
return;
}
printf("verb: %S, proxy %S, username %S, password %S\n",
argv[1], argv[2], argv[3], argv[4] );
const WCHAR * const C_BITS_USER_AGENT = L"Microsoft BITS/6.5";
hInternet = WinHttpOpen( C_BITS_USER_AGENT,
WINHTTP_ACCESS_TYPE_NO_PROXY,
NULL,
NULL,
0 );
if (! hInternet )
{
printf("internet %d\n", GetLastError());
}
if (! (hConnect = WinHttpConnect( hInternet,
L"bitsnet",
INTERNET_DEFAULT_HTTP_PORT,
0))) //context
{
printf("connect %d\n", GetLastError());
}
LPCWSTR AcceptTypes[] = {L"*/*", NULL};
if (! (hRequest = WinHttpOpenRequest(
hConnect,
argv[1],
L"/dload/security/basic/500k.zip",
L"HTTP/1.1",
NULL, //referer
AcceptTypes,
dwFlags)))
{
printf("open %d\n", GetLastError());
}
// security-callback calls go here
//
WINHTTP_PROXY_INFO ProxyInfo;
ProxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
ProxyInfo.lpszProxy = argv[2]; // L"172.26.242.86:8080"; // formerly bitsisa:8080
ProxyInfo.lpszProxyBypass = NULL;
if (!WinHttpSetOption( hRequest,
WINHTTP_OPTION_PROXY,
&ProxyInfo,
sizeof(ProxyInfo)
))
{
DWORD err = GetLastError();
printf( "can't set proxy option: %d", err );
}
//
bool done = false;
do
{
BOOL b;
printf("sending...");
b = WinHttpSendRequest( hRequest,
0,
0,
0,
0,
0,
0
);
if (!b)
{
printf("send %d\n", GetLastError());
}
printf("\n");
b = WinHttpReceiveResponse( hRequest, 0 );
if (!b)
{
printf("receive %d\n", GetLastError());
}
// check status
DWORD dwStatus;
DWORD dwLength = sizeof(dwStatus);
if (! WinHttpQueryHeaders( hRequest,
WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
LPCWSTR(&dwStatus),
&dwStatus,
&dwLength,
NULL))
{
printf("can't query status %d\n", GetLastError());
}
printf("dwStatus %d\n", dwStatus );
switch (dwStatus)
{
case 200: done = true; break;
case 407:
{
printf("setting proxy creds: target 1, scheme 8...");
if (!WinHttpSetCredentials( hRequest,
1,
0x8,
argv[3], // L"dbitsusr", // formerly bitsisa\\butsusr
argv[4], //L"Bits1Usr1",
NULL
))
{
printf("set-cred failed %d\n", GetLastError());
}
break;
}
case 401:
{
printf("setting server creds: target 0, scheme 1...\n");
if (!WinHttpSetCredentials( hRequest,
0,
0x1,
argv[3],
argv[4],
NULL
))
{
printf("set-cred failed %d\n", GetLastError());
}
#if 0
printf("setting proxy creds: target 1, scheme 8...\n");
if (!WinHttpSetCredentials( hRequest,
1,
0x8,
argv[3], // L"dbitsusr", // formerly bitsisa\\butsusr
argv[4], //L"Bits1Usr1",
NULL
))
{
printf("set-cred failed %d\n", GetLastError());
}
#endif
break;
}
default:
{
done = true;
}
}
}
while ( !done );
}