The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestApp::Controller::Cache;

use strict;
use base 'Catalyst::Controller';

sub auto : Private {
    my ( $self, $c ) = @_;

    $c->config->{counter}++;

    return 1;
}

sub count : Local {
    my ( $self, $c, $expires ) = @_;

    $c->cache_page( $expires );

    $c->res->output( $c->config->{counter} );
}

sub auto_count : Local {
    my ( $self, $c ) = @_;

    $c->res->output( $c->config->{counter} );
}

sub set_count : Local {
    my ( $self, $c, $newvalue ) = @_;

    $c->config->{counter} = $newvalue || 0;

    $c->res->output( $c->config->{counter} );
}

sub another_auto_count : Local {
    my ( $self, $c ) = @_;

    $c->forward( 'auto_count' );
}

sub cache_extension_header : Local {
    my ( $self, $c, $expires ) = @_;
    $c->cache_page( $expires );
    $c->res->headers->header('X-Bogus-Extension' => 'True');
    $c->res->output( 'ok' );
}

sub clear_cache : Local {
    my ( $self, $c ) = @_;

    my $removed = $c->clear_cached_page( '/cache/count' );

    $c->res->output( $removed );
}

sub clear_cache_regex : Local {
    my ( $self, $c ) = @_;

    my $removed = $c->clear_cached_page( '/cache/.*' );

    $c->res->output( $removed );
}

sub test_datetime : Local {
    my ( $self, $c ) = @_;

    require DateTime;

    my $dt = DateTime->new( day => 24, month => 1, year => 2026, time_zone => 'UTC' );

    $c->cache_page( $dt );

    $c->res->output( $c->config->{counter} );
}

sub extra_options : Local {
    my ( $self, $c ) = @_;

    $c->cache_page(
        last_modified   => time,
        expires         => 60,
        cache_seconds   => 20,
    );

    $c->res->output( $c->config->{counter} );
}

sub no_cache : Local {
    my ( $self, $c ) = @_;

    $c->cache_page(
        last_modified   => time,
        expires         => 0,
        cache_seconds   => 20,
    );

    $c->res->output( $c->config->{counter} );
}

sub busy : Local {
    my ( $self, $c ) = @_;

    $c->cache_page( 1 );

    sleep 2;

    $c->res->output( $c->config->{counter} );
}

sub get_key : Local {
    my ( $self, $c ) = @_;

    $c->cache_page( 1 );

    $c->res->output( $c->_get_page_cache_key );
}

1;