—# ABSTRACT: Web interface to a Pinto repository
package
Pinto::Server;
use
Moose;
use
Carp;
use
Path::Class;
use
Class::Load;
use
Pinto::Repository;
#-------------------------------------------------------------------------------
our
$VERSION
=
'0.14'
;
# VERSION
#-------------------------------------------------------------------------------
has
root
=> (
is
=>
'ro'
,
isa
=> Dir,
required
=> 1,
coerce
=> 1,
);
has
auth
=> (
is
=>
'ro'
,
isa
=> HashRef,
traits
=> [
'Hash'
],
handles
=> {
auth_options
=>
'elements'
},
);
has
router
=> (
is
=>
'ro'
,
isa
=>
'Pinto::Server::Router'
,
default
=>
sub
{ Pinto::Server::Router->new },
lazy
=> 1,
);
class_has
default_port
=> (
is
=>
'ro'
,
isa
=> Int,
default
=>
$PINTO_SERVER_DEFAULT_PORT
,
);
#-------------------------------------------------------------------------------
sub
BUILD {
my
(
$self
) =
@_
;
my
$repo
= Pinto::Repository->new(
root
=>
$self
->root );
$repo
->assert_sanity_ok;
return
$self
;
}
#-------------------------------------------------------------------------------
sub
to_app {
my
(
$self
) =
@_
;
my
$app
=
sub
{
$self
->call(
@_
) };
if
(
my
%auth_options
=
$self
->auth_options ) {
my
$backend
=
delete
$auth_options
{backend}
or carp
'No auth backend provided!'
;
my
$class
=
'Authen::Simple::'
.
$backend
;
"Authenticating using $class\n"
if
is_interactive;
Class::Load::load_class(
$class
);
$app
= Plack::Middleware::Auth::Basic->wrap(
$app
,
authenticator
=>
$class
->new(
%auth_options
) );
}
return
$app
;
}
#-------------------------------------------------------------------------------
sub
call {
my
(
$self
,
$env
) =
@_
;
my
$response
=
$self
->router->route(
$env
,
$self
->root );
$response
=
$response
->finalize
if
blessed(
$response
) &&
$response
->can(
'finalize'
);
return
$response
;
}
#-------------------------------------------------------------------------------
1;
__END__
=pod
=encoding UTF-8
=for :stopwords Jeffrey Ryan Thalhammer
=head1 NAME
Pinto::Server - Web interface to a Pinto repository
=head1 VERSION
version 0.14
=head1 ATTRIBUTES
=head2 root
The path to the root directory of your Pinto repository. The
repository must already exist at this location. This attribute is
required.
=head2 auth
The hashref of authentication options, if authentication is to be used within
the server. One of the options must be 'backend', to specify which
Authen::Simple:: class to use; the other key/value pairs will be passed as-is
to the Authen::Simple class.
=head2 router
An object that does the L<Pinto::Server::Handler> role. This object
will do the work of processing the request and returning a response.
=head2 default_port
Returns the default port number that the server will listen on. This
is a class attribute.
=head1 METHODS
=head2 to_app()
Returns the application as a subroutine reference.
=head2 call( $env )
Invokes the application with the specified environment. Returns a
PSGI-compatible response.
There is nothing to see here.
Look at L<pintod> if you want to start the server.
=head1 AUTHOR
Jeffrey Ryan Thalhammer <jeff@stratopan.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Jeffrey Ryan Thalhammer.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut