コンテンツのエンコード

HTTP プロトコル (RFC 2616) アプリケーションで指定されているように、サーバーはエンコードされた形式で HTTP 応答を返すように要求できます。 Windows Server 2008 および Windows Vista より前のバージョンでは、コンテンツ エンコードを使用した要求は、そのレベルで処理するためにアプリケーションに送信されていました。 Windows Server 2008 および Windows Vista 以降では、アプリケーションは WinINet に gzip のコンテンツ デコードを実行し、コンテンツ エンコード スキームをデフレートするように指示できます。

コンテンツのデコードを有効にするために、アプリケーションは、WinINet に代わってデコードを実行するように要求するデコード オプションを設定します。 ただし、デコードを有効にしても、WinINet がコンテンツデコードを実行することは保証されず、デコードを処理するようにアプリケーションを準備する必要があります。 WinINet では、コンテンツデコードが正常に実行されると、応答からコンテンツ エンコード ヘッダーが削除されます。 応答にコンテンツ エンコード ヘッダーが存在する場合、デコード オプションが有効か無効かに関係なく、アプリケーションはコンテンツデコードを処理する必要があります。

デコードが有効になっている場合、アプリケーションは要求の Accept-Encoding ヘッダーでサポートされているエンコードの一覧を指定する必要があります。 ただし、Accept-Encoding ヘッダーは、エンコードされた応答をサーバーに送信する義務を負いません。 WinINet は、受け入れ可能なエンコードの一覧と一致しない応答をアプリケーションに返します。

次の一覧では、オプションが有効になっているときに WinINet がコンテンツデコードを実行する条件について説明します。

  • Accept-Encoding ヘッダーは要求に存在する必要があり、gzip、deflate、または gzip と deflate エンコード スキームの両方を指定する必要があります。
  • Content-Encoding ヘッダーで指定されたエンコード スキームは、Accept-Encoding ヘッダーで指定されたエンコード スキームのいずれかと一致する必要があります。
  • 応答の Content-Encoding ヘッダーは、エンコード スキームを 1 つだけ指定します。
  • 応答には、Content- Encoding ヘッダーを 1 つだけ含む必要があります。 WinINet は、エンコード スキームを 1 つだけ使用してエンコードされたコンテンツをデコードします。
  • Cache-Control ヘッダーには、変換なしディレクティブを含めることはできません。
  • Content-Range ヘッダーを応答に含めてはいけません。

展開オプションの設定

デコード オプションは、セッション ハンドル、要求ハンドル、または接続ハンドルで設定できます。 デコード オプションが設定されているハンドルによって、デコード オプションのスコープが定義されます。 たとえば、セッションでデコードを設定すると、そのハンドルで作成されたすべての接続と要求のデコードが有効になります。

デコード オプションを設定するために、アプリケーションは InternetOpen、InternetConnect、または HttpOpenRequest から返されたハンドルを使用して InternetSetOption を呼び出します。 INTERNET_OPTION_HTTP_DECODING オプションは dwOption パラメーターで指定され、lpBuffer パラメーターは true に設定されたブール変数を指します。 デコードを無効にするために、アプリケーションは、INTERNET_OPTION_HTTP_DECODING オプションとブール変数を false に設定して InternetSetOption を呼び出します。

デコード オプションが設定されている場合、アプリケーションが InternetReadFile を呼び出すときに、WinINet は要求に対してデコードを実行します。 コンテンツデコードの実行中に WinINet でエラーが発生した場合、 InternetReadFile の呼び出しは ERROR_INTERNET_DECODING_FAILEDで失敗します。 デコードに失敗した場合、アプリケーションには 2 つのオプションがあります。Accept-Encoding ヘッダーを削除して要求を再送信するか、要求の INTERNET_OPTION_HTTP_DECODING オプションを false に設定してから要求を再送信できます。 デコード オプションが false に設定されている場合、アプリケーションは Content-Encoding ヘッダーをチェックし、アプリケーション レベルでデコードを実行する必要があります。

注意

WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用しないでください。 サーバーの実装またはサービスの場合は、 Microsoft Windows HTTP サービス (WinHTTP) を使用します。