All pastes #2046973 Raw Edit

Miscellany

public text v1 · immutable
#2046973 ·published 2011-04-15 21:45 UTC
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;
}