package XML::Atom::Stream; use strict; our $VERSION = '0.11'; use Carp; use LWP::UserAgent; use HTTP::Request; use XML::SAX::ParserFactory; use XML::LibXML::SAX; sub new { my($class, %param) = @_; my $self = bless \%param, $class; $self->init(); $self; } sub init { my $self = shift; $self->{ua} ||= LWP::UserAgent->new( agent => "XML::Atom::Stream/$VERSION", timeout => $self->{timeout} || 15, ); $self->{callback} or Carp::croak("no callback specified."); } sub _setup_parser { my $self = shift; my $handler = XML::Atom::Stream::SAXHandler->new; $handler->{callback} = $self->{callback}; $handler->{debug} = $self->{debug}; local $XML::SAX::ParserPackage = "XML::LibXML::SAX::Better"; my $factory = XML::SAX::ParserFactory->new; my $parser = $factory->parser(Handler => $handler); return $parser; } sub connect { my($self, $url) = @_; $url or Carp::croak("URL needed for connect()"); $self->{parser} = $self->_setup_parser; $self->{ua}->get($url, ':content_cb' => sub { $self->on_content_cb(@_) }); if ($self->{debug}) { warn "Disconnected.", $@ ? " ($@)" : ""; } if ($self->{reconnect} && (!$self->{__exception} || $self->{__exception} =~ /xmlParse/)) { warn "Trying to reconnect" if $self->{debug}; delete $self->{__exception}; $self->connect($url); } } sub on_content_cb { my($self, $data, $res, $proto) = @_; warn ".\n" if $data =~ /