/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