File: Rtpengine.pm

package info (click to toggle)
rtpengine 13.5.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,692 kB
  • sloc: ansic: 86,814; perl: 59,954; python: 3,193; sh: 1,037; makefile: 687; asm: 211
file content (79 lines) | stat: -rw-r--r-- 1,490 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package NGCP::Rtpengine;

use strict;
use warnings;
use Socket;
use Socket6;
use IO::Socket;
use IO::Socket::IP;
use Bencode;
use Data::Dumper;
use JSON;
use LWP::UserAgent;


our $req_cb;


sub new {
	my ($class, $addr, $port) = @_;

	my $self = {};
	bless $self, $class;

	if (ref($addr)) {
		$self->{socket} = $addr;
	}
	elsif ($addr =~ /^http/) {
		$self->{uri} = $addr;
	}
	else {
		$self->{socket} = IO::Socket::IP->new(Type => &SOCK_DGRAM, Proto => 'udp',
				PeerHost => $addr, PeerPort => $port);
	}

	return $self;
}

sub req {
	my ($self, $packet) = @_;

	my $cookie = rand() . ' ';
	my $p = $cookie . ($self->{json} ? encode_json($packet) : Bencode::bencode($packet));
	my $ret;
	if ($self->{uri}) {
		my $ua = LWP::UserAgent->new();
		my $resp = $ua->post($self->{uri},
			'Content-type' => "application/x-rtpengine-ng",
			Content => $p);
		$ret = $resp->decoded_content;
	}
	else {
		$self->{socket}->send($p, 0) or die $!;
		if ($req_cb) {
			$req_cb->();
		}
		$self->{socket}->recv($ret, 65535) or die $!;
	}
	$ret =~ s/^\Q$cookie\E//s or die $ret;
	my $resp = $self->{json} ? decode_json($ret) : Bencode::bdecode($ret, 1);

	$resp->{result} or die Dumper $resp;

	if ($resp->{result} eq 'error') {
		die "Error reason: \"$resp->{'error-reason'}\"";
	}

	return $resp;
}

sub offer {
	my ($self, $packet) = @_;
	return $self->req( { command => 'offer', %$packet } );
}
sub answer {
	my ($self, $packet) = @_;
	return $self->req( { command => 'answer', %$packet } );
}

1;