- PR -

HTTPステータスコードが101と200同時に返ってきます

投稿者投稿内容
山田
常連さん
会議室デビュー日: 2004/11/22
投稿数: 25
投稿日時: 2005-01-26 13:31
御世話になります。
こちらに書き込むべき内容かどうか分らないのですが
教えて頂きたく、書込致しました。

CGIへデータをPOSTして、結果を取得する部分で困っております。
以下@のように、リクエストした結果のレスポンスを取得しております。
しかし時々、HTTPステータスコードがokであるにも関わらず、データ部が空で取得されております。
レスポンスのヘッダー部を調べましたら、Aのようなデータが返ってきておりました。
HTTPステータスコードがcontinueである後に、続いてokと記載されている部分が
異様に感じられます。
※アプリケーションでは、このレスポンスをStatusCode=okと判断している。

なぜこのような現象が起きているのか
ご存じの方がおられましたら教えて下さい。
また、回避方法があれば、教えて頂きたく思います。
宜しくお願い致します。

@----------------------------------------------------------------
WebRequest req = HttpWebRequest.Create("http://test.cgi");


(中略)

HttpWebResponse res;
HttpStatusCode st;
do
{
res = (HttpWebResponse)req.GetResponse();
st = res.StatusCode;
}while(st == HttpStatusCode.Continue);


Stream sr = res.GetResponseStream();

A-----------------------------------------------------------------
HTTP/1.1 100 Continue....HTTP/1.1 200 OK..
Date: Wed, 26 Jan 2005 04:10:48 GM
T..Server: Apache..Transfer
-Encoding: chunked..Content
-Type: text/html・・・・(中略)
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-26 19:25
引用:

CGIへデータをPOSTして、結果を取得する部分で困っております。
以下@のように、リクエストした結果のレスポンスを取得しております。
しかし時々、HTTPステータスコードがokであるにも関わらず、データ部が空で取得されております。
レスポンスのヘッダー部を調べましたら、Aのようなデータが返ってきておりました。
HTTPステータスコードがcontinueである後に、続いてokと記載されている部分が
異様に感じられます。
※アプリケーションでは、このレスポンスをStatusCode=okと判断している。

なぜこのような現象が起きているのか
ご存じの方がおられましたら教えて下さい。
また、回避方法があれば、教えて頂きたく思います。
宜しくお願い致します。



Status100(Continue)は意識したことが無かったのですが、
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10
によると

引用:

10.1.1 100 Continue
The client SHOULD continue with its request. This interim response is used to inform the client that the initial part of the request has been received and has not yet been rejected by the server. The client SHOULD continue by sending the remainder of the request or, if the request has already been completed, ignore this response. The server MUST send a final response after the request has been completed. See section 8.2.3 for detailed discussion of the use and handling of this status code.



だそうですので、100を受け取った後に待機、その後Status200(OK)を受け取って、結果200と判断しているのは正常な反応だと思います。

で、200なのにデータ部が空……というのはまた別の問題で、多分、それは呼び出されているプログラムの作り自体に問題があるのではないかと思われます。
200を返す部分を「おまじない」として何も考えずにプログラム冒頭で出力してしまっている作者も相当数いると思います。最近はどうだかよく知らないのですが、少なくとも私が組んだりしていた頃はそういう人が多かったように記憶しています。と言うか、恥ずかしながら私も意味も分からずに200を返していた内の一人です。
Status204(No Content)を返している人とか……正直、あまり聞いたことないです。て、204返す余裕があるなら「処理中にエラーが発生しました」のメッセージと共に200を返してしまうような気がしなくもないです。

これはあまり根拠の無い憶測なのですが、最初に返ってきている100もWebサーバーがCGIを起動する頃(前?)に「これから起動するプログラム、どれだけ処理時間かかるか分からないし、とりあえずクライアントに『リクエスト受け取ったよ』とだけは返しておくか」とか、そういうノリで返しているのではないでしょうか。
#真面目に100を返す作者なら、200を返して中身空っぽというのは考え難いと思いますので。

以上より……

・「100->200」を「200」と判断するのは正しい。回避したりしない方が良い。
・「200」が返ってきても信用してはいけない。中身は別途検証の必要有り。

……という感じでしょうか?

<余談>
一般によく知られているStatusって、200、300、401、403、404、500くらいですよね?
</余談>
山田
常連さん
会議室デビュー日: 2004/11/22
投稿数: 25
投稿日時: 2005-01-27 09:34
永井様

ご回答有り難うございます。
別の掲示板にも、同じ質問を投げて、HTTPの仕様を勉強するよう
注意されました・・。

HttpStatusCodeが100(処理中)→200(OK)となる流れに関しては
正常だと思われるのですが・・・。
レスポンスを受信する際のパケットを調べてみると
100 continue と、200 okを別々のパケットで送ってきております。

しかし
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

でレスポンス取得すると、1つのレスポンスメッセージのステータスライン部に
100と200が繋がったような形で返ってきております。

「HTTP/1.1 100 Continue....HTTP/1.1 200 OK.. 」

