rendered paste body#!/usr/bin/perl
use strict;
use warnings;
use Tatsumaki::Error;
use Tatsumaki::Application;
use Tatsumaki::HTTPClient;
use JSON;
package CamHandler;
use base qw(Tatsumaki::Handler);
use AnyEvent;
use AnyEvent::HTTP;
__PACKAGE__->asynchronous(1);
our $receiver = AnyEvent->condvar;
sub prepare {
my ($self) = @_;
my $url = "http://127.0.0.1:8888/mjpg/video.mjpg";
my %opts = (
on_header => sub { $self->got_headers(@_); 1 },
on_body => sub { $self->got_body(@_); 1 },
);
http_get $url, %opts, $self->async_cb(sub { $self->body_finished(@_) });
}
sub get {
my($self, $query) = @_;
$self->response->content_type('multipart/x-mixed-replace; boundary=--myboundary');
$receiver->cb(sub {
my ($cv) = @_;
my $partial_body = $cv->recv;
warn "got chunk";
$self->stream_write($partial_body);
return 1;
});
}
sub body_finished {
my ($self, $res, $hdr) = @_;
use Data::Dumper;
warn "finished, hdr: " . Dumper($hdr);
if ($hdr->{Status} !~ /^2/) {
Tatsumaki::Error::HTTP->throw($hdr->{Status}, $hdr->{Reason});
}
$self->finish;
}
# h = hashref of headers
sub got_headers {
my ($self, $h) = @_;
use Data::Dumper;
warn Dumper($h);
return 1;
}
sub got_body {
my ($self, $partial_body, $headers) = @_;
warn "got_body";
$receiver->send($partial_body);
return 1;
}
package main;
use File::Basename;
my $app = Tatsumaki::Application->new([
'/' => 'CamHandler',
]);
if (__FILE__ eq $0) {
require Tatsumaki::Server;
Tatsumaki::Server->new(port => 3003)->run($app);
} else {
return $app;
}