The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bootylicious::Plugin::CanonicalUrl;

use strict;
use warnings;

use base 'Mojolicious::Plugin';

sub register {
    my ($self, $app, $conf) = @_;

    main::under(\&_bridge);
}

sub _bridge {
    my $self = shift;

    my $path = $self->req->url->path->to_string;
    return 1 unless $path;

    return 1 if $path =~ m{/$};

    return 1 if $path =~ m{\.(?:[a-z]+)$};

    my $canonical_location =
      $self->req->url->clone->path($path . '.html')->to_abs;

    $self->app->log->debug("Path is not canonical: " . $self->req->url);
    $self->app->log->debug("Redirecting to: " . $canonical_location);

    $self->redirect_to($canonical_location);

    # Stop
    return 0;
}

1;