何回か同じデータをCGIへ投げて結果を検証しております。
タイミングが分らないのですが、正常なステータスを持つレスポンスが返ってくる時もあります。

「HTTP/1.1 200 OK」のステータスラインを持つ
レスポンスメッセージのボディ部を

HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream sr = res.GetResponseStream();

で取得すると、正常なデータ(ボディ部のデータ)が取得されます。

しかし
「HTTP/1.1 100 Continue....HTTP/1.1 200 OK.. 」のステータスラインを持つ
レスポンスメッセージを、先程のコードで取得すると、ボディ部が取得出来ません。
レスポンスメッセージ全体のバッファの中身を見てみますと、
こちらがほしいデータが、200の後に記載されております。

憶測ですが、Continueステータスラインを持つメッセージのボディ部を
取得しているような気がするのですが。
なぜ1つのレスポンスに、2つのステータスラインを持つメッセージが
取得されてしまう場合があるのか、分らない状態です。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-27 12:23
引用:

「HTTP/1.1 200 OK」のステータスラインを持つ
レスポンスメッセージのボディ部を

HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream sr = res.GetResponseStream();

で取得すると、正常なデータ(ボディ部のデータ)が取得されます。

しかし
「HTTP/1.1 100 Continue....HTTP/1.1 200 OK.. 」のステータスラインを持つ
レスポンスメッセージを、先程のコードで取得すると、ボディ部が取得出来ません。
レスポンスメッセージ全体のバッファの中身を見てみますと、
こちらがほしいデータが、200の後に記載されております。

憶測ですが、Continueステータスラインを持つメッセージのボディ部を
取得しているような気がするのですが。
なぜ1つのレスポンスに、2つのステータスラインを持つメッセージが
取得されてしまう場合があるのか、分らない状態です。



永井です。

私が書いたような内容に関しては既にご存知だったのですね。失礼しました。
HTTP全般の話ではなく.NETの話題……ということになると領域外で何のお手伝いも出来そうにないのですが
#って、ここは.NET会議室でしたが(TT

……簡単に検索してみた感じ、この辺りが近いお話ですか?
http://www.dotnet247.com/247reference/msgs/57/289086.aspx
山田
常連さん
会議室デビュー日: 2004/11/22
投稿数: 25
投稿日時: 2005-01-27 13:16
永井様

お忙しい中、度々ご回答下さいまして有り難うございます。
説明不足、言葉不足、HTTP理解不足(不足だらけ)により、ご迷惑をおかけしてしまい
申し訳ありませんでした。

教えて下さったURLを参照致しました。
#すべて英語のため、翻訳機を通しましたが、意味があまり理解出来なかったです・・。しかし、こちらの意図した事を話題した文であると思われます。

HTTPプロトコルの応答(statusCode)を、.NETのHttpWebRequestは正確に扱っていない、という
意味なのでしょうか^^;
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-27 14:50
引用:

教えて下さったURLを参照致しました。
#すべて英語のため、翻訳機を通しましたが、意味があまり理解出来なかったです・・。しかし、こちらの意図した事を話題した文であると思われます。



私も英語は苦手なので、間違っていたら申し訳無いんですが、先のページの内容としては……

・100→200をVB.NetのHttpWebRequestが上手く扱ってくれない
・同じような問題に遭った。VB.NetでSP1にしたらHttpWebRequestが上手く動かなくなった
***中略させていただきまし***
・configに以下のように書いたらうまくいった。実行ファイル名がfunkyfresh.exeならコンフィグファイル名はfunkyfresh.exe.config

コード:
<configuration>
   <system.net>
     <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
     </settings>
   </system.net>
</configuration>



※この設定は.Net1.1 SP1にのみ認識されます

---
みたいな感じでしょうか?

どなたか詳しい方(or英語の得意な方とかも是非)フォローお願いします。
山田
常連さん
会議室デビュー日: 2004/11/22
投稿数: 25
投稿日時: 2005-01-27 15:17
永井様

何度も有り難うございます。
教えて下さったHPを、もう一度じっくり解読しておりました。

文中に、要求に使用するHTTPプロトコルのバージョンを変更したら
上手くいった、との記載があったように思われます。
こちらでも試しに、プロトコルのバージョンを
1.1→1.0へ変更してみましたところ、
先程問題にしておりました現象は、発生しなくなりました。

1.0と1.1の大きな違いは、持続性接続が対応されているか否かだと思います。
別々に取得されるはずのレスポンスが、1つのメッセージとして返ってきた現象は
持続性であるが故に発生していた現象だったのでしょうか。
#応答を1つ1つ返さず、流れっぱなしのイメージ

-----------------------------------------------------------------
教えて下さいましたconfigの設定も、これから試してみます。
本当に有り難うございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-27 22:54
もうひとつの掲示板へのリンクを張って頂けますか。また、そちらへもここへのリンクを張っておいてください。双方の回答者が、他方でどのようなアドバイスを受けたのかがわかるように。
# マルチサイトポストは、あまり歓迎されていません
# 歓迎されていないことをするときの礼儀とお考えください

_________________

スキルアップ/キャリアアップ(JOB@IT)