allow templates to be returned from content handlers
This commit is contained in:
parent
adb67b2137
commit
b8dec21449
2 changed files with 104 additions and 2 deletions
|
|
@ -165,12 +165,18 @@ sub handle {
|
||||||
|
|
||||||
# We decide what to do next depending on what the contentHandler returned
|
# We decide what to do next depending on what the contentHandler returned
|
||||||
|
|
||||||
|
# A WebGUI::Asset::Template object means we should process it
|
||||||
|
if ( defined $output && blessed $output && $output->isa( 'WebGUI::Asset::Template' ) ) {
|
||||||
|
$session->http->sendHeader;
|
||||||
|
$session->output->print( $output->process );
|
||||||
|
return;
|
||||||
|
}
|
||||||
# "chunked" or "empty" means it took care of its own output needs
|
# "chunked" or "empty" means it took care of its own output needs
|
||||||
if (defined $output && ( $output eq "chunked" || $output eq "empty" )) {
|
elsif (defined $output && ( $output eq "chunked" || $output eq "empty" )) {
|
||||||
#warn "chunked and empty no longer stream, use session->response->stream() instead";
|
#warn "chunked and empty no longer stream, use session->response->stream() instead";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
# non-empty output should be used as the response body
|
# other non-empty output should be used as the response body
|
||||||
elsif (defined $output && $output ne "") {
|
elsif (defined $output && $output ne "") {
|
||||||
# Auto-set the headers
|
# Auto-set the headers
|
||||||
$session->http->sendHeader;
|
$session->http->sendHeader;
|
||||||
|
|
|
||||||
96
t/WebGUI.t
Normal file
96
t/WebGUI.t
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
# vim:syntax=perl
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
# Please read the legal notices (docs/legal.txt) and the license
|
||||||
|
# (docs/license.txt) that came with this distribution before using
|
||||||
|
# this software.
|
||||||
|
#------------------------------------------------------------------
|
||||||
|
# http://www.plainblack.com info@plainblack.com
|
||||||
|
#------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Test the WebGUI PSGI handler
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use strict;
|
||||||
|
use lib "$FindBin::Bin/lib";
|
||||||
|
use Test::More;
|
||||||
|
use WebGUI::Test; # Must use this before any other WebGUI modules
|
||||||
|
use WebGUI;
|
||||||
|
use WebGUI::Session;
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Init
|
||||||
|
my $session = WebGUI::Test->session;
|
||||||
|
|
||||||
|
# A template object to play with
|
||||||
|
my $template = WebGUI::Test->asset(
|
||||||
|
className => 'WebGUI::Asset::Template',
|
||||||
|
template => '<html><body>Template World</body></html>',
|
||||||
|
);
|
||||||
|
|
||||||
|
# Create a fake content handler class to install in the config
|
||||||
|
BEGIN {
|
||||||
|
$INC{'WebGUI/Content/TestHandler.pm'} = __FILE__;
|
||||||
|
$INC{'WebGUI/Content/TestChunked.pm'} = __FILE__;
|
||||||
|
$INC{'WebGUI/Content/TestTemplate.pm'} = __FILE__;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
package WebGUI::Content::TestHandler;
|
||||||
|
sub handler { '<html><body>Hello World</body></html>' }
|
||||||
|
package WebGUI::Content::TestChunked;
|
||||||
|
sub handler { "chunked" }
|
||||||
|
package WebGUI::Content::TestTemplate;
|
||||||
|
sub handler { $template }
|
||||||
|
|
||||||
|
package main;
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Test the various possibilities of content handlers
|
||||||
|
my ( $fh );
|
||||||
|
|
||||||
|
$session->config->set( 'contentHandlers', [ 'WebGUI::Content::TestHandler' ] );
|
||||||
|
$fh = capture_output();
|
||||||
|
WebGUI->handle( $session );
|
||||||
|
is(
|
||||||
|
get_output( $fh ),
|
||||||
|
WebGUI::Content::TestHandler->handler,
|
||||||
|
'handler that returns HTML is output directly',
|
||||||
|
);
|
||||||
|
|
||||||
|
$session->config->set( 'contentHandlers', [ 'WebGUI::Content::TestChunked' ] );
|
||||||
|
$fh = capture_output();
|
||||||
|
WebGUI->handle( $session );
|
||||||
|
isnt(
|
||||||
|
get_output( $fh ),
|
||||||
|
'chunked',
|
||||||
|
'chunked is not returned',
|
||||||
|
);
|
||||||
|
|
||||||
|
$session->config->set( 'contentHandlers', [ 'WebGUI::Content::TestTemplate' ] );
|
||||||
|
$fh = capture_output();
|
||||||
|
WebGUI->handle( $session );
|
||||||
|
is(
|
||||||
|
get_output( $fh ),
|
||||||
|
$template->process,
|
||||||
|
'handler that returns template is processed',
|
||||||
|
);
|
||||||
|
|
||||||
|
sub capture_output {
|
||||||
|
my $output_fh = undef;
|
||||||
|
open $fh, '+>', \$output_fh;
|
||||||
|
$session->output->setHandle( $fh );
|
||||||
|
return $fh;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_output {
|
||||||
|
my ( $fh ) = @_;
|
||||||
|
seek $fh, 0, 0;
|
||||||
|
return join '', <$fh>;
|
||||||
|
}
|
||||||
|
|
||||||
|
done_testing;
|
||||||
|
#vim:ft=perl
|
||||||
Loading…
Add table
Add a link
Reference in a new issue