X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FInterface%2FWeb%2FHandler.pm;h=4bb64845130e94a336a8e7f5ca46dfe994be1a6d;hp=6a0660670773f550f0ac57d86e6aaa85bd18456c;hb=75162bb14b3e38d66617077843f4dfdcaf09d5c4;hpb=e70abd21bab68b23488f7ef1ee2e693a3b365691 diff --git a/rt/lib/RT/Interface/Web/Handler.pm b/rt/lib/RT/Interface/Web/Handler.pm index 6a0660670..4bb648451 100644 --- a/rt/lib/RT/Interface/Web/Handler.pm +++ b/rt/lib/RT/Interface/Web/Handler.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +# +# # (Except where explicitly superseded by other copyright notices) -# -# +# +# # LICENSE: -# +# # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. -# +# # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# +# +# # CONTRIBUTION SUBMISSION POLICY: -# +# # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) -# +# # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that @@ -43,7 +43,7 @@ # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. -# +# # END BPS TAGGED BLOCK }}} package RT::Interface::Web::Handler; @@ -153,7 +153,47 @@ sub NewApacheHandler { sub NewCGIHandler { require HTML::Mason::CGIHandler; - return NewHandler('HTML::Mason::CGIHandler', @_); + return NewHandler( + 'HTML::Mason::CGIHandler', + out_method => sub { + my $m = HTML::Mason::Request->instance; + my $r = $m->cgi_request; + + # Send headers if they have not been sent by us or by user. + $r->send_http_header unless $r->http_header_sent; + + # Set up a default + $r->content_type('text/html; charset=utf-8') + unless $r->content_type; + + if ( $r->content_type =~ /charset=([\w-]+)$/ ) { + my $enc = $1; + if ( lc $enc !~ /utf-?8$/ ) { + for my $str (@_) { + next unless $str; + + # only encode perl internal strings + next unless utf8::is_utf8($str); + $str = Encode::encode( $enc, $str ); + } + } + } + + # default to utf8 encoding + for my $str (@_) { + next unless $str; + next unless utf8::is_utf8($str); + $str = Encode::encode( 'utf8', $str ); + } + + # We could perhaps install a new, faster out_method here that + # wouldn't have to keep checking whether headers have been + # sent and what the $r->method is. That would require + # additions to the Request interface, though. + print STDOUT grep {defined} @_; + }, + @_ + ); } sub NewHandler { @@ -220,6 +260,11 @@ sub CleanupRequest { %RT::Ticket::MERGE_CACHE = ( effective => {}, merged => {} ); + # RT::System persists between requests, so its attributes cache has to be + # cleared manually. Without this, for example, subject tags across multiple + # processes will remain cached incorrectly + delete $RT::System->{attributes}; + # Explicitly remove any tmpfiles that GPG opened, and close their # filehandles. File::Temp::cleanup;