Acme-UPnP
view release on metacpan or search on metacpan
lib/Acme/UPnP.pm view on Meta::CPAN
method _emit ( $event, @args ) {
for my $cb ( $on{$event}->@* ) {
try { $cb->(@args) } catch ($e) {
carp 'Acme::UPnP callback error: ' . $e;
}
}
}
ADJUST {
$http = HTTP::Tiny->new( agent => 'Acme-UPnP/1.0', timeout => 3 );
$upnp_device = bless {}, 'Acme::UPnP::Device'; # Dummy
}
method discover_device () {
# SSDP Search
my $sock = IO::Socket::INET->new( Proto => 'udp', Broadcast => 1, LocalPort => 0, ) or
do { carp 'Failed to create UDP socket: ' . $!; return 0 };
my $msg = join "\r\n", 'M-SEARCH * HTTP/1.1', 'HOST: 239.255.255.250:1900', 'MAN: "ssdp:discover"', 'MX: 2',
'ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1', '';
$sock->send( $msg, 0, pack_sockaddr_in( 1900, inet_aton('239.255.255.250') ) );
# Mock Socket and HTTP::Tiny
my $socket_recv_data;
my $http_content;
BEGIN {
*CORE::GLOBAL::select = sub { return 1 }
}
no warnings qw[experimental::class redefine once];
#
*IO::Socket::INET::new = sub { return bless {}, 'MockSocket' };
package MockSocket {
sub send {1}
sub fileno {1}
sub sockdomain {2}
sub sockhost {'127.0.0.1'}
sub mcast_add {1}
sub recv {
return unless $main::socket_recv_data;
$_[1] = $main::socket_recv_data;
$main::socket_recv_data = undef;
return "fake_addr";
}
};
*HTTP::Tiny::new = sub { return bless {}, 'MockHTTP' };
package MockHTTP {
sub get {
my ( $self, $url ) = @_;
if ( $url eq 'http://192.168.1.1:5000/desc.xml' ) {
return { success => 1, content => $main::http_content };
}
return { success => 0 };
}
( run in 2.413 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )