ClearPress
view release on metacpan or search on metacpan
lib/ClearPress/controller.pm view on Meta::CPAN
if($lang && scalar @{$lang}) {
$headers->header('Content-Language', join q[,], @{$lang});
}
my ($action, $entity, $aspect, $id, $process_request_error);
eval {
($action, $entity, $aspect, $id) = $self->process_request($headers);
1;
} or do {
carp qq[CAUGHT $EVAL_ERROR];
$process_request_error = $EVAL_ERROR;
};
my $params = {
util => $util,
entity => $entity,
aspect => $aspect,
action => $action,
id => $id,
headers => $headers,
};
#########
# initial header block
#
$headers->header('Content-Type', ClearPress::view->new($params)->content_type || 'text/html'); # don't forget to add charset
for my $cookie ($decorator->cookie) {
$self->{headers}->push_header('Set-Cookie', $_);
}
if($process_request_error) {
#########
# deferred error handling
#
return $self->handle_error($process_request_error, $headers);
}
$util->username($decorator->username());
$util->session($self->session($util));
my $viewobject;
eval {
$viewobject = $self->dispatch($params);
1;
} or do {
return $self->handle_error($EVAL_ERROR, $headers);
};
my $decor = $viewobject->decor(); # boolean
#########
# let the view have the decorator in case it wants to modify headers
#
$viewobject->decorator($decorator);
my $charset = $viewobject->charset();
$charset = ($charset && !exists $ENV{REDIRECT_STATUS}) ? qq[;charset=$charset] : q[];
my $content_type = sprintf q[%s%s], $viewobject->content_type(), $charset;
#########
# update the content-type/charset with whatever the view determined was right for the response
#
$headers->header('Content-Type', $content_type);
if($decor) {
# if($content_type =~ /text/smx && $charset =~ /utf-?8/smix) {
# binmode STDOUT, q[:encoding(UTF-8)]; # is this useful? If so, should it be less conditional?
# }
#########
# decorated header
#
$viewobject->output_buffer($decorator->header());
}
my $errstr;
eval {
#########
# view->render() may be streamed
#
if($viewobject->streamed) {
#########
# ->render is responsible for all (decorated/undecorated) output
#
$viewobject->render();
} else {
#########
# output returned content
#
$viewobject->output_buffer($viewobject->render());
}
1;
} or do {
#########
# 1. reset pending output_buffer (different view object)
# 2. set up error response w/headers
# 3. emit headers
# 4. hand off to error response handler
#
carp qq[controller::handler: view->render failed: $EVAL_ERROR];
$viewobject->output_reset(); # reset headers on the original view
$self->errstr($EVAL_ERROR);
my $code = $headers->header('Status');
if(!$code || $code == HTTP_OK) {
$headers->header('Status', HTTP_INTERNAL_SERVER_ERROR);
}
# my $content_type = $headers->header('Content-Type');
$content_type =~ s{;.*$}{}smx;
$headers->header('Content-Type', $content_type); # ErrorDocuments seem to have a bit of trouble with content-encoding errors so strip the charset
return $self->handle_error(undef, $headers); # hand off
};
#########
# prepend all response headers (and header block termination)
#
( run in 1.839 second using v1.01-cache-2.11-cpan-524268b4103 )