Changeset 580 for trunk/lib/Perlbal/Plugin/AtomStream.pm
- Timestamp:
- 09/29/06 09:29:04 (3 years ago)
- Files:
-
- 1 modified
-
trunk/lib/Perlbal/Plugin/AtomStream.pm (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/Perlbal/Plugin/AtomStream.pm
r431 r580 1 1 package Perlbal::Plugin::AtomStream; 2 3 use URI; 2 4 3 5 use Perlbal; … … 6 8 7 9 our @subs; # subscribers 8 our @recent; # recent items in format [$epoch, $atom_ref ]10 our @recent; # recent items in format [$epoch, $atom_ref, $path_segments_arrayref] 9 11 10 12 our $last_timestamp = 0; … … 14 16 sub InjectFeed { 15 17 my $class = shift; 16 my $atomref = shift;18 my ($atomref, $path) = @_; 17 19 18 20 # maintain queue of last 60 seconds worth of posts 19 21 my $now = time(); 20 push @recent, [ $now, $atomref ]; 22 my @put_segments = URI->new($path)->path_segments; 23 push @recent, [ $now, $atomref, \@put_segments ]; 21 24 shift @recent while @recent && $recent[0][0] <= $now - 60; 22 25 … … 30 33 } 31 34 35 next unless filter(\@put_segments, $s->{scratch}{get_segments}); 36 32 37 my $lag = $s->{write_buf_size}; 33 38 … … 58 63 } 59 64 65 sub filter { 66 my ($put, $get) = @_; 67 return 0 if scalar @$put < scalar @$get; 68 for( my $i = 0 ; $i < scalar @$get ; $i++) { 69 return 0 if $put->[$i] ne $get->[$i]; 70 } 71 return 1; 72 } 73 60 74 # called when we're being added to a service 61 75 sub register { … … 72 86 my Perlbal::HTTPHeaders $hds = $self->{req_headers}; 73 87 return 0 unless $hds; 74 my $uri = $hds->request_uri; 75 return 0 unless $uri =~ m!^/atom-stream\.xml(?:\?since=(\d+))?$!; 76 my $since = $1 || 0; 88 my $uri = URI->new($hds->request_uri); 89 my @get_segments = $uri->path_segments; 90 $self->{scratch}{get_segments} = \@get_segments; 91 return 0 unless pop @get_segments eq 'atom-stream.xml'; 92 my %params = $uri->query_form; 93 my $since = $params{since} =~ /\d+/ ? $params{since} : 0; 77 94 78 95 my $res = $self->{res_headers} = Perlbal::HTTPHeaders->new_response(200); … … 90 107 foreach my $item (@recent) { 91 108 next if $item->[0] < $since; 109 next unless filter($item->[2], \@get_segments); 92 110 $last_rv = $self->write($item->[1]); 93 111 }
