root/trunk/lib/Perlbal/Plugin/AtomStream.pm @ 407

Revision 407, 1.8 kB (checked in by bradfitz, 4 years ago)

add the Atom stream/inject plugins

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1###########################################################################
2# basic Perlbal statistics gatherer
3###########################################################################
4
5package Perlbal::Plugin::AtomStream;
6
7use Perlbal;
8use strict;
9use warnings;
10
11our @subs;  # subscribers
12
13sub InjectFeed {
14    my $class = shift;
15    my $atomref = shift;
16
17    my $need_clean = 0;
18    foreach my $s (@subs) {
19        if ($s->{closed}) {
20            $need_clean = 1;
21            next;
22        }
23        $s->write($atomref);
24    }
25
26    if ($need_clean) {
27        @subs = grep { ! $_->{closed} } @subs;
28    }
29}
30
31# called when we're being added to a service
32sub register {
33    my ($class, $svc) = @_;
34
35    Perlbal::Socket::register_callback(1, sub {
36        my $now = time();
37        foreach my $s (@subs) {
38            next if $s->{closed};
39            $s->{alive_time} = $now;
40            $s->write(\ "<time>$now</time>\n");
41        }
42        return 1;
43    });
44
45    $svc->register_hook('AtomStream', 'start_http_request', sub {
46        my Perlbal::ClientProxy $self = shift;
47        my Perlbal::HTTPHeaders $hds = $self->{req_headers};
48        return 0 unless $hds;
49        my $uri = $hds->request_uri;
50        return 0 unless $uri =~ m!^/atom-stream\.xml$!;
51
52        my $res = $self->{res_headers} = Perlbal::HTTPHeaders->new_response(200);
53        $res->header("Content-Type", "text/xml");
54        $res->header('Connection', 'close');
55
56        push @subs, $self;
57
58        $self->write($res->to_string_ref);
59        $self->write(\ "<?xml version='1.0' encoding='utf-8' ?>\n<atomStream>\n");
60        return 1;
61    });
62
63    return 1;
64}
65
66# called when we're no longer active on a service
67sub unregister {
68    my ($class, $svc) = @_;
69
70    return 1;
71}
72
73# called when we are loaded
74sub load {
75    return 1;
76}
77
78# called for a global unload
79sub unload {
80    return 1;
81}
82
831;
Note: See TracBrowser for help on using the browser.