/usr/share/texlive/tlpkg/TeXLive/TLDownload.pm is in texlive-base 2013.20140215-1ubuntu0.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | # $Id: TLDownload.pm 32912 2014-02-07 23:49:53Z karl $
# TeXLive::TLDownload.pm - module for abstracting the download modes
# Copyright 2009-2014 Norbert Preining
# This file is licensed under the GNU General Public License version 2
# or any later version.
package TeXLive::TLDownload;
use TeXLive::TLUtils;
use TeXLive::TLConfig;
use File::Temp qw/tempfile/;
my $svnrev = '$Revision: 32912 $';
my $_modulerevision;
if ($svnrev =~ m/: ([0-9]+) /) {
$_modulerevision = $1;
} else {
$_modulerevision = "unknown";
}
sub module_revision {
return $_modulerevision;
}
my $MAX_ERRORCOUNT = 5;
# since Net::HTTP and Net::FTP are shipped by the same packages
# we only test for Net::HTTP, if that fails, let us know ;-)
our $net_lib_avail = 0;
eval { require LWP; };
if ($@) {
debug("LWP is not available, falling back to wget.\n");
$net_lib_avail = 0;
} else {
require LWP::UserAgent;
require HTTP::Status;
$net_lib_avail = 1;
ddebug("LWP available, doing persistent downloads.\n");
}
sub new
{
my $class = shift;
my $self = {};
my $ua = LWP::UserAgent->new(
agent => "texlive/lwp",
# use LWP::ConnCache, and keep 1 connection open
keep_alive => 1,
env_proxy => 1,
timeout => $TeXLive::TLConfig::NetworkTimeout,
);
$self->{'ua'} = $ua;
$self->{'enabled'} = 1;
$self->{'errorcount'} = 0;
bless $self, $class;
return $self;
}
sub enabled
{
my $self = shift;
return $self->{'enabled'};
}
sub disabled
{
my $self = shift;
return (!$self->{'enabled'});
}
sub enable
{
my $self = shift;
$self->{'enabled'} = 1;
# also reset the error conter
$self->reset_errorcount;
}
sub disable
{
my $self = shift;
$self->{'enabled'} = 0;
}
sub errorcount
{
my $self = shift;
if (@_) { $self->{'errorcount'} = shift }
return $self->{'errorcount'};
}
sub incr_errorcount
{
my $self = shift;
return(++$self->{'errorcount'});
}
sub decr_errorcount
{
my $self = shift;
if ($self->errorcount > 0) {
return(--$self->{'errorcount'});
} else {
return($self->errorcount(0));
}
}
sub reset_errorcount {
my $self = shift;
$self->{'errorcount'} = 0;
}
sub get_file {
my ($self,$url,$out,$size) = @_;
#
# automatically disable if error count is getting too big
if ($self->errorcount > $MAX_ERRORCOUNT) {
$self->disable;
}
# return if disabled
return if $self->disabled;
#
my $realout = $out;
my ($outfh, $outfn);
if ($out eq "|") {
($outfh, $outfn) = tempfile();
$realout = $outfn;
}
my $response = $self->{'ua'}->get($url, ':content_file' => $realout);
if ($response->is_success) {
$self->decr_errorcount;
if ($out ne "|") {
return 1;
} else {
# seek to beginning of file
seek $outfh, 0, 0;
return $outfh;
}
} else {
tlwarn("TLDownload::get_file: response error: "
. $response->status_line . " (for $url)\n");
$self->incr_errorcount;
return;
}
}
1;
__END__
=head1 NAME
C<TeXLive::TLDownload> -- TeX Live Download abstraction module
=head1 SYNOPSIS
use TeXLive::TLDownload;
$TeXLive::TLDownload::net_lib_avail
my $dl = TeXLive::TLDownload->new();
$dl->get_file($relpath, $output [, $expected_size ]);
if ($dl->enabled) ...
if ($dl->disabled) ...
$dl->enable;
$dl->disable;
$dl->errorcount([n]);
$dl->incr_errorcount;
$dl->decr_errorcount;
$dl->reset_errorcount;
=head1 DESCRIPTION
The C<TeXLive::TLDownload> is a wrapper around the LWP modules that
allows for persistent connections and different protocols. At load
time it checks for the existence of the LWP module(s), and sets
C<$TeXLive::TLDownload::net_lib_avail> accordingly.
=head2 Using proxies
Please see C<LWP::UserAgent> for details, in a nut shell one can
specify proxies by setting C<I<protocol>_proxy> variables.
=head2 Automatic disabling
The TLDownload module implements some automatic disabling feature.
Every time a download did not succeed an internal counter (errorcount)
is increased, everytime it did succeed it is decreased (to a minimum of 0).
If the number of error goes above the maximal error count, the download
object will be disabled and get_file always returns undef.
In this cases the download can be reset with the reset_errorcount and
enable function.
=head1 SEE ALSO
LWP
=head1 AUTHORS AND COPYRIGHT
This script and its documentation were written for the TeX Live
distribution (L<http://tug.org/texlive>) and both are licensed under the
GNU General Public License Version 2 or later.
=cut
### Local Variables:
### perl-indent-level: 2
### tab-width: 2
### indent-tabs-mode: nil
### End:
# vim:set tabstop=2 expandtab: #
|