App-EvalServerAdvanced-Protocol
view release on metacpan or search on metacpan
lib/App/EvalServerAdvanced/Protocol.pm view on Meta::CPAN
}
fun encode_message($type, $obj) {
handle_encoding($type, $obj);
my $message = App::EvalServerAdvanced::Protocol::Packet->encode({$type => $obj});
# 8 byte header, 0x0000_0001 0x1234_5678
# first 4 bytes are the protocol version, last 4 are length of the message in octets
my $header = pack "NN", $protocol_version, length($message);
return ($header . $message);
};
fun decode_message($buffer) {
return (0, undef, undef) if length $buffer < 8; # can't have a message without a header
my $header = substr($buffer, 0, 8); # grab the header
my ($reserved, $length) = unpack("NN", $header);
die "Undecodable header" if ($reserved != $protocol_version);
# Packet isn't ready yet
return (0, undef, $buffer) if (length($buffer) - 8 < $length);
my $message_bytes = substr($buffer, 8, $length);
substr($buffer, 0, $length+8, "");
my $message = App::EvalServerAdvanced::Protocol::Packet->decode($message_bytes);
my ($k) = keys %$message;
die "Undecodable message" unless ($k);
my $real_message = $message->$k;
return (1, $real_message, $buffer);
};
package
App::EvalServerAdvanced::Protocol::EvalResponse;
use Encode qw//;
method get_contents() {
if ($self->encoding && $self->encoding ne "raw") {
return Encode::decode($self->encoding, $self->contents);
}
return $self->contents;
}
package
App::EvalServerAdvanced::Protocol::Eval::File;
use Encode qw//;
method get_contents() {
if ($self->encoding && $self->encoding ne "raw") {
return Encode::decode($self->encoding, $self->contents);
}
return $self->contents;
}
# given($type) {
# when("Eval") {
# # I can't decide if I should decode these or not. Keeping them as raw bytes seems safer
# # for my $file ($obj->files->@*) {
# # my $f_encoding = $file->encoding;
# # if ($f_encoding ne "raw" && $f_encoding ne "") {
# # $file->contents(decode($f_encoding, $file->contents));
# # }
# # }
# }
1;
( run in 1.596 second using v1.01-cache-2.11-cpan-13bb782fe5a )