NAME

Router::PathInfo::Static - static routing

DESCRIPTION

Class to describe the routing of statics. Allows us to describe the statics as follows:

- Specify the starting segment of the URI

- Specify a directory on disk, which will host the search for static

Statics is divided into two parts:

- allready - already exists (the "classic") static

- on_demand - created on demand

Case allready it's different css, js, images. on_demand it's archives and another. If the file to on_demand not found, match return undef - a signal that makes sense to continue search of Router::PathInfo::Controller routing.

If successful, returns hashref:

{
    type => 'static',
    mime_type => $mime_type,
    file_name => '/path/to/found.static',
};

This ensures that the file exists, has size, and is readable.

If static is not found (for allready) an error is returned:

{
    type  => 'error',
    code => 404,
    desc  => sprintf('not found static for PATH_INFO = %s', $env->{PATH_INFO})
}

If PATH_INFO contains illegal characters (such as /../ or /.file)an error is returned:

{
    type  => 'error',
    code => 403,
    desc  => sprintf('forbidden for PATH_INFO = %s', $env->{PATH_INFO})   
}

Return undef means that it makes sense to continue search of Router::PathInfo::Controller routing.

SYNOPSIS

my $s = Router::PathInfo::Static->new(
        # describe simple static 
        allready => {
            path => $allready_path,
            first_uri_segment => 'static'
        },
        # describe on demand created static
        on_demand => {
            path => $on_demand_path,
            first_uri_segment => 'archives',
        }
);

my $env = {PATH_INFO => '/static/some.jpg'};
my @segment = split '/', $env->{PATH_INFO}, -1; 
shift @segment;
$env->{'psgix.tmp.RouterPathInfo'} = {
    segments => [@segment],
    depth => scalar @segment 
};

my $res = $s->match($env);

# $res = {
#     type  => 'static',
#     file  => $path_to_some_jpg,
#     mime  => 'image/jpeg'
# }

METHODS

new(allready => {path => $dir, first_uri_segment => $uri_segment}, on_demand => {...})

The constructor accepts the description of the statics (allready) and/or static generated on demand (on_demand). Each description is a hashref with the keys 'path' (directory path) and 'first_uri_segment' (the first segment of a PATH_INFO, which defines namespace for designated purposes).

All arguments are optional. If no arguments are given, the object is not created.

match({'psgix.tmp.RouterPathInfo' => {...}})

Objects method. Receives a uri and return:

For on_demand created static, return undef if file not found.

DEPENDENCIES

Plack::MIME, File::MimeInfo::Magic

SEE ALSO

Router::PathInfo, Router::PathInfo::Controller

AUTHOR

mr.Rico <catamoose at yandex.ru>