From: Mischa POSLAWSKY Date: Fri, 30 May 2008 18:34:45 +0000 (+0000) Subject: add charset to default content-type header if STDOUT is in UTF-8 X-Git-Tag: 3.21~10 X-Git-Url: http://git.shiar.nl/perl/plp/.git/commitdiff_plain/178a4a4de0bbc111bf376d6876af16c093e3c838 add charset to default content-type header if STDOUT is in UTF-8 If output has utf8 layer enabled, it makes only sense to mark it as such to clients. Only available with PerlIO (as of Perl 5.8 afaict), but not fatal (assume non-utf8) if it doesn't work. Charset is only added at first read or change of the content-type value, so it's not hardcoded to site defaults. Requires an extra object variable unfortunately, but the only way to make it useful (no page runtime accomodation wouldn't give much advantage). --- diff --git a/Changes b/Changes index a8d2b27..8d493cd 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,4 @@ +- Add charset to Content-Type header for UTF-8 output - Test pod coverage - %header values containing newlines will be sent as multiple fields - All modules use warnings and contain a $VERSION diff --git a/lib/PLP/Tie/Headers.pm b/lib/PLP/Tie/Headers.pm index c675f8a..8e023fb 100644 --- a/lib/PLP/Tie/Headers.pm +++ b/lib/PLP/Tie/Headers.pm @@ -26,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} }; } @@ -50,6 +56,7 @@ sub STORE { } else { $self->[1]->{lc $key} = $key; } + $self->[2] = 0 if $key eq 'Content-Type'; return ($self->[0]->{$key} = $value); }