/favicon.icoにpngで返す
前回に引き続き、Plack/PSGIのお勉強。
Chromeでアクセスすると、”/favicon.ico”にアクセスされるので、
適当なPNGファイルを用意して、それを返そうと思う。
こんな感じで、ファイルを用意する。
. ├── app.psgi └── favicon.png
“app.psgi”はこんな感じ。
use strict;
use warnings;
use v5.10;
use Data::Dumper;
my $app = sub {
my $env = shift;
if ( $env->{REQUEST_URI} eq '/favicon.ico' ) {
open my $fh, '<:raw', './favicon.png';
return [
200, [ "Content-Type" => "image/png" ], $fh
];
}
else {
return [
200,
[ 'Content-Type' => 'text/plain' ],
[ Dumper($env) ]
];
}
};
あと、”favicon.png”は16×16で適当に用意した。
実行方法は、以下の通り。
$ plackup app.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
ブラウザにキャッシュが残ってて、”/favicon.ico”にリクエストが来ない場合は、
ブラウザのキャッシュを削除してもいんだけど、それはめんどいので、
以下の要領でキャッシュの残ってなさそうなport番号を指定すると、
/favicon.icoにリクエストが来るようになる。
$ plackup -p 5001 app.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5001/
こんな感じで、適当にport番号を指定すれば”/favicon.ico”にリクエストが飛ぶ。
“favicon.ico”の件はこんなもんで良いですかね。
これが確認できるまでに、こんな感じに書いちゃってハマってた。(*1)
open my $fh, '<:raw', './favicon.png';
return [
200, [ "Content-Type" => "image/png" ], [ $fh ]
];
ファイルハンドルを[と]で括ると、
スカラーリファレンスとして解釈されちゃうので、
GLOB(0x...)みたいな文字列を返してたっぽい。
まとめると、
ファイルハンドルを渡す場合は、[と]で括る必要はない。
おしまい。
(*1) charsbarさん++
Leave a Comment