Net-EPP-Server
view release on metacpan or search on metacpan
lib/Net/EPP/Server.pm view on Meta::CPAN
sub generate_response {
my $self = shift;
my %args = @_;
my $clTRID = $args{'clTRID'};
my $svTRID = $args{'svTRID'};
my $code = $args{'code'} || OK;
my $msg = $args{'msg'} || $MESSAGES{$code} || ($code < UNKNOWN_COMMAND ? $MESSAGES{OK} : $MESSAGES{COMMAND_FAILED});
my $frame = XML::LibXML::Document->new;
$frame->setDocumentElement($frame->createElementNS($Net::EPP::Frame::EPP_URN, 'epp'));
my $response = $frame->documentElement->appendChild($frame->createElement('response'));
my $result = $response->appendChild($frame->createElement('result'));
$result->setAttribute('code', $code);
$result->appendChild($frame->createElement('msg'))->appendText($msg);
if ($args{'resData'}) {
$response->appendChild($frame->createElement('resData'));
}
if ($clTRID || $svTRID) {
my $trID = $response->appendChild($frame->createElement('trID'));
$trID->appendChild($frame->createElement('clTRID'))->appendText($clTRID) if ($clTRID);
$trID->appendChild($frame->createElement('svTRID'))->appendText($svTRID) if ($svTRID);
}
return $frame;
}
sub generate_error {
my ($self, %args) = @_;
$args{'code'} ||= COMMAND_FAILED;
$args{'msg'} = $args{'msg'} || $MESSAGES{$args{'code'}} || 'An internal error occurred. Please try again later.';
return $self->generate_response(%args);
}
sub generate_svTRID {
state $counter = time();
return substr(sha512_hex(
pack('Q', ++$counter)
.chr(0)
.Crypt::OpenSSL::Random::random_pseudo_bytes(32)
), 0, 64);
}
sub parse_frame {
my ($self, $xml) = @_;
return XML::LibXML->load_xml(
string => $xml,
no_blanks => 1,
no_cdata => 1,
);
}
sub validate_frame {
my ($self, $frame) = @_;
if ($self->{'epp'}->{'xsd_file'}) {
state $xsd = XML::LibXML::Schema->new(location => $self->{'epp'}->{'xsd_file'});
eval { $xsd->validate($frame) };
return (SYNTAX_ERROR, $@) if ($@);
}
return OK;
}
#
# This method finds the callback for the given event, and if found, runs it and
# passes back its return value(s).
#
sub run_callback {
my $self = shift;
my %args = @_;
$args{'server'} ||= $self;
my $ref = $self->{'epp'}->{'handlers'}->{$args{'event'}};
return &{$ref}(%args) if ($ref);
}
sub is_result_code {
my $value = shift;
return (int($value) >= OK && int($value) <= 2502);
}
#
# This method is a wrapper around Net::EPP::Protocol->send_frame() which
# validates the response and reports any errors
#
sub send_frame {
my ($self, $socket, $frame) = @_;
#
# note: we need to do a round-trip here otherwise we get namespace issues
#
$frame = XML::LibXML->load_xml(string => $frame->toString);
my ($code, $msg) = $self->validate_frame($frame);
if (OK != $code) {
carp($msg);
}
Net::EPP::Protocol->send_frame($socket, $frame->toString);
}
1;
( run in 1.062 second using v1.01-cache-2.11-cpan-d7f47b0818f )