ASP4
view release on metacpan or search on metacpan
lib/ASP4/Response.pm view on Meta::CPAN
package ASP4::Response;
use strict;
use warnings 'all';
use HTTP::Date qw( time2str );
use ASP4::HTTPContext;
use ASP4::Mock::RequestRec;
sub new
{
my $s = bless {
_status => 200,
_expires => 0,
_content_type => 'text/html',
_expires_absolute => time2str( time() ),
}, shift;
$s->Status( $s->Status );
$s->Expires( $s->Expires );
$s->ContentType( $s->ContentType );
return $s;
}# end new()
sub context { ASP4::HTTPContext->current }
sub ContentType
{
my $s = shift;
if( @_ )
{
my $type = shift;
$s->{_content_type} = $type;
$s->context->r->content_type( $type );
$s->SetHeader( 'content-type' => $type );
}
else
{
return $s->{_content_type};
}# end if()
}# end ContentType()
sub Expires
{
my $s = shift;
if( my $value = shift )
{
my $time;
if( my ($num,$type) = $value =~ m/^(\-?\d+)([MHD])$/ )
{
my $expires;
if( $type eq 'M' ) {
# Minutes:
$expires = time() + ( $num * 60 );
}
elsif( $type eq 'H' ) {
# Hours:
$expires = time() + ( $num * 60 * 60 );
}
elsif( $type eq 'D' ) {
# Days:
$expires = time() + ( $num * 60 * 60 * 24 );
}# end if()
$time = $expires;
}
else
{
$time = $value;
}# end if()
$s->{_expires} = $time;
$s->{_expires_absolute} = time2str( $time );
$s->SetHeader( expires => $s->ExpiresAbsolute );
}# end if()
return $s->{_expires};
}# end Expires()
sub ExpiresAbsolute { shift->{_expires_absolute} }
sub Status
{
my $s = shift;
@_ ? $s->context->r->status( $s->{_status} = +shift ) : $s->{_status};
}# end Status()
sub End
{
my $s = shift;
if( $s->Status =~ m{^2} )
{
$s->Flush;
}
else
{
delete $s->context->headers_out->{'content-type'};
}# end if()
# Would be nice to somehow stop all execution:
$s->context->did_end( 1 );
}# end End()
sub Flush
{
my $s = shift;
$s->context->rflush;
}# end Flush()
sub Clear
{
shift->context->rclear
}# end Clear()
sub IsClientConnected
{
! shift->context->r->connection->aborted();
}# end IsClientConnected()
sub Write
{
my $s = shift;
$s->context->rprint( shift(@_) )
}# end Write()
sub SetCookie
{
my ($s, %args) = @_;
$args{domain} ||= eval { $s->context->config->data_connections->session->cookie_domain } || $ENV{HTTP_HOST};
$args{path} ||= '/';
my @parts = ( );
push @parts, $s->context->server->URLEncode($args{name}) . '=' . $s->context->server->URLEncode($args{value});
unless( $args{domain} eq '*' )
{
push @parts, 'domain=' . $s->context->server->URLEncode($args{domain});
}# end unless()
push @parts, 'path=' . $args{path};
if( $args{expires} )
{
if( my ($num,$type) = $args{expires} =~ m/^(\-?\d+)([MHD])$/ )
{
my $expires;
if( $type eq 'M' ) {
# Minutes:
$expires = time() + ( $num * 60 );
}
elsif( $type eq 'H' ) {
# Hours:
$expires = time() + ( $num * 60 * 60 );
}
elsif( $type eq 'D' ) {
lib/ASP4/Response.pm view on Meta::CPAN
$Response->Flush();
$Response->Write("Hello, World!");
$Response->AddHeader( 'x-awesomeness' => '100%' );
$Response->SetHeader( 'x-velocity' => '100MPH' );
# Expires in the future:
$Response->Expires( '30M' ); # 30 minutes from now
$Response->Expires( '30H' ); # 30 hours from now
$Response->Expires( '30D' ); # 30 days from now
# Expires in the past:
$Response->Expires( '-30M' ); # 30 minutes ago
$Response->Expires( '-30H' ); # 30 hours ago
$Response->Expires( '-30D' ); # 30 days ago
$Response->SetCookie(
# Required parameters:
name => "customer-email",
value => $Form->{email},
# The rest are optional:
expires => '30D', # 30 days
path => '/',
domain => '.mysite.com',
);
$Response->Redirect( "/path/to/page.asp" );
$Response->Include( $Server->MapPath("/my/include.asp") );
$Response->Include( $Server->MapPath("/my/include.asp"), \%args );
my $string = $Response->TrapInclude( $Server->MapPath("/my/widget.asp") );
my $string = $Response->TrapInclude( $Server->MapPath("/my/widget.asp"), \%args );
return $Response->Declined;
$Response->End;
while( 1 ) {
last unless $Response->IsClientConnected();
$Response->Write("Still Here!<br/>");
sleep(1);
}
my HTTP::Headers $headers = $Response->Headers;
# Read-only:
my $expires_on = $Response->ExpiresAbsolute;
=head1 DESCRIPTION
The C<$Response> object offers a unified interface to send content back to the client.
=head1 PROPERTIES
=head2 ContentType( [$type] )
Sets or gets the C<content-type> header for the response. Examples are C<text/html>, C<image/gif>, C<text/csv>, etc.
=head2 Status( [$status] )
Sets or gets the C<Status> header for the response. See L<http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html> for details.
B<NOTE:> Only the numeric part is necessary - eg: 200, 301, 404, etc.
=head2 Headers()
Returns the L<HTTP::Headers> object that will be used for the outgoing response.
If necessary, you can manipulate this object in any way you see fit.
=head2 Declined
For use within a L<ASP4::RequestFilter> subclass, like this:
sub run {
# Permit requests only every other second:
if( time() % 2 ) {
return $Response->Declined;
}
else {
$Response->Write("Try again");
return $Response->End;
}
}
=head2 IsClientConnected
In a ModPerl environment, this can be used to determine whether the client has
closed the connection (hit the "Stop" button or closed their browser). Useful within
a long-running loop.
=head1 METHODS
=head2 Write( $str )
Adds C<$str> to the output buffer.
=head2 Flush( )
Causes the output buffer to be flushed to the client.
=head2 End( )
Aborts the current request.
Example:
# Good:
return $Response->End;
Simply calling...
# Bad!
$Response->End;
...will not work as intended.
( run in 1.147 second using v1.01-cache-2.11-cpan-524268b4103 )