MojoX::Encode::Gzip - Gzip a Mojo::Message::Response


MojoX-Encode-Gzip documentation Contained in the MojoX-Encode-Gzip distribution.

Index


Code Index:

NAME

Top

MojoX::Encode::Gzip - Gzip a Mojo::Message::Response

SYNOPSIS

Top

    use MojoX:Encode::Gzip;

    # Simple
    MojoX::Encode::Gzip->new->maybe_gzip($tx);

    # With options
    my $gzip = MojoX::Encode::Gzip->new(
        min_bytes => 600,
        max_bytes => 600000,
    );
    $success = $gzip->maybe_gzip($tx);




DESCRIPTION

Top

Gzip compress a Mojo::Message::Response if client supports it.

ATTRIBUTES

min_bytes

The minumum number of bytes in the body before we would try to gzip it. Trying to gzip really small messages can take extra CPU power on the server and client without saving any times. Defaults to 500.

max_bytes

The maximum number of bytes in the body before we give up on trying gzip it. Gzipping very large messages can delay the response and possibly exhaust system resources. Defaults to 500000.

METHODS

Top

maybe_gzip

    my $success = $gzip->maybe_gzip($tx);

Given a Mojo::Transaction object, possibly gzips transforms the response by gzipping it. Returns true if we gzip it, and undef otherwise. The behavior is modified by the min_bytes and max_bytes attributes.

Currently we only only try to gzip Content-types that start with "text/", or end in "xml" or "javascript", along with "application/json". This may be configurable in the future.

AUTHOR

Top

Mark Stosberg, <mark at summersault.com>

BUGS

Top

Please report any bugs or feature requests to bug-mojox-encode-gzip at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MojoX-Encode-Gzip. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

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

    perldoc MojoX::Encode::Gzip




You can also look for information at:

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=MojoX-Encode-Gzip

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/MojoX-Encode-Gzip

* CPAN Ratings

http://cpanratings.perl.org/d/MojoX-Encode-Gzip

* Search CPAN

http://search.cpan.org/dist/MojoX-Encode-Gzip

ACKNOWLEDGEMENTS

Top

 Inspired by Catalyst::Plugin::Compress::Gzip

COPYRIGHT & LICENSE

Top


MojoX-Encode-Gzip documentation Contained in the MojoX-Encode-Gzip distribution.

package MojoX::Encode::Gzip;
use strict;
use warnings;
use base 'Mojo::Base';

our $VERSION = '1.10';

use Compress::Zlib ();

__PACKAGE__->attr( min_bytes => 500 );
__PACKAGE__->attr( max_bytes => 500000 );

sub maybe_gzip {
    my $self = shift;
    my $tx = shift;
    my $req = $tx->req;
    my $res = $tx->res;

    my $accept = $req->headers->header('Accept-Encoding') || '';
    my $body   = $res->body;
    my $length = $res->body_size || 0;

    # Don't both unless:
    # - we have a success code
    # - we have a content type that makes sense to gzip
    # - a client is asking for giving
    # - the content is not already encoded.
    # - The body is not too small or too large to gzip
    # XXX content-types should be configurable.
    unless ( ( index( $accept, 'gzip' ) >= 0 )
            and ( $length > $self->min_bytes )
            and ( $length < $self->max_bytes  )
            and ( $res->code == 200 )
            and ( not $res->headers->header('Content-Encoding'))
            and ( $res->headers->content_type =~ qr{^text|xml$|javascript$|^application/json$} )
    ) {
        return undef;
    }

   eval { local $/; $body = <$body> } if ref $body;
   die "Response body is an unsupported kind of reference" if ref $body;

    $res->body( Compress::Zlib::memGzip( $body ) );
    $res->headers->content_length( $length );
    $res->headers->header('Content-Encoding' => 'gzip');
    $res->headers->add( 'Vary' => 'Accept-Encoding' );

    return 1;
}

1;

__END__

1; # End of MojoX::Encode::Gzip