#!/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; }