다음을 통해 공유


콘텐츠 인코딩

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 헤더는 인코딩 체계를 하나만 지정합니다.
  • 응답에는 Content- Encoding 헤더가 하나만 포함되어야 합니다. WinINet은 인코딩 체계를 하나만 사용하여 인코딩된 콘텐츠를 디코딩합니다.
  • Cache-Control 헤더에는 변환 없음 지시문이 포함되어서는 안 합니다.
  • Content-Range 헤더는 응답에 없어야 합니다.

압축 해제 옵션 설정

디코딩 옵션은 세션 핸들, 요청 핸들 또는 연결 핸들에서 설정할 수 있습니다. 디코딩 옵션이 설정된 핸들은 디코딩 옵션의 scope 정의합니다. 예를 들어 세션에서 디코딩을 설정하면 해당 핸들에서 만든 모든 연결 및 요청을 디코딩할 수 있습니다.

디코딩 옵션을 설정하기 위해 애플리케이션은 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. 디코딩이 실패하면 애플리케이션에는 두 가지 옵션이 있습니다. 즉, Accept-Encoding 헤더를 제거하고 요청을 다시 보내거나 요청에 대한 INTERNET_OPTION_HTTP_DECODING 옵션을 false로 설정한 다음 요청을 다시 보냅니다. 디코딩 옵션이 false로 설정된 경우 애플리케이션은 Content-Encoding 헤더를 검사 애플리케이션 수준에서 디코딩을 수행해야 합니다.

참고

WinINet은 서버 구현을 지원하지 않습니다. 또한 서비스에서 사용하면 안 됩니다. 서버 구현 또는 서비스의 경우 WinHTTP(Microsoft Windows HTTP 서비스)를 사용합니다.