Change history for libwww-perl
+6.39 2019-05-06 14:18:39Z
+ - Document current best practices (GH#314) (Olaf Alders)
+ - Document order in which handlers fire (GH#315) (Olaf Alders)
+ - SKIP nntp test for now (GH#317) (Olaf Alders)
+
6.38 2019-03-25 18:58:58Z
- Update Net::HTTP dependency from 6.07 to 6.18 (GH#310) (Olaf Alders)
- Remove s.c.o. from SYNOPSIS (GH#308) (Olaf Alders)
If you have cpanm, you only need one line:
- % cpanm libwww::perl
+ % cpanm LWP
If it does not have permission to install modules to the current perl, cpanm
will automatically set up and install to a local::lib in your home directory.
Alternatively, if your CPAN shell is set up, you should just be able to do:
- % cpan libwww::perl
+ % cpan LWP
## Manual installation
libwww-perl documentation is available as POD.
You can run `perldoc` from a shell to read the documentation:
- % perldoc libwww::perl
+ % perldoc LWP
For more information on installing Perl modules via CPAN, please see:
https://www.cpan.org/modules/INSTALL.html
bin/lwp-request
cpanfile
dist.ini
+examples/handler-order.pl
lib/LWP.pm
lib/LWP/Authen/Basic.pm
lib/LWP/Authen/Digest.pm
"provides" : {
"LWP" : {
"file" : "lib/LWP.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Authen::Basic" : {
"file" : "lib/LWP/Authen/Basic.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Authen::Digest" : {
"file" : "lib/LWP/Authen/Digest.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Authen::Ntlm" : {
"file" : "lib/LWP/Authen/Ntlm.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::ConnCache" : {
"file" : "lib/LWP/ConnCache.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Debug" : {
"file" : "lib/LWP/Debug.pm",
- "version" : "6.38",
+ "version" : "6.39",
"x_deprecated" : 1
},
"LWP::Debug::TraceHTTP" : {
"file" : "lib/LWP/Debug/TraceHTTP.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::DebugFile" : {
"file" : "lib/LWP/DebugFile.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::MemberMixin" : {
"file" : "lib/LWP/MemberMixin.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol" : {
"file" : "lib/LWP/Protocol.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::cpan" : {
"file" : "lib/LWP/Protocol/cpan.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::data" : {
"file" : "lib/LWP/Protocol/data.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::file" : {
"file" : "lib/LWP/Protocol/file.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::ftp" : {
"file" : "lib/LWP/Protocol/ftp.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::gopher" : {
"file" : "lib/LWP/Protocol/gopher.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::http" : {
"file" : "lib/LWP/Protocol/http.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::loopback" : {
"file" : "lib/LWP/Protocol/loopback.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::mailto" : {
"file" : "lib/LWP/Protocol/mailto.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::nntp" : {
"file" : "lib/LWP/Protocol/nntp.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Protocol::nogo" : {
"file" : "lib/LWP/Protocol/nogo.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::RobotUA" : {
"file" : "lib/LWP/RobotUA.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::Simple" : {
"file" : "lib/LWP/Simple.pm",
- "version" : "6.38"
+ "version" : "6.39"
},
"LWP::UserAgent" : {
"file" : "lib/LWP/UserAgent.pm",
- "version" : "6.38"
+ "version" : "6.39"
}
},
"release_status" : "stable",
"x_IRC" : "irc://irc.perl.org/#lwp",
"x_MailingList" : "mailto:libwww@perl.org"
},
- "version" : "6.38",
+ "version" : "6.39",
"x_Dist_Zilla" : {
"perl" : {
"version" : "5.026001"
"class" : "Dist::Zilla::Plugin::Git::Contributors",
"config" : {
"Dist::Zilla::Plugin::Git::Contributors" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"include_authors" : 0,
"include_releaser" : 1,
"order_by" : "name",
},
{
"class" : "Dist::Zilla::Plugin::InstallGuide",
+ "config" : {
+ "Dist::Zilla::Role::ModuleMetadata" : {
+ "Module::Metadata" : "1.000033",
+ "version" : "0.004"
+ }
+ },
"name" : "InstallGuide",
- "version" : "1.200012"
+ "version" : "1.200013"
},
{
"class" : "Dist::Zilla::Plugin::ExecDir",
}
},
"name" : "MakeMaker::Awesome",
- "version" : "0.41"
+ "version" : "0.47"
},
{
"class" : "Dist::Zilla::Plugin::MojibakeTests",
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"repo_root" : "."
}
},
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
"branch" : null,
"changelog" : "Changes",
"signed" : 0,
- "tag" : "v6.38",
+ "tag" : "v6.39",
"tag_format" : "v%V",
"tag_message" : "v%V"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
"remotes_must_exist" : 1
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.20.1",
+ "git_version" : "2.21.0",
"repo_root" : "."
}
},
provides:
LWP:
file: lib/LWP.pm
- version: '6.38'
+ version: '6.39'
LWP::Authen::Basic:
file: lib/LWP/Authen/Basic.pm
- version: '6.38'
+ version: '6.39'
LWP::Authen::Digest:
file: lib/LWP/Authen/Digest.pm
- version: '6.38'
+ version: '6.39'
LWP::Authen::Ntlm:
file: lib/LWP/Authen/Ntlm.pm
- version: '6.38'
+ version: '6.39'
LWP::ConnCache:
file: lib/LWP/ConnCache.pm
- version: '6.38'
+ version: '6.39'
LWP::Debug:
file: lib/LWP/Debug.pm
- version: '6.38'
+ version: '6.39'
x_deprecated: 1
LWP::Debug::TraceHTTP:
file: lib/LWP/Debug/TraceHTTP.pm
- version: '6.38'
+ version: '6.39'
LWP::DebugFile:
file: lib/LWP/DebugFile.pm
- version: '6.38'
+ version: '6.39'
LWP::MemberMixin:
file: lib/LWP/MemberMixin.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol:
file: lib/LWP/Protocol.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::cpan:
file: lib/LWP/Protocol/cpan.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::data:
file: lib/LWP/Protocol/data.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::file:
file: lib/LWP/Protocol/file.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::ftp:
file: lib/LWP/Protocol/ftp.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::gopher:
file: lib/LWP/Protocol/gopher.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::http:
file: lib/LWP/Protocol/http.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::loopback:
file: lib/LWP/Protocol/loopback.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::mailto:
file: lib/LWP/Protocol/mailto.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::nntp:
file: lib/LWP/Protocol/nntp.pm
- version: '6.38'
+ version: '6.39'
LWP::Protocol::nogo:
file: lib/LWP/Protocol/nogo.pm
- version: '6.38'
+ version: '6.39'
LWP::RobotUA:
file: lib/LWP/RobotUA.pm
- version: '6.38'
+ version: '6.39'
LWP::Simple:
file: lib/LWP/Simple.pm
- version: '6.38'
+ version: '6.39'
LWP::UserAgent:
file: lib/LWP/UserAgent.pm
- version: '6.38'
+ version: '6.39'
requires:
Digest::MD5: '0'
Encode: '2.12'
bugtracker: https://github.com/libwww-perl/libwww-perl/issues
homepage: https://github.com/libwww-perl/libwww-perl
repository: https://github.com/libwww-perl/libwww-perl.git
-version: '6.38'
+version: '6.39'
x_Dist_Zilla:
perl:
version: '5.026001'
class: Dist::Zilla::Plugin::Git::Contributors
config:
Dist::Zilla::Plugin::Git::Contributors:
- git_version: 2.20.1
+ git_version: 2.21.0
include_authors: 0
include_releaser: 1
order_by: name
version: '6.012'
-
class: Dist::Zilla::Plugin::InstallGuide
+ config:
+ Dist::Zilla::Role::ModuleMetadata:
+ Module::Metadata: '1.000033'
+ version: '0.004'
name: InstallGuide
- version: '1.200012'
+ version: '1.200013'
-
class: Dist::Zilla::Plugin::ExecDir
name: ExecDir
default_jobs: 1
version: '6.012'
name: MakeMaker::Awesome
- version: '0.41'
+ version: '0.47'
-
class: Dist::Zilla::Plugin::MojibakeTests
name: MojibakeTests
allow_dirty_match: []
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.20.1
+ git_version: 2.21.0
repo_root: .
name: Git::Check
version: '2.046'
allow_dirty_match: []
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.20.1
+ git_version: 2.21.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
branch: ~
changelog: Changes
signed: 0
- tag: v6.38
+ tag: v6.39
tag_format: v%V
tag_message: v%V
Dist::Zilla::Role::Git::Repo:
- git_version: 2.20.1
+ git_version: 2.21.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
- (?^:^lib/.*\.pm$)
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.20.1
+ git_version: 2.21.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
- origin
remotes_must_exist: 1
Dist::Zilla::Role::Git::Repo:
- git_version: 2.20.1
+ git_version: 2.21.0
repo_root: .
name: Git::Push
version: '2.046'
# This Makefile.PL for libwww-perl was generated by
-# Dist::Zilla::Plugin::MakeMaker::Awesome 0.41.
+# Dist::Zilla::Plugin::MakeMaker::Awesome 0.47.
# Don't edit it but the dist.ini and plugins used to construct it.
use strict;
"Test::Needs" => 0,
"Test::RequiresInternet" => 0
},
- "VERSION" => "6.38",
+ "VERSION" => "6.39",
"test" => {
"TESTS" => "t/*.t t/base/*.t t/base/protocols/*.t t/leak/*.t t/local/*.t t/robot/*.t"
}
# inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.034
requires('HTTP::Status', '6.18') if has_module('HTTP::Status', '6.17');
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+unless ( eval { ExtUtils::MakeMaker->VERSION('6.63_03') } ) {
delete $WriteMakefileArgs{TEST_REQUIRES};
delete $WriteMakefileArgs{BUILD_REQUIRES};
$WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
[Manifest]
[License]
[InstallGuide]
+:version = 1.200013
; make the bin dir executables
[ExecDir]
--- /dev/null
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw( say );
+
+use LWP::UserAgent;
+my $ua = LWP::UserAgent->new;
+
+my @phases = (
+ 'request_preprepare', 'request_prepare',
+ 'request_send', 'response_header',
+ 'response_data', 'response_done',
+ 'response_redirect',
+);
+
+for my $phase (@phases) {
+ $ua->add_handler($phase => sub { say "$phase"; return undef; });
+}
+
+$ua->get('http://example.com');
package LWP;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require LWP::UserAgent; # this should load everything you need
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require MIME::Base64;
use strict;
use base 'LWP::Authen::Basic';
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require Digest::MD5;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
use Authen::NTLM "1.02";
use MIME::Base64 "2.12";
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
our $DEBUG;
sub new {
package LWP::Debug; # legacy
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require Exporter;
our @ISA = qw(Exporter);
use strict;
use base 'LWP::Protocol::http';
-our $VERSION = '6.38';
+our $VERSION = '6.39';
package # hide from PAUSE
LWP::Debug::TraceHTTP::Socket;
package LWP::DebugFile;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
# legacy stub
package LWP::MemberMixin;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
sub _elem {
my $self = shift;
use base 'LWP::MemberMixin';
-our $VERSION = '6.38';
+our $VERSION = '6.39';
use strict;
use Carp ();
use base qw(LWP::Protocol);
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require URI;
require HTTP::Status;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
require HTTP::Status;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require LWP::MediaTypes;
require HTTP::Request;
use base qw(LWP::Protocol);
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
use Carp ();
use HTTP::Status ();
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
require HTTP::Status;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
require HTTP::Status;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
use Carp;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
use base qw(LWP::Protocol);
our $SENDMAIL;
use base qw(LWP::Protocol);
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
require HTTP::Status;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require HTTP::Response;
require HTTP::Status;
use base qw(LWP::UserAgent);
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require WWW::RobotRules;
require HTTP::Request;
use strict;
-our $VERSION = '6.38';
+our $VERSION = '6.39';
require Exporter;
use Scalar::Util qw(blessed);
use Try::Tiny qw(try catch);
-our $VERSION = '6.38';
+our $VERSION = '6.39';
sub new
{
=head1 SYNOPSIS
- use strict;
- use warnings;
- use LWP::UserAgent ();
+ use strict;
+ use warnings;
- my $ua = LWP::UserAgent->new;
- $ua->timeout(10);
- $ua->env_proxy;
+ use LWP::UserAgent ();
- my $response = $ua->get('http://example.com');
+ my $ua = LWP::UserAgent->new(timeout => 10);
+ $ua->env_proxy;
+
+ my $response = $ua->get('http://example.com');
+
+ if ($response->is_success) {
+ print $response->decoded_content;
+ }
+ else {
+ die $response->status_line;
+ }
+
+Extra layers of security (note the C<cookie_jar> and C<protocols_allowed>):
+
+ use strict;
+ use warnings;
+
+ use HTTP::CookieJar::LWP ();
+ use LWP::UserAgent ();
+
+ my $jar = HTTP::CookieJar::LWP->new;
+ my $ua = LWP::UserAgent->new(
+ cookie_jar => $jar,
+ protocols_allowed => ['http', 'https'],
+ timeout => 10,
+ );
+
+ $ua->env_proxy;
- if ($response->is_success) {
- print $response->decoded_content; # or whatever
- }
- else {
- die $response->status_line;
- }
+ my $response = $ua->get('http://example.com');
+
+ if ($response->is_success) {
+ print $response->decoded_content;
+ }
+ else {
+ die $response->status_line;
+ }
=head1 DESCRIPTION
C<add_cookie_header($request)> methods. These methods will then be
invoked by the user agent as requests are sent and responses are
received. Normally this will be a L<HTTP::Cookies> object or some
-subclass.
+subclass. You are, however, encouraged to use L<HTTP::CookieJar::LWP>
+instead. See L</"BEST PRACTICES"> for more information.
+
+ use HTTP::CookieJar::LWP ();
+
+ my $jar = HTTP::CookieJar::LWP->new;
+ my $ua = LWP::UserAgent->new( cookie_jar => $jar );
+
+ # or after object creation
+ $ua->cookie_jar( $cookie_jar );
The default is to have no cookie jar, i.e. never automatically add
C<Cookie> headers to the requests.
Add handler to be invoked in the given processing phase. For how to
specify C<%matchspec> see L<HTTP::Config/"Matching">.
-The possible values C<$phase> and the corresponding callback signatures are:
-
-=over
-
-=item response_data => sub { my($response, $ua, $handler, $data) = @_; ... }
-
-This handler is called for each chunk of data received for the
-response. The handler might croak to abort the request.
-
-This handler needs to return a TRUE value to be called again for
-subsequent chunks for the same request.
-
-=item response_done => sub { my($response, $ua, $handler) = @_; ... }
+The possible values C<$phase> and the corresponding callback signatures are as
+follows. Note that the handlers are documented in the order in which they will
+be run, which is:
-The handler is called after the response has been fully received, but
-before any redirect handling is attempted. The handler can be used to
-extract information or modify the response.
+ request_preprepare
+ request_prepare
+ request_send
+ response_header
+ response_data
+ response_done
+ response_redirect
-=item response_header => sub { my($response, $ua, $handler) = @_; ... }
+=over
-This handler is called right after the response headers have been
-received, but before any content data. The handler might set up
-handlers for data and might croak to abort the request.
+=item request_preprepare => sub { my($request, $ua, $handler) = @_; ... }
-The handler might set the C<< $response->{default_add_content} >> value to
-control if any received data should be added to the response object
-directly. This will initially be false if the C<< $ua->request() >> method
-was called with a C<$content_file> or C<$content_cb argument>; otherwise true.
+The handler is called before the C<request_prepare> and other standard
+initialization of the request. This can be used to set up headers
+and attributes that the C<request_prepare> handler depends on. Proxy
+initialization should take place here; but in general don't register
+handlers for this phase.
=item request_prepare => sub { my($request, $ua, $handler) = @_; ... }
raised it will abort the request and make the request method return a
"400 Bad request" response.
-=item request_preprepare => sub { my($request, $ua, $handler) = @_; ... }
-
-The handler is called before the C<request_prepare> and other standard
-initialization of the request. This can be used to set up headers
-and attributes that the C<request_prepare> handler depends on. Proxy
-initialization should take place here; but in general don't register
-handlers for this phase.
-
=item request_send => sub { my($request, $ua, $handler) = @_; ... }
This handler gets a chance of handling requests before they're sent to the
The C<response_header> and C<response_data> handlers will not be
invoked for this response, but the C<response_done> will be.
+=item response_header => sub { my($response, $ua, $handler) = @_; ... }
+
+This handler is called right after the response headers have been
+received, but before any content data. The handler might set up
+handlers for data and might croak to abort the request.
+
+The handler might set the C<< $response->{default_add_content} >> value to
+control if any received data should be added to the response object
+directly. This will initially be false if the C<< $ua->request() >> method
+was called with a C<$content_file> or C<$content_cb argument>; otherwise true.
+
+=item response_data => sub { my($response, $ua, $handler, $data) = @_; ... }
+
+This handler is called for each chunk of data received for the
+response. The handler might croak to abort the request.
+
+This handler needs to return a TRUE value to be called again for
+subsequent chunks for the same request.
+
+=item response_done => sub { my($response, $ua, $handler) = @_; ... }
+
+The handler is called after the response has been fully received, but
+before any redirect handling is attempted. The handler can be used to
+extract information or modify the response.
+
=item response_redirect => sub { my($response, $ua, $handler) = @_; ... }
The handler is called in C<< $ua->request >> after C<response_done>. If the
false if the proposed redirection is to a C<file://...>
URL, and true otherwise.
+=head1 BEST PRACTICES
+
+The default settings can get you up and running quickly, but there are settings
+you can change in order to make your life easier.
+
+=head2 Handling Cookies
+
+You are encouraged to install L<Mozilla::PublicSuffix> and use
+L<HTTP::CookieJar::LWP> as your cookie jar. L<HTTP::CookieJar::LWP> provides a
+better security model matching that of current Web browsers when
+L<Mozilla::PublicSuffix> is installed.
+
+ use HTTP::CookieJar::LWP ();
+
+ my $jar = HTTP::CookieJar::LWP->new;
+ my $ua = LWP::UserAgent->new( cookie_jar => $jar );
+
+See L</"cookie_jar"> for more information.
+
+=head2 Managing Protocols
+
+C<protocols_allowed> gives you the ability to whitelist the protocols you're
+willing to allow.
+
+ my $ua = LWP::UserAgent->new(
+ protocols_allowed => [ 'http', 'https' ]
+ );
+
+This will prevent you from inadvertently following URLs like
+C<file:///etc/passwd>. See L</"protocols_allowed">.
+
+C<protocols_forbidden> gives you the ability to blacklist the protocols you're
+unwilling to allow.
+
+ my $ua = LWP::UserAgent->new(
+ protocols_forbidden => [ 'file', 'mailto', 'ssh', ]
+ );
+
+This can also prevent you from inadvertently following URLs like
+C<file:///etc/passwd>. See L</protocols_forbidden>.
+
=head1 SEE ALSO
See L<LWP> for a complete overview of libwww-perl5. See L<lwpcook>
use warnings;
use LWP::UserAgent ();
-use Test::More;
+use Test::More skip_all => 'nntp.perl.org is unstable and Test::RequiresInternet is not catching it';
use Test::RequiresInternet ( 'nntp.perl.org' => 119 );
plan tests => 1;
note 'Checking Changes';
my $changes_file = 'Changes';
-my $newver = '6.38';
+my $newver = '6.39';
my $trial_token = '-TRIAL';
my $encoding = 'UTF-8';