Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/86-47dfdc99

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Apache `write': Invalid argument (Errno::EINVAL)


#!/usr/local/bin/ruby
require 'cgi'

STDOUT.binmode

file='xxx.divx'
#xxx.divxは、約400Mbyteのファイルで、
#実行した環境だと読み込みに数十秒かかる。

f=open(file,'rb')
buf=f.read
f.close

cgi=CGI.new()

cgi.out('status'=>'OK',
'pragma'=>'no-cache',
'cache-control'=>'no-cache,must-revalidate',
'type'=>'video/divx'
){buf}

上記実行すると、apacheは以下、ERRを吐いて処理を中断してしまった。

C:/Ruby/lib/ruby/1.8/cgi.rb:727:in `write': Invalid argument (Errno::EINVAL)

おそらく、リクエストを受けてからソケットにwrite()を始めるまでの間に、『無通信タイマー』が働いてソケットがクローズされてしまい、切れたソケットに対してwriteでEINVALって事だろう。

これは経験に基づく想像である。

クライアントがタイムアウトしてるのか? サーバがタイムアウトしてるのか?
アクティブクローズなのか? パッシブクローズなのか?
タイマー値はいくつなのか?
本来あるべき姿はコレでいいのか?
品質管理については、どういう所存なのか!? ブツブツブツ ・・・ ガミガミガミ ・・・


パケットを覗いてみたり、Apacheのソースを読んだりすれば、詳しい原因が解るだろうが、真の目的は、動く様にする事であり、原因追求ではないので、先ずは以下の様に改修してみた。


#!/usr/local/bin/ruby
require 'cgi'

STDOUT.binmode

class File::Stat
alias length size
end

class CGI
alias :out_orig :out

def out(hdrs)
if hdrs['file'] then
bufsize=hdrs['bufsize']||1024
ENV['REQUEST_METHOD']='HEAD'
file=hdrs['file']
hdrs.delete('file')
hdrs.delete('bufsize') if hdrs['bufsize']
out_orig(hdrs){File.stat(file)}
f=open(file,'rb')
while buf=f.read(bufsize)
STDOUT.write(buf)
end
f.close
else
out_orig(hdrs){
yield
}
end
end
end

file='xxx.divx'

cgi=CGI.new()

cgi.out('status'=>'OK',
'pragma'=>'no-cache',
'cache-control'=>'no-cache,must-revalidate',
'type'=>'video/divx',
'file'=>file,
'bufsize'=>1024*1024*20
){''}


全部読んでから、書くのでなく、読んだところから書くようにcgi.rb本体には手を入れずに、cgi.outを書き換えた。cgi.rbをよく読まないと、こういう書き換えは流石にむり。

これによって良好な結果が得られたが、原因は不明のままである。

因みにFireFox2で、URLの終わりがcgiで、Content-type: video/divxを受けると固まるので、
URLの終わりにテキトウなクエリを付けてやると上手くいく。
×http://xxx.xxx.xxx.xxx/divx.cgi
http://xxx.xxx.xxx.xxx/divx.cgi?hoge=0
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/86-47dfdc99

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。