The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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>