1

URLOpenPullStream を IBindStatusCallback および IHttpNegotiate コールバックと共に使用して、ネゴシエート、ステータス、およびデータ メッセージを処理しています。私が抱えている問題は、コンテンツが gzip の場合です (例: Content-Encoding: gzip)。OnDataAvailable 経由で受信しているデータは圧縮されています。非圧縮データが必要です。BINDF_PULLDATA | を使用しています。BindF_GETNEWESTVERSION | BINDF_NOWRITECACHE バインディング フラグ。gzip 形式をサポートする必要があるという投稿をいくつか読みました。

私は最初、Accept-Encoding リクエスト ヘッダーを変更して、gzip が不要であることを指定しようとしましたが、これではうまくいきませんでした。BeginningTransaction でヘッダーを変更または追加できますが、Accept-Content の変更に失敗します。User-Agent を変更でき、新しいヘッダーを追加できたので、プロセスは機能しましたが、何らかの理由で Accept-Content をオーバーライドしませんでした。

他のオプションは、自分でデータを解凍することです。C++ gzip ライブラリを使用した簡単なテストでは、コンテンツを unzip できました。したがって、これはオプションかもしれません。これが私がしなければならないことである場合、それを検出するための最良の方法は gzip です。BINDSTATUS_MIMETYPEAVAILABLE で OnProgress イベントが発生し、テキストが "application/x-gzip-compressed" に設定されていることに気付きました。これは私がそれを検出する方法ですか?

この問題を回避するための解決策を探しています! 私は URLOpenPullStream を使い続けたいと思っています。これはリリースされた製品であり、変更を最小限に抑えたいと考えています。

4

1 に答える 1

1

さらに調査を重ねた後、私自身の質問に答えます。問題が発生しているWebサイトが、IE、FF、およびURLOpenPullStreamが有効なgzipコンテンツとして認識しないという誤ったメッセージを返しているようです。ヘッダーは正常に見えます。例:


  HTTP/1.1 200 OK
  Content-Type: text/html; charset=iso-8859-1
  Content-Encoding: none
  Server: Microsoft-IIS/6.0
  MSNSERVER: H: COL102-W41 V: 15.4.317.921 D: 2010-09-21T20:29:43
  Vary: Accept-Encoding
  Content-Encoding: gzip
  Content-Length: 4258
  Date: Wed, 27 Oct 2010 20:48:15 GMT
  Connection: keep-alive
  Set-Cookie: xidseq=4; domain=.live.com; path=/
  Set-Cookie: LD=; domain=.live.com; expires=Wed, 27-Oct-2010 19:08:15 GMT;   path=/
  Cache-Control: no-cache, no-store
  Pragma: no-cache
  Expires: -1
  Expires: -1

しかし、URLOpenPullStreamはそれを生の圧縮形式でダウンロードしたばかりであり、サイトにアクセスしようとするとIEはエラーを報告し、FFはゴミを表示します。

www.webcompression.orgなどの有効なgzipコンテンツを返すサイトでテストを行った後、IE、FF、およびURLOpenPullStreamは正常に機能しました。したがって、URLOpenPullStreamはgzipコンテンツをサポートしているようです。この場合、それは透明でした。OnDataAvailableで、非圧縮データを受け取りましたが、OnResponseで、ヘッダーにContent-Encodingがgzipとして表示されませんでした。

残念ながら、これでも私の問題は解決しませんでした。OnResponseイベントの応答ヘッダーを確認して解決しました。Content-Encodingがgzipの場合は、フラグを設定し、ダウンロードが完了したら、zlibgzipルーチンを使用してコンテンツを解凍しました。これはうまくいくようでした。URLOpenPullStreamが解凍を透過的に処理するため、通常、OnResponseヘッダーでContent-Encoding:gzipを受信することはないため、これはまれなケースでは問題ありません。

ダンノ:)

于 2010-10-31T19:45:54.277 に答える