oracular (3) Plack::Util.3pm.gz

Provided by: libplack-perl_1.0051-1_all bug

NAME

       Plack::Util - Utility subroutines for Plack server and framework developers

FUNCTIONS

       TRUE, FALSE
             my $true  = Plack::Util::TRUE;
             my $false = Plack::Util::FALSE;

           Utility constants to include when you specify boolean variables in $env hash (e.g.
           "psgi.multithread").

       load_class
             my $class = Plack::Util::load_class($class [, $prefix ]);

           Constructs a class name and "require" the class. Throws an exception if the .pm file for the class is
           not found, just with the built-in "require".

           If $prefix is set, the class name is prepended to the $class unless $class begins with "+" sign,
           which means the class name is already fully qualified.

             my $class = Plack::Util::load_class("Foo");                   # Foo
             my $class = Plack::Util::load_class("Baz", "Foo::Bar");       # Foo::Bar::Baz
             my $class = Plack::Util::load_class("+XYZ::ZZZ", "Foo::Bar"); # XYZ::ZZZ

           Note that this function doesn't validate (or "sanitize") the passed string, hence if you pass a user
           input to this function (which is an insecure thing to do in the first place) it might lead to
           unexpected behavior of loading files outside your @INC path. If you want a generic module loading
           function, you should check out CPAN modules such as Module::Runtime.

       is_real_fh
             if ( Plack::Util::is_real_fh($fh) ) { }

           returns true if a given $fh is a real file handle that has a file descriptor. It returns false if $fh
           is PerlIO handle that is not really related to the underlying file etc.

       content_length
             my $cl = Plack::Util::content_length($body);

           Returns the length of content from body if it can be calculated. If $body is an array ref it's a sum
           of length of each chunk, if $body is a real filehandle it's a remaining size of the filehandle,
           otherwise returns undef.

       set_io_path
             Plack::Util::set_io_path($fh, "/path/to/foobar.txt");

           Sets the (absolute) file path to $fh filehandle object, so you can call "$fh->path" on it. As a side
           effect $fh is blessed to an internal package but it can still be treated as a normal file handle.

           This module doesn't normalize or absolutize the given path, and is intended to be used from Server or
           Middleware implementations. See also IO::File::WithPath.

       foreach
             Plack::Util::foreach($body, $cb);

           Iterate through $body which is an array reference or IO::Handle-like object and pass each line (which
           is NOT really guaranteed to be a line) to the callback function.

           It internally sets the buffer length $/ to 65536 in case it reads the binary file, unless otherwise
           set in the caller's code.

       load_psgi
             my $app = Plack::Util::load_psgi $psgi_file_or_class;

           Load "app.psgi" file or a class name (like "MyApp::PSGI") and require the file to get PSGI
           application handler. If the file can't be loaded (e.g. file doesn't exist or has a perl syntax
           error), it will throw an exception.

           Since version 1.0006, this function would not load PSGI files from include paths (@INC) unless it
           looks like a class name that only consists of "[A-Za-z0-9_:]". For example:

             Plack::Util::load_psgi("app.psgi");          # ./app.psgi
             Plack::Util::load_psgi("/path/to/app.psgi"); # /path/to/app.psgi
             Plack::Util::load_psgi("MyApp::PSGI");       # MyApp/PSGI.pm from @INC

           Security: If you give this function a class name or module name that is loadable from your system, it
           will load the module. This could lead to a security hole:

             my $psgi = ...; # user-input: consider "Moose"
             $app = Plack::Util::load_psgi($psgi); # this would lead to 'require "Moose.pm"'!

           Generally speaking, passing an external input to this function is considered very insecure. If you
           really want to do that, validate that a given file name contains dots (like "foo.psgi") and also turn
           it into a full path in your caller's code.

       run_app
             my $res = Plack::Util::run_app $app, $env;

           Runs the $app by wrapping errors with eval and if an error is found, logs it to
           "$env->{'psgi.errors'}" and returns the template 500 Error response.

       header_get, header_exists, header_set, header_push, header_remove
             my $hdrs = [ 'Content-Type' => 'text/plain' ];

             my $v = Plack::Util::header_get($hdrs, $key); # First found only
             my @v = Plack::Util::header_get($hdrs, $key);
             my $bool = Plack::Util::header_exists($hdrs, $key);
             Plack::Util::header_set($hdrs, $key, $val);   # overwrites existent header
             Plack::Util::header_push($hdrs, $key, $val);
             Plack::Util::header_remove($hdrs, $key);

           Utility functions to manipulate PSGI response headers array reference. The methods that read existent
           header value handles header name as case insensitive.

             my $hdrs = [ 'Content-Type' => 'text/plain' ];
             my $v = Plack::Util::header_get($hdrs, 'content-type'); # 'text/plain'

       headers
             my $headers = [ 'Content-Type' => 'text/plain' ];

             my $h = Plack::Util::headers($headers);
             $h->get($key);
             if ($h->exists($key)) { ... }
             $h->set($key => $val);
             $h->push($key => $val);
             $h->remove($key);
             $h->headers; # same reference as $headers

           Given a header array reference, returns a convenient object that has an instance methods to access
           "header_*" functions with an OO interface. The object holds a reference to the original given
           $headers argument and updates the reference accordingly when called write methods like "set", "push"
           or "remove". It also has "headers" method that would return the same reference.

       status_with_no_entity_body
             if (status_with_no_entity_body($res->[0])) { }

           Returns true if the given status code doesn't have any Entity body in HTTP response, i.e. it's 100,
           101, 204 or 304.

       inline_object
             my $o = Plack::Util::inline_object(
                 write => sub { $h->push_write(@_) },
                 close => sub { $h->push_shutdown },
             );
             $o->write(@stuff);
             $o->close;

           Creates an instant object that can react to methods passed in the constructor. Handy to create when
           you need to create an IO stream object for input or errors.

       encode_html
             my $encoded_string = Plack::Util::encode_html( $string );

           Entity encodes "<", ">", "&", """ and "'" in the input string and returns it.

       response_cb
           See "RESPONSE CALLBACK" in Plack::Middleware for details.