Allied ArchitectsAllied ArchitectsEngineer Blog

不正なContent-Encodingヘッダを受け取ることもあるという話

2012/04/4 その他

こんにちは。アライドアーキテクツの金箱(かねばこ)です。

アライドアーキテクツではモニプラの開発&運用を担当しています。どう作るかより何を作るかを考えるのが好きなエンジニアです。

先日解決した問題について、将来的にもまれに出会いそうなケースだったため、備忘も含めてエンジニアブログのほうに書きます。

問題について

先日、FC2ブログのRSSが取得できないという問題に出会いました。

現象はブラウザでRSSを確認するときちんと見れているのに、プログラムでRSSを読むときにどこかでエラーが起きて取得できないというものでした。

デバッグを行っていろいろさかのぼっていくと、どうやらHTTPレスポンスをデコードしているところでおかしなことになっているぞと分かりました。以下その原因について書いていきます。

 

HTTPとそのエンコーディングについて

RSSの取得は、HTTPプロトコルでやりとりしています。HTTPプロトコルでのやりとりは、HTTPレスポンスヘッダをクライアントサイドのプログラムで作成して、取得したい先のwebサーバーにリクエストして行っています。

今回のRSSの取得では、ヘッダにはAccept-Encodingフィールドにidentityをセットしていました。

webサーバーにAccept-Encodingフィールドをセットしたリクエストを投げると、サーバーはセットされたエンコーディングでレスポンスを返します。Accept-Encodingフィールドはカンマ区切りで複数指定可能なので、サーバーはその中からエンコーディングを選んでレスポンスを返します。

実際にレスポンスで返したエンコーディングは、Content-Encodingフィールドに明記してくれています。クライアント側では、このContent-Encodingフィールドの情報をもとに、レスポンスをデコードして幸せになるというわけです。

もし、サーバーがAccept-Encodingフィールドにセットされたエンコーディングでレスポンスを返せない場合は、406ステータスコードを返す決まりになっています。

ちなみにコーディングの種類はこちらが分かりやすいです。( http://www.studyinghttp.net/body#Codings

 

今回のケース

FC2ブログのRSSを取得しようとAccept-Encodingフィールドにidentityのみをセットしてリクエストを投げたところ、レスポンスのContent-Encodingフィールドにdeflateが入ったレスポンスが返って来ていました。

(この時点でややおかしいです。)

deflateは「ZLIB データ圧縮フォーマットですよ」という意味なので、プログラムがデコードを試みます。

ところが、ヘッダではdeflateですよとなっているものの、ボディーは無圧縮状態のものが入っていたために、デコードに失敗してエラーとなっていました。

今回のケースではつまり、RSSの取得に失敗ということです。

 

調査と解決

興味半分でいろいろ試してみたところ、gzipをセットした場合などはidentityで返ってきたりもしてました。

Googleで同じような事例を探してみたところ、今から2年ほど前からチラホラいるように見受けられました。

原因が分かったため、HTTPレスポンスをContent-Encodingをもとにしてデコードする箇所で、もしうまくデコードできなかった時にはContent-Encodingを疑って別のパターンを試みるという方法で回避しました。

もし似たようなケースに直面した方がいれば、エンコーディングを疑ってみるのも一つの道筋だと思います。

参考にさせて頂いたサイト:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3

 

 

最後に

アライドアーキテクツでは、一緒に働く仲間を随時募集しています。是非一度採用サイトを覗いてみてください。お待ちしております。

金箱 遼
  • 金箱 遼
  • グロースエンジニア
  • サービスのことを考えることと、グロースを考えることが大好きです。 どんどん世の中が便利になってうれしいです。 どうぞよろしくお願いします。

RELATION ENTRY

なぜ新卒のアイディアに価値が有るのか

なぜ新卒のアイディアに価値が有るのか

2014/06/20 その他

おつかれさまです。金箱です。 弊社でも2014年度の新卒として19名を迎えました。 システム部には5名が配属される予定で、システム研修なるものを行っています。 研修を通じて彼らとコミュニケーションをとっていると、または研修外の彼らの成果物をみても、とても価値のあるアイディアを持って...

続きを読む

5月21日に勉強会(AWDD#7)を開催します

5月21日に勉強会(AWDD#7)を開催...

2014/05/7 勉強会・セミナー

こんにちは。 5月21日(水)に7回目の勉強会&交流会を弊社にて開催します。 今回はJavaScript関連のセッションを2つ行います。 詳細&申し込みは下記からお願いします。 JavaScript&TypeScript+Knockout勉強会(AWDD#7) 参加費は無料...

続きを読む

金箱 遼の記事一覧へ

ページTOPへ