From c97631728ce7d6d3f4692a56c3cda7476b42a968 Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 20 Nov 2007 14:28:05 +0000 Subject: Imported from /home/lorry/working-area/delta_perl-xml-parser/XML-Parser-2.36.tar.gz. --- Parser/LWPExternEnt.pl | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Parser/LWPExternEnt.pl (limited to 'Parser/LWPExternEnt.pl') diff --git a/Parser/LWPExternEnt.pl b/Parser/LWPExternEnt.pl new file mode 100644 index 0000000..d0c940b --- /dev/null +++ b/Parser/LWPExternEnt.pl @@ -0,0 +1,71 @@ +# LWPExternEnt.pl +# +# Copyright (c) 2000 Clark Cooper +# All rights reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package XML::Parser; + +use URI; +use URI::file; +use LWP; + +## +## Note that this external entity handler reads the entire entity into +## memory, so it will choke on huge ones. It would be really nice if +## LWP::UserAgent optionally returned us an IO::Handle. +## + +sub lwp_ext_ent_handler { + my ($xp, $base, $sys) = @_; # We don't use public id + + my $uri; + + if (defined $base) { + # Base may have been set by parsefile, which is agnostic about + # whether its a file or URI. + my $base_uri = new URI($base); + unless (defined $base_uri->scheme) { + $base_uri = URI->new_abs($base_uri, URI::file->cwd); + } + + $uri = URI->new_abs($sys, $base_uri); + } + else { + $uri = new URI($sys); + unless (defined $uri->scheme) { + $uri = URI->new_abs($uri, URI::file->cwd); + } + } + + my $ua = $xp->{_lwpagent}; + unless (defined $ua) { + $ua = $xp->{_lwpagent} = new LWP::UserAgent(); + $ua->env_proxy(); + } + + my $req = new HTTP::Request('GET', $uri); + + my $res = $ua->request($req); + if ($res->is_error) { + $xp->{ErrorMessage} .= "\n" . $res->status_line . " $uri"; + return undef; + } + + $xp->{_BaseStack} ||= []; + push(@{$xp->{_BaseStack}}, $base); + + $xp->base($uri); + + return $res->content; +} # End lwp_ext_ent_handler + +sub lwp_ext_ent_cleanup { + my ($xp) = @_; + + $xp->base(pop(@{$xp->{_BaseStack}})); +} # End lwp_ext_ent_cleanup + +1; -- cgit v1.2.1