1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
###############################################################################
# Purpose : Pick the most appropriate resolver
# Author : John Alden
# Created : Aug 2006
###############################################################################
package Email::MIME::CreateHTML::Resolver;
use strict;
use Carp;
use Scalar::Util ();
our $VERSION = '1.042';
use vars qw($HaveCache $HaveLWP $HaveFilesystem);
$HaveCache = 0;
eval {
require Email::MIME::CreateHTML::Resolver::Cached;
$HaveCache = 1;
};
$HaveLWP = 0;
eval {
require Email::MIME::CreateHTML::Resolver::LWP;
$HaveLWP = 1;
};
$HaveFilesystem = 0;
eval {
require Email::MIME::CreateHTML::Resolver::Filesystem;
$HaveFilesystem = 1;
};
#
# API
#
sub new {
my ($class, $args) = @_;
$args ||= {};
#Do some sanity checking of inputs
my $resolver = $args->{resolver};
if(defined $resolver) {
confess "resolver must be an object" unless Scalar::Util::blessed($resolver);
confess "resolver does not seem to use the expected interface (get_resource)" unless ($resolver->can('get_resource'));
}
my $object_cache = $args->{'object_cache'};
if(defined $object_cache ) {
confess "object_cache must be an object" unless Scalar::Util::blessed($object_cache);
confess "object_cache does not seem to use the expected cache interface (get and set methods)"
unless ($object_cache->can('get') && $object_cache->can('set'));
warn("Caching support is not available - object_cache will not be used") unless($HaveCache);
}
#Construct object
my $self = bless ({
%$args
}, $class);
return $self;
}
sub get_resource {
my ($self, $uri) = @_;
croak("get_resource without a URI") unless(defined $uri && length($uri));
my $resolver = $self->_select_resolver($uri);
return $resolver->get_resource($uri);
}
#
# Private methods
#
sub _select_resolver {
my ($self, $uri) = @_;
#Look at the start of the URI
my $start = (defined $self->{base} && length($self->{base}))? $self->{base} : $uri;
#Pick an appropriate resolver...
my $resolver;
if($self->{resolver}) {
#If we've been told to use a specific resolver we'll respect that
$resolver = $self->{resolver};
} else {
#Decide on the best resolver to use - does URL start with protocol://
TRACE("Start is $start");
if($HaveFilesystem && $start =~ /^file:\/\//){
#Push file URLs through filesystem resolver if available (so File::Policy gets applied)
$resolver = new Email::MIME::CreateHTML::Resolver::Filesystem($self);
} elsif($start =~ /^\w+:\/\//) {
die("External URLs in emails cannot be resolved without the LWP resolver (which is currently not installed)\n") unless($HaveLWP);
$resolver = new Email::MIME::CreateHTML::Resolver::LWP($self);
} else {
die("Local URLs in emails cannot be resolved without the Filesystem resolver (which is currently not installed)\n") unless($HaveFilesystem);
$resolver = new Email::MIME::CreateHTML::Resolver::Filesystem($self);
}
}
#Optionally wrap it with caching
if($HaveCache && defined $self->{'object_cache'} ) {
$resolver = new Email::MIME::CreateHTML::Resolver::Cached({resolver => $resolver, object_cache => $self->{'object_cache'}});
}
return $resolver;
}
sub TRACE {}
sub DUMP {}
1;
=head1 NAME
Email::MIME::CreateHTML::Resolver - provides the appropriate resource resolver
=head1 SYNOPSIS
my $o = new Email::MIME::CreateHTML::Resolver(\%args)
my ($content,$filename,$mimetype,$xfer_encoding) = $o->get_resource($uri)
=head1 DESCRIPTION
This is used by Email::MIME::CreateHTML to load resources.
=head1 METHODS
=over 4
=item $o = new Email::MIME::CreateHTML::Resolver(\%args)
=item ($content,$filename,$mimetype,$xfer_encoding) = $o->get_resource($uri)
=back
=head1 AUTHOR
Tony Hennessy, Simon Flack and John Alden with additional contributions by
Ricardo Signes <rjbs@cpan.org> and Henry Van Styn <vanstyn@cpan.org>
=head1 COPYRIGHT
(c) BBC 2005,2006. This program is free software; you can redistribute it and/or modify it under the GNU GPL.
See the file COPYING in this distribution, or http://www.gnu.org/licenses/gpl.txt
=cut
|