HttpQueryInfo HTTPリクエストに関連する情報の取得

Cの宣言:

BOOL HttpQueryInfo(
	IN HINTERNET hHttpRequest,
	IN DWORD InfoLevel,
	IN LPVOID Buf OPTIONAL,
	IN LPDWORD BufSize,
	IN OUT LPDWORD Index OPTIONAL);

説明:

hHttpRequestで指定されたHTTP要求に関連する、要求結果などの情報を取得し、Bufに返す。

引数の意味は以下の通り。
hHttpRequest 情報の取得元のHTTP要求を識別するハンドル。
InfoLevel 取得する属性や、要求の変更などのレベルを表すフラグ。後述の表を参照。
Buf 取得結果。
BufSize Bufのサイズ。関数の実行後実際のサイズまたは必要なサイズが返される。
Index 同一のヘッダが存在する場合にどのヘッダかを識別するためのインデックス。

InfoLevelには、まず以下のいずれかを指定する。
HTTP_QUERY_MIME_VERSION MIMEプロトコルのバージョン。
HTTP_QUERY_CONTENT_TRANSFER_ENCODING リソースに適用されるエンコーディング法。
HTTP_QUERY_CONTENT_TYPE リソースのタイプ。
HTTP_QUERY_CONTENT_ID コンテンツの識別子。
HTTP_QUERY_CONTENT_DESCRIPTION
HTTP_QUERY_CONTENT_LENGTH リソースのサイズ。
HTTP_QUERY_ALLOW サーバがサポートしている動詞。
HTTP_QUERY_PUBLIC サーバに対して有効な動詞。
HTTP_QUERY_DATE メッセージの作成時刻。
HTTP_QUERY_EXPIRES リソースの有効期限。
HTTP_QUERY_LAST_MODIFIED 最終更新時刻。
HTTP_QUERY_MESSAGE_ID
HTTP_QUERY_URI
HTTP_QUERY_DERIVED_FROM
HTTP_QUERY_LANGUAGE
HTTP_QUERY_COST
HTTP_QUERY_WWW_LINK
HTTP_QUERY_PRAGMA 実装依存のデータ。
HTTP_QUERY_VERSION サーバに最後に返された応答コード。
HTTP_QUERY_STATUS_CODE サーバから返された状態コード。
HTTP_QUERY_STATUS_TEXT サーバから返された補足のテキスト。
HTTP_QUERY_RAW_HEADERS NUL文字で区切られた全てのヘッダ。
HTTP_QUERY_RAW_HEADERS_CRLF CR/LFで区切られた全てのヘッダ。
HTTP_QUERY_REQUEST_METHOD リクエストで使用された動詞。

次に、以下のフラグの組み合わせを論理和で指定する。
HTTP_QUERY_INFO_NUMBER データのタイプを表すDWORD値を取得する。
HTTP_QUERY_CUSTOM ASCII文字列のヘッダ名を取得する。
HTTP_QUERY_FLAG_COALESCE 同名のヘッダを結合して取得する。
HTTP_QUERY_FLAG_REQUEST_HEADERS 一般には応答ヘッダの取得に使用する。また、要求ヘッダの取得にも使用可能。
HTTP_QUERY_FLAG_SYSTEMTIME 最終更新日時などをSYSTEMTIMEで返す。
HTTP_QUERY_FLAG_NUMBER 状態コードなどの32bit値を返す。

戻り値は、関数の実行に成功したか否かを表す真偽値である

Cのサンプル:

HttpSendRequestを利用して、//www.cool.ne.jp/masapico/index.htmlの内容を取得する。
void RequestHttp()
{
	HINTERNET hInternet;
	HINTERNET hHttpSession;
	HINTERNET hHttpRequest;
	char *Buf;
	char BufSizeText[1000];
	DWORD BufSizeTextSize = 1000;
	DWORD BufSize;
	DWORD ReadSize;

	/* WININET初期化 */
	hInternet = InternetOpen(
		"WININET Sample Program",
		INTERNET_OPEN_TYPE_PRECONFIG,
		NULL,
		NULL,
		0);

	/* サーバへ接続 */
	hHttpSession = InternetConnect(
		hInternet,
		"www.cool.ne.jp",
		INTERNET_DEFAULT_HTTP_PORT,
		NULL,
		NULL,
		INTERNET_SERVICE_HTTP,
		0,
		0);

	/* HTTP要求の作成 */
	hHttpRequest = HttpOpenRequest(
		hHttpSession,
		"GET",
		"index.html",
		NULL,
		"http://www.cool.ne.jp/masapico/",
		NULL,
		0,
		0);

	/* 作成したHTTP要求の発行 */
	HttpSendRequest(
		hHttpRequest,
		NULL,
		0,
		NULL,
		0);

	/* 返されたコンテンツの長さを取得 */
	HttpQueryInfo(
		hHttpRequest,
		HTTP_QUERY_CONTENT_LENGTH,
		BufSizeText,
		&BufSizeTextSize, 
		NULL);

	BufSize = atol(BufSizeText);
	Buf = GlobalAlloc(GMEM_FIXED, BufSize);

	/* コンテンツの内容を取得・表示 */
	InternetReadFile(
		hHttpRequest,
		Buf,
		BufSize,
		&ReadSize);

	printf("%s\n", Buf);

	/* 後処理 */
	GlobalFree(Buf);
	InternetCloseHandle(hHttpRequest);
	InternetCloseHandle(hHttpSession);
	InternetCloseHandle(hInternet);
}

メモ:

WININET全般に渡って、VC5.0のヘルプとmicrosoftのサイトの情報がかなり異なる場合がある。IEのバージョンの差か。どこかで統一が必要。
(original text:1999/04/30 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。