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

use strict;
use warnings;
use base qw(Catalyst::Plugin::Compress);

=head1 NAME

Catalyst::Plugin::Compress::WithExclusions - Compresses all responses from the server, except excluded paths

=head1 VERSION

Version 0.02

=cut

our $VERSION = '0.02';

my @excluded = ();

=head1 SYNOPSIS

    use Catalyst qw/Compress::WithExclusions/;

Then specifiy the excluded paths as an array ref of regular expressions
and the compression format that you want to use.

    __PACKAGE__->config(
      compression_excluded => ['path_regex', ],
      compression_format => $format
    );

Accepted formats for $format are the same as defined in L<Catalyst::Plugin::Compress>

=head1 DESCRIPTION

It is always a good idea to compress the results that are returned from
your web application, if the client can handle it. L<Catalyst::Plugin::Compress>
does that for you with very little effort. However, there are times when you might
not want the reponse to be compressed. For example when a returning a file that has
already been zipped. The extra compression is unlikely to reduce the file size and
will just add extra load to the server. This module builds upon the
L<Catalyst::Plugin::Compress> module and adds the option to skip the compression step
for certain url paths. So, for example, if you dont want to compress any files in the
download path, then you would add the following to your config:

    __PACKAGE__->config(
      compression_excluded => ['^download', ],
    );

Now all urls on the site that start with download will be uncompressed and everything
else will be compressed as requested.
 
=head1 SUBROUTINES/METHODS

=head2 setup

This is an internal method. It checks to see if any exclusions have been
added in the configuration file.

=cut

sub setup {
  my $c = shift;

  if (exists $c->config->{compression_excluded}) {
    if (ref($c->config->{compression_excluded}) eq 'ARRAY') {
      @excluded = @{$c->config->{compression_excluded}};
    }
    else {
      if ($c->debug) {
        $c->log->debug("'compression_excluded' configuration should be an array reference'");
      }
    }
  }
  $c->maybe::next::method(@_);
}

=head2 should_compress_response

This is an internal method that first checks to see if the path should be excluded
from compression and then passes on to the parent for further checks.

=cut

sub should_compress_response {
  my $c = shift;
  my $action = $c->req->action;

  foreach my $test (@excluded) {
    if ($action =~ /$test/) {
      return;
    }
  }
  $c->maybe::next::method(@_);
}

=head1 AUTHOR

Jody Clements, C<< <clementsj at janelia.hhmi.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-catalyst-plugin-compress-hmmer at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Catalyst-Plugin-Compress-WithExclusions>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.


=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Catalyst::Plugin::Compress::WithExclusions


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Catalyst-Plugin-Compress-WithExclusions>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Catalyst-Plugin-Compress-WithExclusions>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Catalyst-Plugin-Compress-WithExclusions>

=item * Search CPAN

L<http://search.cpan.org/dist/Catalyst-Plugin-Compress-WithExclusions/>

=back


=head1 ACKNOWLEDGEMENTS


=head1 LICENSE AND COPYRIGHT

Copyright 2012 Jody Clements.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.


=cut

1; # End of Catalyst::Plugin::Compress::WithExclusions