NAME

CGI::Application::Plugin::Header - Plugin for handling header props.

SYNOPSIS

package MyApp;
use parent 'CGI::Application';
use CGI::Application::Plugin::Header;

sub do_something {
    my $self = shift;

    my $header = $self->header; # => CGI::Header object

    # get header props.
    my $type = $header->type; # => "text/plain"

    # set header props.
    $header->type("text/html");

    # compatible with the core methods of CGI::Application
    $self->header_props( type => "text/plain" );
    $self->header_add( type => "text/plain" );

    ...
}

DESCRIPTION

This plugin provides you the common syntax to handle CGI.pm-compatible HTTP header properties.

By using this plugin, your application is capable of the following methods, where $cgiapp denotes the instance of your application which inherits from CGI::Application:

ATTRIBUTES

$header = $cgiapp->header

Returns a CGI::Header object associated with $cgiapp. You can use all methods of $header.

sub cgiapp_postrun {
    my ( $self, $body_ref ) = @_;
    $self->header->set( 'Content-Length' => length $$body_ref );
}
$header = $cgiapp->header( CGI::Header->new(...) )

You can also define your header class which inherits from CGI::Header. For example,

package MyApp::Header;
use parent 'CGI::Header';
use CGI::Cookie;

sub cookies {
    my $self    = shift;
    my $cookies = $self->header->{cookies} ||= [];

    return $cookies unless @_;

    if ( ref $_[0] eq 'HASH' ) {
        push @$cookies, map { CGI::Cookie->new($_) } @_;
    }
    else {
        push @$cookies, CGI::Cookie->new( @_ );
    }

    $self;
}

You can set header as follows:

# using new()

my $query  = CGI->new;
my $header = MyApp::Header->new( query => $query );
my $app    = MyApp->new( query => $query, header => $header );


# using header()

my $app = MyApp->new;

$app->header( MyApp::Header->new( query => $app->query ) );

METHODS

This plugin overrides the following methods of CGI::Application:

%header_props = $cgiapp->header_props
%header_props = $cgiapp->header_props( $k1 => $v1, $k2 => $v2, ... )
%header_props = $cgiapp->header_props({ $k1 => $v1, $k2 => $v2, ... })
%header_props = $cgiapp->header_props({})

Behaves like CGI::Application's header_props method, but the return format is modified. keys of %header_props are lowercased and start with a dash. The following aliases are used:

'-content-type' -> '-type'
'-cookie'       -> '-cookies'

It's guaranteed that the keys are unique.

$cgiapp->header_add( $k1 => $v1, $k2 => $v2, ... )
$cgiapp->header_add({ $k1 => $v1, $k2 => $v2, ... })

Behaves like CGI::Application's header_add method.

COMPATIBILITY

Header property names are normalized by $header automatically, and so this plugin breaks your code which depends on the return value of header_props:

my %header_props = $cgiapp->header_props; # => ( -cookies => 'ID=123456' )

if ( exists $header_props{-cookie} ) {
    ...
}

Those codes can be rewritten using $header as well as header_props or header_add:

if ( $cgiapp->header->exists('-cookie') ) {
    ...
}

The following plugins are compatible with this module:

CGI::Application::Plugin::Redirect

The following plugins are roughly compatible with this module:

CGI::Application::Plugin::Stream

"Setting a custom Content-Length/-Content-Length header" is not supported by this module. In other words, the stream_file method always overwrites the Content-Length header.

CGI::Application::Plugin::Session

You need to overwrite the alias table of CGI::Header:

use parent 'CGI::Header';

sub _build_alias {
    +{
        'cookies'      => 'cookie',
        'content-type' => 'type',
    };
}

sub cookies {
    my $self = shift;
    return $self->header->{cookies} unless @_;
    $self->header->{cookies} = shift;
    $self;
}

sub cookie {
    my $self = shift;
    $self->cookies(@_);
}

AUTHOR

Ryo Anazawa (anazawa@cpan.org)

LICENSE

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.