「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@842) [中] [修正中]
@842■ (#2640) 「HTTPポスト」のタイムアウト時間が短すぎる - こころ (2016-09-24 10:32) /中 未処理
【症状】
「HTTPデータ取得」や「HTTPダウンロード」よりも「HTTPポスト」や「HTTP簡易ポスト」のほうがタイムアウト時間が2秒程度と短く、タイムアウトエラーが多発してしまいます。
WordPressや掲示板などによっては数秒かかることがあり、投稿しようとしてもタイムアウトしてしまってまともに使えない状態です。

【再現方法】
//ここからプログラム
//『アドレス』にスクリーンショットに記載のPHPを設置
『アドレス』へHTTPデータ取得
『アドレス』へ空をHTTP簡易ポスト
//ここまでプログラム

【要望】
タイムアウト時間を「HTTPデータ取得」程度に長くしてほしいです。

【バージョン】
デラックス 1.562
Windows 10 Pro


(#2641) 「HTTPポスト」のタイムアウト時間が短すぎる - こころ (2016-09-24 10:31) /低 未処理
PHPコードを貼ったら投稿ができなかったのでスクリーンショットにしました。
お手数をおかけしますがよろしくお願いします。

(#2642) Re: 「HTTPポスト」のタイムアウト時間が短すぎる - うぇいく (2016-09-24 13:29) /中 未処理
参考までに今の動きです。

httpではプロトコルに従って動作しするため、単純に時間だけでタイムアウトはしません。以下のケースでは受信したデータ長に従って待ちます(HTTP 1.1ではどちらかが必ず含まれる)
・応答ヘッダにContnet-Lengthが含まれている。
・応答形式がchunkedになっている。

どちらでもなく、HTTP 0.9は1.0の古いプロトコルを使っている場合は、いつまで受信したらよいのか、クライアント側ではわからないため、最初のデータを受信するまで長めに待機した後、何らかのデータ受信後は、短い時間でタイムアウトします(ここが1秒前後)

これは、データの送受信が終了してもコネクションを切断しないサーバもあり、単純にタイムアウトを5秒にしただけで、数回POST/GETするだけの5秒*リクエスト回数分の時間がかかってしまうことになるためです。
※ブラウザから人間が参照している分には、コネクションが切れてなくても人間いは内容が見えているので、問題にならないわけです。
また、最近は、まともなサーバ実装は1.1に従って動くように整ってきている(静的コンテンツならContent-Lengthがついているか、動的生成ならchunked形式になっている)という点があります。

なお、GETもPOSTも動きは同じはず。

(#2643) GETとPOSTで動きが違う - こころ (2016-09-26 13:11) /低 未処理
うぇいくさん,毎度お世話になっております.
適当なサーバーに3秒待機するだけのPHPをアップしたのでそのまま再現できるプログラムを貼ります.

◆「Content-Length: 0」の場合◆
#ここから
http://akechi.webcrow.jp/sleep.php」をHTTPデータ取得
http://akechi.webcrow.jp/sleep.php」へ空をHTTP簡易ポスト
#ここまで

◆「Transfer-Encoding: chunked」の場合◆
#ここから
http://akechi.webcrow.jp/sleep1.php」をHTTPデータ取得
http://akechi.webcrow.jp/sleep1.php」へ空をHTTP簡易ポスト
#ここまで

どちらの場合においても1行目のGETではエラーが発生しませんが,2行目のPOSTでタイムアウトエラーが発生します.
もしかして「Keep-Alive:timeout=3, max=100」が影響しているのでしょうか.
別のPC Windows7 Enterpriseでも同様でした.
よろしくお願いします.

(#2649) Re: 「HTTPポスト」のタイムアウト時間が短すぎる - うぇいく (2016-09-26 21:20) /低 未処理
Fiddlerで見てみると、Connectionヘッダが無いことが気になった以外は大丈夫な感じがします。
HTTP/1.1の場合、Connectionヘッダが必須なような気がしたので、試しに、「Connection: Close」を付けてみてください。
(なでしこでは、実装の都合上、keepしたconnectionの再利用ができません)

それとは別に、現在の動きでもタイムアウトにならないようにする方法は考えてみます。

(#2650) Re: 「HTTPポスト」のタイムアウト時間が短すぎる - こころ (2016-09-26 23:12) /中 未処理
「Connection: Close」をつけてもエラーが発生しました。

◆「Content-Length: 0」の場合◆
#ここから
http://akechi.webcrow.jp/sleep3.php」をHTTPデータ取得
http://akechi.webcrow.jp/sleep3.php」へ空をHTTP簡易ポスト
#ここまで

◆「Transfer-Encoding: chunked」の場合◆
#ここから
http://akechi.webcrow.jp/sleep4.php」をHTTPデータ取得
http://akechi.webcrow.jp/sleep4.php」へ空をHTTP簡易ポスト
#ここまで

また、記載しているURLはウェブクロウですが、ミニバード、さくらのレンタルサーバ(スタンダード)でもエラーが発生しました。

よろしくお願いします。

(#2651) Re: 「HTTPポスト」のタイムアウト時間が短すぎる - うぇいく (2016-09-27 23:38) /中 未処理
おかげさまで原因箇所が特定でいました。

まず、データ取得とデータダウンロードは、Windowsのコンポーネントをそのまま利用しているため、動作が安定している代わりに、あまり小回りが利きません。
HTTP(簡易)ポストとHTTPゲットは、独自に実装していて小回りが利くようになっているのですが、今回のように実装に不備がある可能性もあります(POSTだけでなく、GETでも同様に発生します)

原因は、通信中、タイムアウトの有効/無効を使い分けているのですが、chunkの場合で、かつ、チャンクしたサイズを受信する部分について、短いタイムアウトが有効になっていました(3秒)今回のはここに引っかかっていたようです。
(チャンクしたサイズに基づいてデータを受信するときはタイムアウトは長めです。Content-Lengthに基づいて受信する場合もタイムアウトは長めです。)

後日対策しようと思います。

(#2652) よろしくお願いします。 - こころ (2016-09-28 21:25) /中 修正中
ありがとうございます。
よろしくお願いします。

(#2640)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能