1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
package Web::Machine::Util::BodyEncoding;
# ABSTRACT: Module to handle body encoding
use strict;
use warnings;
our $VERSION = '0.17';
use Scalar::Util qw/ weaken isweak /;
use Encode ();
use Web::Machine::Util qw[ first pair_key pair_value ];
use Sub::Exporter -setup => {
exports => [qw[
encode_body_if_set
encode_body
]]
};
sub encode_body_if_set {
my ($resource, $response) = @_;
encode_body( $resource, $response ) if $response->body;
}
sub encode_body {
my ($resource, $response) = @_;
my $metadata = $resource->request->env->{'web.machine.context'};
my $chosen_encoding = $metadata->{'Content-Encoding'};
my $encoder = $resource->encodings_provided->{ $chosen_encoding };
my $chosen_charset = $metadata->{'Charset'};
my $charsetter;
if ( $chosen_charset && $resource->charsets_provided ) {
my $match = first {
my $name = $_ && ref $_ ? pair_key($_) : $_;
$name && $name eq $chosen_charset;
}
@{ $resource->charsets_provided };
$charsetter
= ref $match
? pair_value($match)
: sub { Encode::encode( $match, $_[1] ) };
}
$charsetter ||= sub { $_[1] };
push @{ $resource->request->env->{'web.machine.content_filters'} ||= [] },
sub {
my $chunk = shift;
weaken $resource unless isweak $resource;
return unless defined $chunk;
return $resource->$encoder($resource->$charsetter($chunk));
};
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Web::Machine::Util::BodyEncoding - Module to handle body encoding
=head1 VERSION
version 0.17
=head1 SYNOPSIS
use Web::Machine::Util::BodyEncoding;
=head1 DESCRIPTION
This handles the body encoding.
=head1 FUNCTIONS
=over 4
=item C<encode_body_if_set ( $resource, $response, $metadata )>
If the C<$response> has a body, this will call C<encode_body>.
=item C<encode_body ( $resource, $response, $metadata )>
This will find the right encoding (from the 'Content-Encoding' entry
in the C<$metadata> HASH ref) and the right charset (from the 'Charset'
entry in the C<$metadata> HASH ref), then find the right transformers
in the C<$resource>. After that it will attempt to convert the charset
and encode the body of the C<$response>. Once completed it will set
the C<Content-Length> header in the response as well.
B<CAVEAT:> Note that currently this subroutine doesn't do anything when the
body is returned as a CODE ref. This is a bug to be remedied in the future.
=back
=head1 SUPPORT
bugs may be submitted through L<https://github.com/houseabsolute/webmachine-perl/issues>.
=head1 AUTHORS
=over 4
=item *
Stevan Little <stevan@cpan.org>
=item *
Dave Rolsky <autarch@urth.org>
=back
=head1 COPYRIGHT AND LICENCE
This software is copyright (c) 2016 by Infinity Interactive, Inc.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|