POE-Component-Server-Postfix
view release on metacpan or search on metacpan
lib/POE/Component/Server/Postfix.pm view on Meta::CPAN
use strict;
use warnings;
package POE::Component::Server::Postfix;
our $VERSION = '0.001';
# ABSTRACT: Postfix (MTA) server toolkit
use MooseX::POE;
use POE qw(
Filter::Postfix::Base64
Filter::Postfix::Null
Filter::Postfix::Plain
Wheel::SocketFactory
Wheel::ReadWrite
);
use Socket ();
has server => (is => 'ro', lazy_build => 1);
has clients => (is => 'ro', isa => 'HashRef', default => sub { {} });
has handler => (is => 'ro', isa => 'CodeRef', required => 1);
has filter => (is => 'ro', isa => 'Str', required => 1);
sub _build_server {
my ($self) = @_;
return POE::Wheel::SocketFactory->new(
Reuse => 1,
SuccessEvent => 'accept',
FailureEvent => 'server_error',
$self->socketfactory_args,
);
}
sub new {
my $class = shift;
return $class->SUPER::new(@_) unless $class eq __PACKAGE__;
my $arg = $class->BUILDARGS(@_);
unless ($arg->{port} xor $arg->{path}) {
Carp::croak "use exactly one of 'port' (TCP) or 'path' (UNIX) arguments";
}
if ($arg->{port}) {
eval "require $class\::TCP; 1" or die $@;
return "$class\::TCP"->new($arg);
} else {
eval "require $class\::UNIX; 1" or die $@;
return "$class\::UNIX"->new($arg);
}
}
sub START {
my ($self) = @_;
$self->server;
}
sub _filter {
my ($self) = @_;
my $class = my $filter = $self->filter;
$class = "POE::Filter::Postfix::$class"
unless $class =~ s/^=//;
eval "require $class; 1" or die "Invalid filter '$filter': $@";
return $class->new;
}
event accept => sub {
my ($self, $sock) = @_[OBJECT, ARG0];
my $wheel = POE::Wheel::ReadWrite->new(
Handle => $sock,
Filter => $self->_filter,
InputEvent => 'handle_request',
ErrorEvent => 'client_error',
);
$self->clients->{$wheel->ID} = $wheel;
};
event server_error => sub {
die "server error: @_";
};
event handle_request => sub {
my ($self, $attr, $id) = @_[OBJECT, ARG0..ARG1];
( run in 1.941 second using v1.01-cache-2.11-cpan-39bf76dae61 )