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

NAME

MPMinus::Manual - What is MPMinus, and how do I use it

TERMS

Apache

Apache web server version 2+. This web server is the only server supporting MPMinus. MPMinus developed on the basis of the mod_perl2 model, as an Apache module.

m

It is general MPMinus object that provides most methods for access to MPMinus functionality

mod_perl

mod_perl brings together the full power of the Perl programming language and the Apache HTTP server. You can use Perl to manage Apache, respond to requests for web pages and much more.

See http://perl.apache.org/

MPM

Acronym (ModPerl2 Minus), base namespace of all installed MPMinus projects.

DESCRIPTION

MPMinus - mod_perl2 Web Application Framework

This framework will help You create mod_perl2 sites and REST API services

HOW TO START?

INSTALL
    cpan install MPMinus

or

    cpanm MPMinus
CREATING A NEW PROJECT
    mpminus create Foo -d foo.localhost

Creates Foo project in ./foo.localhost

For about switches:

    mpminus -H
INSTALL PROJECT
    cd ./foo.localhost
    perl Makefile.PL
    make
    make test
    make install
    make clean

Copy configuration file from ./src directory to Apache directory and restart it!

You can distributin your new created project using dist command:

    make dist

Done! Your tar.gz file is already here!

    MPM-Foo-1.00.tar.gz
TESTING
    lynx foo.localhost

Profit!

CONFIGURATION

Configuration parameters are initialized in the MPM::MyApp::Handlers package, that cals via Apache web server config file.

    sub handler {
        my $r = shift;
        my $m = MPMinus->m;
        $m->conf_init($r, __PACKAGE__);

        ...

        my $project = $m->conf('project');

        ...
    }

For accessing to configuration variables you can use getter methods conf or get_conf also setter method - set_conf. See MPMinus::Configuration

APACHE PER-DIRECTORY VARIABLES

Apache per-directory variables is variables that specified by the PerlSetVar and PerlAddVar directives in Apache config files, eg:

    PerlSetVar ModperlRoot /var/www/foo.localhost

For more information about per-directory variables see http://perl.apache.org/docs/2.0/api/Apache2/RequestUtil.html

For MPMinus projects allowed following directives:

confdir
    PerlSetVar confdir /var/www/foo.localhost

    my $confdir = $m->conf("confdir");

This directive sets directory (path) for searching configuration files of current project

Default: <DOCUMENT_ROOT>/conf

config, configfiles
    PerlSetVar config /var/www/foo.localhost/foo.conf

    my $config_file = $m->conf("fileconf");
    my $config_file = $m->conf("configfiles")->[0];

In configuration file specifies configuration file. In handlers the getter method $m->conf("configfiles") returns array of loaded configuration files; the method $m->conf("fileconf") returns main loaded file

Default: <DOCUMENT_ROOT>/lc(<PROJCET_NAME>).conf

debug
    PerlSetVar debug on

    $m->log_eror("Oops!") if $m->conf("debug");

Debug flag. The argument can be: on/off; enable/disable; yes/no; true/false and 1/0 The $m->conf("debug") returns boolean value: 1 -- on, 0 -- off

Default: off

modperlroot
    PerlSetVar modperlroot /var/www/foo.localhost

    my $root = $m->conf("modperlroot");

Sets alternate of DOCUMENT_ROOT. Optional directive

Default eq <DOCUMENT_ROOT>

READ-ONLY MPMINUS PARAMETERS

Parameters that You can read only

GENERAL PARAMETERS

configloadstatus
    print "Configuration has been loaded!" if $m->conf("configloadstatus");

Return boolean status of loading configuration files

Default: 0

hitime
    print $m->conf("hitime"); # 1556209483.07221

Returns inited High-precision time value in seconds with 5-dig precision

locked_keys
    my $array = $m->conf("locked_keys");

Returns reference to list of locked directives (for read only)

Default:

    [confdir, configloadstatus, debug, document_root, fileconf, hitime,
    http_host, https, locked_keys,logdir, modperl_root, package,
    prefix, project, remote_addr, remote_user, request_method,
    request_uri, server_admin, server_name, server_port, sid, url]
logdir
    my $dir = $m->conf("logdir");

Returns system log-directory

Default: /var/log

package
    my $vals = $m->conf("package"); # [MPM::Foo::Handlers, 0]
    my $package = $vals->[0];
    my $count = $vals->[1];

Returns reference to list. First value is package of initializer; second value is counter, number of request on child process

PROJECT PARAMETERS

Parameters describing the current project

document_root, modperl_root
    my $vals = $m->conf("document_root"); # /var/www/foo.localhost

Returns DOCUMENT_ROOT directory

prefix
    my $prefix = $m->conf("prefix"); # foo

Returns the project name in lowercase

project
    my $name = $m->conf("project"); # Foo

Returns the project name

server_admin
    my $server_admin = $m->conf("server_admin"); # root@localhost

Returns SERVER_ADMIN

server_name
    my $server_name = $m->conf("server_name"); # foo.localhost

Returns SERVER_NAME

server_port
    my $server_port = $m->conf("server_port"); # 80

Returns SERVER_PORT

Default: 80

url
    my $url = $m->conf("url"); # http://foo.localhost

Returns URL of this server

REQUEST PARAMETERS

Parameters set for each HTTP request

http_host
    my $http_host = $m->conf("http_host"); # foo.localhost

Returns hostname from the "Host" header of request

https
    print "Is HTTPS!" if $m->conf("https");

Returns HTTPS flag if current request was make via HTTPS protocol

Default: 0

remote_addr
    my $remote_addr = $m->conf("remote_addr"); # 127.0.0.1

Returns current IP (IPv4 or IPv6) address of client

Default: 127.0.0.1

remote_user
    my $remote_user = $m->conf("remote_user");

Returns current username from request header

request_method
    my $request_method = $m->conf("request_method");

Returns HTTP current request method

Default: GET

request_uri
    my $path_string = $m->conf("request_uri");

Returns path-string of current HTTP request

Default: /

Example: /mpminfo

sid
    my $sid = $m->conf("sid"); # 802a28bffa20f4dc

Returns SessionID, 16 hex random characters, session signature

DEPRECATED PARAMETERS

Following list contains deprecated and actually not existing parameters and directives.

Flags
    _debug_, _errorsendmail_, _sendmail_, _syslog_
Files and directories
    file_connect, file_debug, file_error, file_mail, file_mpminfo,
    dir_cache, dir_conf, dir_db, dir_logs, dir_shtml
Misc
    errorlog, debuglog, url_shtml, urls, urls_shtml

All listed parameters now are prohibited to use.

USER DEFINED MPMINUS PARAMETERS

All .conf files of current project contains only user directives. The value of each directive of configuration files can be read or modified using getters and setters

MULTISTORE CONFIGURATION

The following construction is used to configure the Multistore mechanism:

  <store foo>
    dsn   DBI:mysql:database=TEST;host=192.168.1.1
    user  login
    pass  password
    <Attr>
      mysql_enable_utf8 1
      RaiseError        0
      PrintError        0
    </Attr>
  </store>
  <store bar>
    dsn   DBI:Oracle:FOOSID
    user  login
    pass  password
    <Attr>
      RaiseError        0
      PrintError        0
    </Attr>
  </store>
  <store baz>
    dsn   DBI:Oracle:BARSID
    user  login
    pass  password
    <Attr>
      RaiseError        0
      PrintError        0
    </Attr>
  </store>

The accessor methods detailed described in "EXAMPLE" in MPMinus::Store::MultiStore example

API

A classic example of a site created with MPMinus contains 5 mandatory files:

    MPM/MyApp.pm
    MPM/MyApp/Handlers.pm
    MPM/MyApp/Index.pm
    MPM/MyApp/Info.pm
    MPM/MyApp/Root.pm

For example see eg/MPM/MyApp.pm file(s)

MyApp.pm

Your POD documentation file. Contains also the projects version and any meta-info of Your project. Usually does not contain any program code.

Handlers.pm

The first and very important file of Your project! The file contains handler-definition for mod_perl2

See eg/MPM/MyApp/Handlers.pm file for example

Index.pm

The file contains list of enabled (plugged) modules of Your project. By default enabled Root and Info modules only. For examle:

    use base qw/
        MPM::MyApp::Root
        MPM::MyApp::Info
    /;

You can extends this list yours modules

Info.pm

Main information file. Contains usually code:

    sub record {
        (
            -uri      => '/mpminfo',
            -response => sub { shift->mpminfo },
        )
    }
Root.pm

File of root controller ("/" string as path of URL)

See eg/MPM/MyApp/Root.pm file for example

MAIN METHODS

All main methods detailed described in MPMinus

MVC SKEL TRANSACTION METHODS

The "MVC SKEL TRANSACTION" or "MST" -- is an ideological concept!

