メッセージ。 - [日記] 朝の進捗
# [日記] 朝の進捗
昨夜はご飯を食べると急激に眠くなって寝てしまった。その代わり、今朝は早めに起きて作業中。Amazon S3のテストがうまく動かない原因を調べていて、ちょっと変なところがあると分かってきた。クライアントとプロキシの間をパケットキャプチャをして調べているのだが、HTTPのHEADメソッドでデータを取りにいった際の戻りとして、HTTPボディが返ってきている。
正確には、HTTPのHEADメソッドではHTTPボディを取得しないはずなんだが、プロキシがそのへんを無視してというか混乱していてボディを無理矢理取得しようとしている(コード的にはport->stringが動いていて、一応content-length分のデータ(NULLストリング)が取得できている)。これはHTTPシーケンスとしてはおかしいので、このへんの問題が、Amazon S3のテストを止める原因になっていると思われる。
なお、どうしてこうなってしまったかというと、プロキシサーバーの実装で、HTTPでソケットからデータを読み込む部分(下位からのリクエストと上位からのレスポンス)を単に共用してしまっていることが原因だと思われる。下位からのリクエストと上位からのレスポンスは、フォーマットが非常に似ている。だから当初は、同じロジックでデータを取得できるんじゃないかと考えたのだ。
ところが実際には、HEADメソッドの場合はcontent-lengthが0より大きい数値であってもHTTPボディを取得しないとか、content-lengthやtransfer-encodingが指定されていないときにHTTPボディはどう扱うのかといった部分で、いくつかの条件分岐をしなければならない。この「条件」に相当する部分について、ぼくの理解が曖昧になっていることが原因になって今回の問題が起こっているということが分かった。
で、修正なのだが、やっぱり2~3日ぐらいかかるかなという感じ。コードの修正量じたいは少ないと思うんだけど、あまりad hocにコードをいじっても良くない気がする。プロトコル実装のコアな部分だから、フラグプログラミングみたいに、ちょっと変なコードを書くとはまってしまう感じ。
正確には、HTTPのHEADメソッドではHTTPボディを取得しないはずなんだが、プロキシがそのへんを無視してというか混乱していてボディを無理矢理取得しようとしている(コード的にはport->stringが動いていて、一応content-length分のデータ(NULLストリング)が取得できている)。これはHTTPシーケンスとしてはおかしいので、このへんの問題が、Amazon S3のテストを止める原因になっていると思われる。
なお、どうしてこうなってしまったかというと、プロキシサーバーの実装で、HTTPでソケットからデータを読み込む部分(下位からのリクエストと上位からのレスポンス)を単に共用してしまっていることが原因だと思われる。下位からのリクエストと上位からのレスポンスは、フォーマットが非常に似ている。だから当初は、同じロジックでデータを取得できるんじゃないかと考えたのだ。
ところが実際には、HEADメソッドの場合はcontent-lengthが0より大きい数値であってもHTTPボディを取得しないとか、content-lengthやtransfer-encodingが指定されていないときにHTTPボディはどう扱うのかといった部分で、いくつかの条件分岐をしなければならない。この「条件」に相当する部分について、ぼくの理解が曖昧になっていることが原因になって今回の問題が起こっているということが分かった。
で、修正なのだが、やっぱり2~3日ぐらいかかるかなという感じ。コードの修正量じたいは少ないと思うんだけど、あまりad hocにコードをいじっても良くない気がする。プロトコル実装のコアな部分だから、フラグプログラミングみたいに、ちょっと変なコードを書くとはまってしまう感じ。
Comment
Trackback