The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::Mobirc::Plugin::ExpireHeader;
use strict;
use warnings;
use App::Mobirc::Plugin;
use App::Mobirc::Util;
use App::Mobirc::Web::Handler;
use Encode;
use Params::Validate ':all';
use App::Mobirc::Validator;
use HTML::TreeBuilder::XPath;
use DateTime;
use DateTime::Format::HTTP;

my $time = time;

hook request_filter => sub {
    my ($self, $global_context, $req) = validate_hook('request_filter', @_);

    my $path = $req->uri->path;
    if ($path =~ m{^/static/\d+-(.+)$}) {
        $path = "/static/$1";
    }

    $req->uri->path($path);
};


hook response_filter => sub {
    my ($self, $global_context, $res) = validate_hook('response_filter', @_);

    my $req = App::Mobirc::Web::Handler->web_context->req;
    my $path = $req->uri->path;
    if ($path =~ m{^/static/}) {
        my $etag =  "'$time'";
        $res->header("Cache-Control" => "public; max-age=315360000; s-maxage=315360000");
        $res->header(Expires => DateTime::Format::HTTP->format_datetime(DateTime->now->add(years => 10)));
        $res->header(ETag => $etag);

        if (($req->header('If-None-Match') || "") eq $etag) {
            $res->status(304);
            $res->body("");
        }
    }
};

hook html_filter => sub {
    my ($self, $global_context, $req, $content) = validate_hook('html_filter', @_);
    DEBUG "CONTENT IS UTF* : " . Encode::is_utf8($content);

    my $tree = HTML::TreeBuilder::XPath->new;
    $tree->parse_content($content);

    for my $elem ($tree->findnodes('//link')) {
        my $path = $elem->attr('href');
        $path =~ s{/static/(.+)}{/static/$time-$1};
        $elem->attr(href => $path);
    }
    for my $elem ($tree->findnodes('//script')) {
        if (my $path = $elem->attr('src')) {
            $path =~ s{/static/(.+)}{/static/$time-$1};
            $elem->attr(src => $path);
        }
    }

    my $html = $tree->as_HTML(q[<>&"'{}]);
    $tree = $tree->delete;

    return ($req, decode_utf8($html));
};

1;