add charset to default content-type header if STDOUT is in UTF-8
[perl/plp/.git] / lib / PLP / Tie / Headers.pm
index ef124912f886e4681e1873a1e09fdb5ab51f342e..8e023fb4fab45ce4cefb8ec8eee5dfac21b5e0ad 100644 (file)
@@ -4,6 +4,8 @@ use strict;
 use warnings;
 use Carp;
 
+our $VERSION = '1.00';
+
 =head1 PLP::Tie::Headers
 
 Makes a hash case insensitive, and sets some headers. <_> equals <->, so C<$foo{CONTENT_TYPE}> is
@@ -24,12 +26,18 @@ sub TIEHASH {
                {
                        'content-type'  => 'Content-Type',
                        'x-plp-version' => 'X-PLP-Version',
-               }
+               },
+               1  # = content-type untouched
        ], $_[0];
 }
 
 sub FETCH {
        my ($self, $key) = @_;
+       if ($self->[2] and defined $self->[0]->{'Content-Type'}) {
+               my $utf8 = eval { grep {$_ eq "utf8"}  PerlIO::get_layers(*STDOUT) };
+               $self->[0]->{'Content-Type'} .= '; charset=utf-8' if $utf8;
+               $self->[2] = 0;
+       }
        $key =~ tr/_/-/;
        return $self->[0]->{ $self->[1]->{lc $key} };
 }
@@ -48,6 +56,7 @@ sub STORE {
        } else {
                $self->[1]->{lc $key} = $key;
        }
+       $self->[2] = 0 if $key eq 'Content-Type';
        return ($self->[0]->{$key} = $value);
 }