/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