#pragma comment(lib, "winhttp.lib")
#include <Windows.h>
#include <winhttp.h>
#include <tchar.h>
#include <string>
using namespace std;
// 関数プロトタイプ宣言
BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl);
BOOL ReadData(HINTERNET hRequest);
//==============================================================================
int main()
{
HINTERNET hSession;
WCHAR wszUrl[256];
DWORD data;
DWORD dwSize = sizeof data;
BOOL b;
int i;
// ロケール定義
_tsetlocale(LC_CTYPE, _T(""));
// WinHTTPの初期化
hSession = WinHttpOpen(
L"Sample Application/1.0", // pwszUserAgent
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, // dwAccessType
WINHTTP_NO_PROXY_NAME, // pwszProxyName
WINHTTP_NO_PROXY_BYPASS, // pwszProxyBypass
0); // dwFlags
if (hSession == NULL) {
return 1;
}
// インターネットオプションの問い合わせ
b = WinHttpQueryOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &data, &dwSize);
if (b) {
_tprintf(_T("CONNECT_TIMEOUT(msec) = [%u]\n"), data);
}
while (1) {
_tprintf(_T("\nURL(Ctrl-Zで終了)>"));
i = _tscanf_s(_T("%s"), wszUrl, _countof(wszUrl));
if (i == EOF) break;
if (i != 1) continue;
GetRequest(hSession, wszUrl);
}
// 終了処理
b = WinHttpCloseHandle(hSession);
return 0;
}
//------------------------------------------------------------------------------
BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl)
{
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
URL_COMPONENTS urlc;
DWORD dwSize;
DWORD dw;
BOOL bRet = FALSE;
BOOL b;
// URLをホスト名とパスに分割
ZeroMemory(&urlc, sizeof urlc);
urlc.dwStructSize = sizeof urlc;
urlc.dwHostNameLength = (DWORD)-1;
urlc.dwUrlPathLength = (DWORD)-1;
b = WinHttpCrackUrl(
pwszUrl, // pwszUrl
0, // dwUrlLength
0, // dwFlags
&urlc); // lpUrlComponents
if (!b) {
return FALSE;
}
_tprintf(_T("lpszHostName = [%s]\n"), urlc.lpszHostName);
_tprintf(_T("dwHostNameLength = [%u]\n"), urlc.dwHostNameLength);
_tprintf(_T("nPort = [%u]\n"), urlc.nPort);
_tprintf(_T("lpszUrlPath = [%s]\n"), urlc.lpszUrlPath);
_tprintf(_T("dwUrlPathLength = [%u]\n"), urlc.dwUrlPathLength);
// 得られた文字数で変数にコピー
wstring strHostName(urlc.lpszHostName, urlc.dwHostNameLength);
wstring strUrlPath(urlc.lpszUrlPath, urlc.dwUrlPathLength);
// サーバーへの接続
hConnect = WinHttpConnect(
hSession, // hSession
strHostName.c_str(), // pswzServerName
urlc.nPort, // nServerPort INTERNET_DEFAULT_PORT
0); // dwReserved
if (hConnect == NULL) {
dw = GetLastError();
switch (dw) {
case ERROR_WINHTTP_INVALID_URL:
_ftprintf(stderr, _T("WinHttpConnect = [INVALID_URL]\n"));
break;
default:
_ftprintf(stderr, _T("WinHttpConnect = [%u]\n"), dw);
}
goto Exit;
}
// 要求ハンドルの取得
hRequest = WinHttpOpenRequest(
hConnect, // hConnect
NULL, // pwszVerb NULL=GET
strUrlPath.c_str(), // pwszObjectName
NULL, // pwszVersion NULL=HTTP/1.1
WINHTTP_NO_REFERER, // pwszReferrer
WINHTTP_DEFAULT_ACCEPT_TYPES, // ppwszAcceptTypes
0); // dwFlags
if (hConnect == NULL) {
dw = GetLastError();
_ftprintf(stderr, _T("WinHttpOpenRequest = [%u]\n"), dw);
goto Exit;
}
// 要求を送信
b = WinHttpSendRequest(
hRequest, // hRequest
WINHTTP_NO_ADDITIONAL_HEADERS, // pwszHeaders
0, // dwHeadersLength
WINHTTP_NO_REQUEST_DATA, // lpOptional
0, // dwOptionalLength
WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, // dwTotalLength
0); // dwContext
if (!b) {
dw = GetLastError();
_ftprintf(stderr, _T("WinHttpSendRequest = [%u]\n"), dw);
goto Exit;
}
// 応答を待つ
b = WinHttpReceiveResponse(
hRequest, // hRequest
NULL); // lpReserved
// ヘッダ情報の取得
dwSize = 0;
b = WinHttpQueryHeaders(
hRequest, // hRequest
WINHTTP_QUERY_RAW_HEADERS_CRLF, // dwInfoLevel
WINHTTP_HEADER_NAME_BY_INDEX, // pwszName
NULL, // lpBuffer
&dwSize, // lpdwBufferLength
WINHTTP_NO_HEADER_INDEX); // lpdwIndex
if (!b) {
dw = GetLastError();
switch (dw) {
case ERROR_INSUFFICIENT_BUFFER:
break;
default:
_ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw);
goto Exit;
}
}
LPCWSTR lpHeader = new WCHAR[dwSize / sizeof (WCHAR)];
b = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX, (LPVOID)lpHeader, &dwSize,
WINHTTP_NO_HEADER_INDEX);
if (!b) {
dw = GetLastError();
_ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw);
goto Exit;
}
_tprintf(_T("lpHeader = [%s]\n"), lpHeader);
delete [] lpHeader;
// データの読み込み
ReadData(hRequest);
bRet = TRUE;
Exit: // 終了処理
if (hRequest) b = WinHttpCloseHandle(hRequest);
if (hConnect) b = WinHttpCloseHandle(hConnect);
return bRet;
}
//------------------------------------------------------------------------------
BOOL ReadData(HINTERNET hRequest)
{
BYTE buffer[4096];
DWORD dwSize;
BOOL b;
// 一時的にロケールを変更
_tsetlocale(LC_CTYPE, _T("C"));
while (1) {
// 入手可能データのバイト数を取得
b = WinHttpQueryDataAvailable(hRequest, &dwSize);
if (dwSize == 0) break;
if (_countof(buffer) < dwSize) dwSize = _countof(buffer);
// データの読み込み
b = WinHttpReadData(hRequest, buffer, dwSize, NULL);
_tprintf(_T("%.*S"), dwSize, buffer);
}
_tsetlocale(LC_CTYPE, _T(""));
return TRUE;
}