All methods of the MST detailed described in MPMinus::Transaction

LOG METHODS

All log methods detailed described in MPMinus::Log

APACHE HANDLERS

All available Apache handlers detailed described in mod_perl man pages http://perl.apache.org/

The MPMinus by default only works with some of the basic HTTP handlers:

    PerlInitHandler
    PerlAccessHandler
    PerlAuthenHandler
    PerlAuthzHandler
    PerlTypeHandler
    PerlFixupHandler
    PerlResponseHandler
    PerlLogHandler
    PerlCleanupHandler

NOTE! MPMinus use modperl handler type only! See http://perl.apache.org/docs/2.0/user/config/config.html

    SetHandler modperl
    PerlOptions +GlobalRequest

...or in Handlers.pm (handler):

    $r->handler('modperl')

See also MPMinus::BaseHandlers and http://perl.apache.org/docs/2.0/user/handlers/http.html

FILTERS

Filters are supported but not used in the MPMinus base configuration.

See http://perl.apache.org/docs/2.0/user/handlers/filters.html

    sub handler {
        ...
        $r->add_output_filter(\&OutputFilterHandler);
        $r->add_input_filter(\&InputFilterHandler);
        ...
    }

See also "FILTERS" in MPMinus::BaseHandlers

DISPATCHING

The MPMinus provides URL-to-Action dispatching using the "MVC SKEL Transaction" pattern

Supported dispatching types:

    Location, Regexp, LocArr и MixArr.
Location

Simple base dispatching by request URI (path based)

In Apache config file:

    <Location ~ ^/$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>

In MPM::MyApp::Root:

    sub record {
        (
            -uri => '/',
            ...
        )
    }

Fast and pretty!

Regexp

Regexp dispatching

In Apache config file:

    <Location ~ ^\/[a-zA-Z0-9]{16}\/?$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>

In MPM::MyApp::Root:

    sub record {
        (
            -uri => ['REGEXP', 'root', qr/^\/[a-zA-Z0-9]{16}\/?$/],
            ...
        )
    }
LocArr

Multiple path matching

In Apache config file:

    <Location ~ \.[mM][pP][mM]$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>
    <Location ~ ^/$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>

In MPM::MyApp::Root:

    sub record {
        (
            -uri => ['LOCARR', 'root', ['/','/root.mpm','/index.mpm']],
            ...
        )
    }
MixArr

Mixed dispatching

In Apache config file:

    <Location ~ \.[mM][pP][mM]$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>
    <Location ~ ^/$>
        PerlInitHandler MPM::MyApp::Handlers
    </Location>

In MPM::MyApp::Root:

    sub record {
        (
            -uri => ['MIXARR', 'root', ['/', qr/^\/(root|index)\.mpm$/]],
            ...
        )
    }

MVC TERMS

Model

See MPMinus::Store::MultiStore, MPMinus::Store::MySQL, MPMinus::Store::Oracle, MPMinus::Store::DBI

View

See Template::Toolkit, Mason, HTML::Template, TemplateM and etc.

Controller

All Your MPM::MyApp::XXX classes!

MVC SKEL TRANSACTION

