- 2009/10/7 水曜日 15:29:06
- perl
PSGI Implのsendfileについてですが、自分の今のところのイメージを書いておくです。
on Plack::Server
- $res->[2]がGLOBだったら fileno($res->[2])して sendfile に fd を渡す
- $res->[2]->can(‘fileno’) が生えてたら、$res->[2]->filenoからfdを取って使う
- $res->[2]->can(‘path’) が生えてたら、$res->[2]->pathからファイルパスを取って使う
$env->{psgix.sendfile}を使わない以外は一緒
on app
realfileをserveしたい時は
- GLOBを返す
- ->pathを生やしたIO-Handle-likeなオブジェクトを返す
の二種類の方法があって、後者のほうがあらゆるサーバで最適化される可能性がある。かといって前者だからといってクライアントに届くresponseが変わることはないと期待される。後者において->filenoの実体のファイルと->pathが違うものだった場合の動作は未定義。
on middleware
- Plack::Middleware::XSendfile
responseから->pathが取れる場合にはそれをヘッダのX-Sendfileにセットするようなmiddleware。これのpsgix.sendfileサポートを無くしたやつのイメージ。
X-Sendfileヘッダをセットする場合というのはbackendがlightyの場合とかだと思うけど、それをセットしていいかどうかはPlackは知り得ない。かといってappでセットしていて必要のない時に外にファイルPATHが出ていくものいくない。というわけでappでは->path付きオブジェクトを返すだけにして、このmiddlewareをbackendにあわせて付けたり外したりする。Plack::Server::*のsendfile(2)サポートとかとはまったく関係無い。 - Plack::Middleware::GuessPath
GLOBからファイルPathを推測して->path付きのオブジェクトに変換しちゃうMiddleware。マルチプラットフォーム対応が課題。Plack::Middleware::XSendfileより先に実行する。Plack::Server::*のsendfile(2)サポートとも関係する。
追記(10/7 17:24): 大体ここに書いてある感じで追加されたみたいです。詳しくは本家specのchangesetをご覧ください。Plack::Middleware::XSendfileも追加されたみたいです。miyagawaさん仕事ハヤス、、、。
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2009/10/07/327/trackback/
- トラックバックの送信元リスト
- Re: PSGI Implのsendfileについて - へぼい日記 より