The MVC SKEL Transaction is a pattern, concept of application development

    sub record {(
        ...

        # Обработчики
        -init     => \&hInit,
        -fixup    => \&hFixup,
        -response => \&hResponse,
        -cleanup  => \&hCleanup,

        -meta     => {
            registration => {
                handler => {
                    chck => \&registration_chck,
                    form => [\&registration_form, \&default_form,],
                    proc => \&registration_proc,
                    access => sub { 1 },
                    deny => sub { 1 },
                },
                content_type => 'text/html; charset=UTF-8',
                foo => 'qwe',
                bar => 'rty',
                baz => 123,
                ...
            },
    )}

The "registration" is a name from action QUERY_STRING param, e.g:

    ?action=registration

The "handler" contains MVC SKEL hooks definitions:

    chck, form, proc, access, deny

running phases of the hooks:

    Phase    Type
   --------+------
    access | DUAL
    deny   | HTTP
    chck   | BOOL
    proc   | HTTP
    form   | HTTP
BOOL

In array context only!

Each defined handler in array is executed until the value "0" (false) or Apache2::Const::OK returns

HTTP

In array context only!

Each defined handler in array is executed until an HTTP status value greater than or equal to 300 (REDIRECTIONS AND ERRORS) is returned

DUAL

Compilable with the pair of conditions BOOL and HTTP types

The "MVC SKEL Transaction" behavior scheme:

                                  +-------+
    04/26/13                      | Start |
                                  +-------+
                                      |
                                ++---------++
                                || caccess ||
                                ++---------++
                                     |
                               status is true?
                                     /\
                      _____yes______/  \____no__
                     |              \  /        |
               status < 300?         \/         |
                     /\                    ++-------++
            ___yes__/  \____no___          || cdeny ||
           |        \  /         |         ++-------++
      event ~ go?    \/          |______________|
           /\                             |
     _no__/  \__yes__                     |
    |     \  /       |                    |
    |      \/   ++--------++              |
    |           || ccheck ||              |
    |           ++--------++              |
    |                |                    |
    |          status is true?            |
    |                /\                   |
    |         __no__/  \___yes_           |
    |        |      \  /       |          |
    |        |       \/   ++-------++     |
    |        |            || mproc ||     |
    |        |            ++-------++     |
    |________|_________________|          |
                               |          |
                         status < 300?    |
                               /\         |
                       __yes__/  \____no__|
                      |       \  /        |
                 ++-------++   \/         |
                 || vform ||              |
                 ++-------++              |
                      |                   |
                      |___________________|
                                     |
                                 +--------+
                                 | Finish |
                                 +--------+

EXAMPLES

See eg on CPAN web-sites, e.g, https://metacpan.org/release/MPMinus Or content of a directory in distrib-tarball file

APACHE CONSTANTS

List of constants specific to Apache features see also http://perl.apache.org/docs/2.0/api/Apache2/Const.html

COMMON CONSTANTS

    -2  Apache2::Const::DONE
    -1  Apache2::Const::DECLINED
    0   Apache2::Const::OK
    302 Apache2::Const::REDIRECT
    401 Apache2::Const::AUTH_REQUIRED
    403 Apache2::Const::FORBIDDEN
    404 Apache2::Const::NOT_FOUND
    500 Apache2::Const::SERVER_ERROR

HTTP 1.1 STATUS CODES ORDERED BY NAMES

    202 Apache2::Const::HTTP_ACCEPTED
    502 Apache2::Const::HTTP_BAD_GATEWAY
    400 Apache2::Const::HTTP_BAD_REQUEST
    409 Apache2::Const::HTTP_CONFLICT
    100 Apache2::Const::HTTP_CONTINUE
    201 Apache2::Const::HTTP_CREATED
    417 Apache2::Const::HTTP_EXPECTATION_FAILED
        Apache2::Const::HTTP_FAILED_DEPENDENCY
    403 Apache2::Const::HTTP_FORBIDDEN
    504 Apache2::Const::HTTP_GATEWAY_TIME_OUT
    410 Apache2::Const::HTTP_GONE
        Apache2::Const::HTTP_INSUFFICIENT_STORAGE
    500 Apache2::Const::HTTP_INTERNAL_SERVER_ERROR
    411 Apache2::Const::HTTP_LENGTH_REQUIRED
        Apache2::Const::HTTP_LOCKED
    405 Apache2::Const::HTTP_METHOD_NOT_ALLOWED
    301 Apache2::Const::HTTP_MOVED_PERMANENTLY
    302 Apache2::Const::HTTP_MOVED_TEMPORARILY
    300 Apache2::Const::HTTP_MULTIPLE_CHOICES
        Apache2::Const::HTTP_MULTI_STATUS
    203 Apache2::Const::HTTP_NON_AUTHORITATIVE
    406 Apache2::Const::HTTP_NOT_ACCEPTABLE
        Apache2::Const::HTTP_NOT_EXTENDED
    404 Apache2::Const::HTTP_NOT_FOUND
    501 Apache2::Const::HTTP_NOT_IMPLEMENTED
    304 Apache2::Const::HTTP_NOT_MODIFIED
    204 Apache2::Const::HTTP_NO_CONTENT
    200 Apache2::Const::HTTP_OK
    206 Apache2::Const::HTTP_PARTIAL_CONTENT
    402 Apache2::Const::HTTP_PAYMENT_REQUIRED
    412 Apache2::Const::HTTP_PRECONDITION_FAILED
        Apache2::Const::HTTP_PROCESSING
    407 Apache2::Const::HTTP_PROXY_AUTHENTICATION_REQUIRED
    416 Apache2::Const::HTTP_RANGE_NOT_SATISFIABLE
    413 Apache2::Const::HTTP_REQUEST_ENTITY_TOO_LARGE
    408 Apache2::Const::HTTP_REQUEST_TIME_OUT
    414 Apache2::Const::HTTP_REQUEST_URI_TOO_LARGE
    205 Apache2::Const::HTTP_RESET_CONTENT
    303 Apache2::Const::HTTP_SEE_OTHER
    503 Apache2::Const::HTTP_SERVICE_UNAVAILABLE
    101 Apache2::Const::HTTP_SWITCHING_PROTOCOLS
    307 Apache2::Const::HTTP_TEMPORARY_REDIRECT
    401 Apache2::Const::HTTP_UNAUTHORIZED
        Apache2::Const::HTTP_UNPROCESSABLE_ENTITY
    415 Apache2::Const::HTTP_UNSUPPORTED_MEDIA_TYPE
        Apache2::Const::HTTP_UPGRADE_REQUIRED
    305 Apache2::Const::HTTP_USE_PROXY
        Apache2::Const::HTTP_VARIANT_ALSO_VARIES

HTTP 1.1 STATUS CODES

Informational 1xx:
    100 HTTP_CONTINUE                        Continue
    101 HTTP_SWITCHING_PROTOCOLS             Switching Protocols
Successful 2xx:
    200 HTTP_OK                              OK
    201 HTTP_CREATED                         Created
    202 HTTP_ACCEPTED                        Accepted
    203 HTTP_NON_AUTHORITATIVE               Non-Authoritative Information
    204 HTTP_NO_CONTENT                      No Content
    205 HTTP_RESET_CONTENT                   Reset Content
    206 HTTP_PARTIAL_CONTENT                 Partial Content
Redirection 3xx:
    300 HTTP_MULTIPLE_CHOICES                Multiple Choices
    301 HTTP_MOVED_PERMANENTLY               Moved Permanently
    302 HTTP_MOVED_TEMPORARILY               Found
    303 HTTP_SEE_OTHER                       See Other
    304 HTTP_NOT_MODIFIED                    Not Modified
    305 HTTP_USE_PROXY                       Use Proxy
    306                                      (Unused)
    307 HTTP_TEMPORARY_REDIRECT              Temporary Redirect
Client Error 4xx:
    400 HTTP_BAD_REQUEST                     Bad Request
    401 HTTP_UNAUTHORIZED                    Unauthorized
    402 HTTP_PAYMENT_REQUIRED                Payment Required
    403 HTTP_FORBIDDEN                       Forbidden
    404 HTTP_NOT_FOUND                       Not Found
    405 HTTP_METHOD_NOT_ALLOWED              Method Not Allowed
    406 HTTP_NOT_ACCEPTABLE                  Not Acceptable
    407 HTTP_PROXY_AUTHENTICATION_REQUIRED   Proxy Authentication Required
    408 HTTP_REQUEST_TIMEOUT                 Request Timeout
    409 HTTP_CONFLICT                        Conflict
    410 HTTP_GONE                            Gone
    411 HTTP_LENGTH REQUIRED                 Length Required
    412 HTTP_PRECONDITION_FAILED             Precondition Failed
    413 HTTP_REQUEST_ENTITY_TOO_LARGE        Request Entity Too Large
    414 HTTP_REQUEST_URI_TOO_LARGE           Request-URI Too Long
    415 HTTP_UNSUPPORTED_MEDIA_TYPE          Unsupported Media Type
    416 HTTP_RANGE_NOT_SATISFIABLE           Requested Range Not Satisfiable
    417 HTTP_EXPECTATION_FAILED              Expectation Failed
Server Error 5xx:
    500 HTTP_INTERNAL_SERVER_ERROR           Internal Server Error
    501 HTTP_NOT IMPLEMENTED                 Not Implemented
    502 HTTP_BAD_GATEWAY                     Bad Gateway
    503 HTTP_SERVICE_UNAVAILABLE             Service Unavailable
    504 HTTP_GATEWAY_TIME_OUT                Gateway Timeout
    505 HTTP_VERSION_NOT_SUPPORTED           HTTP Version Not Supported

THANKS

Thanks to Dmitry Klimov for technical translating http://fla-master.com.

AUTHOR

Serż Minus (Sergey Lepenkov) http://www.serzik.com <abalama@cpan.org>

COPYRIGHT

Copyright (C) 1998-2019 D&D Corporation. All Rights Reserved

LICENSE

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

See LICENSE file and https://dev.perl.org/licenses/