Revision history for URI
+5.12 2022-07-10 23:48:50Z
+ - Fix an issue where i.e. 'file:///tmp/###' was not properly escaped.
+ A non-existing authority part was accidentally processed.
+ Details: https://github.com/libwww-perl/URI/issues/102
+ (GH#102) (Perlbotics)
+ - Reverts to previous behavior (5.10) for 'mailto:' scheme for
+ escaping square brackets.
+
+5.11 2022-07-04 20:53:38Z
+ - Fix some typos in URI::file (GH#94) (Olaf Alders)
+ - Escape square brackets in path (GH#100) (Perlbotics)
+ - Fix storable.t (GH#97) (Shoichi Kaji)
+
5.10 2021-10-25 20:58:42Z
- Remove Authority section from dist.ini (GH#86) (Olaf Alders)
- - Make URI::mailto parse subaddresses with + sign correctly (GH#89) (Julien Fiegehenn)
+ - Make URI::mailto parse subaddresses with + sign correctly (GH#89) (Julien
+ Fiegehenn)
5.09 2021-03-03 15:16:47Z
- Update Business::ISBN version requirements (GH#85) (brian d foy and Olaf
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.025.
CONTRIBUTING.md
Changes
LICENSE
t/sip.t
t/sort-hash-query-form.t
t/split.t
+t/sq-brackets-legacy.t
+t/sq-brackets.t
t/storable-test.pl
t/storable.t
t/urn-isbn.t
"Gisle Aas <gisle@activestate.com>"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010",
+ "generated_by" : "Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010",
"license" : [
"perl_5"
],
"warnings" : "0"
},
"suggests" : {
- "Business::ISBN" : "3.005"
+ "Business::ISBN" : "3.005",
+ "Regexp::IPv6" : "0.03"
}
},
"test" : {
"provides" : {
"URI" : {
"file" : "lib/URI.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::Escape" : {
"file" : "lib/URI/Escape.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::Heuristic" : {
"file" : "lib/URI/Heuristic.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::IRI" : {
"file" : "lib/URI/IRI.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::QueryParam" : {
"file" : "lib/URI/QueryParam.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::Split" : {
"file" : "lib/URI/Split.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::URL" : {
"file" : "lib/URI/URL.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::WithBase" : {
"file" : "lib/URI/WithBase.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::data" : {
"file" : "lib/URI/data.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file" : {
"file" : "lib/URI/file.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::Base" : {
"file" : "lib/URI/file/Base.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::FAT" : {
"file" : "lib/URI/file/FAT.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::Mac" : {
"file" : "lib/URI/file/Mac.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::OS2" : {
"file" : "lib/URI/file/OS2.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::QNX" : {
"file" : "lib/URI/file/QNX.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::Unix" : {
"file" : "lib/URI/file/Unix.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::file::Win32" : {
"file" : "lib/URI/file/Win32.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::ftp" : {
"file" : "lib/URI/ftp.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::gopher" : {
"file" : "lib/URI/gopher.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::http" : {
"file" : "lib/URI/http.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::https" : {
"file" : "lib/URI/https.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::ldap" : {
"file" : "lib/URI/ldap.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::ldapi" : {
"file" : "lib/URI/ldapi.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::ldaps" : {
"file" : "lib/URI/ldaps.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::mailto" : {
"file" : "lib/URI/mailto.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::mms" : {
"file" : "lib/URI/mms.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::news" : {
"file" : "lib/URI/news.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::nntp" : {
"file" : "lib/URI/nntp.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::nntps" : {
"file" : "lib/URI/nntps.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::pop" : {
"file" : "lib/URI/pop.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::rlogin" : {
"file" : "lib/URI/rlogin.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::rsync" : {
"file" : "lib/URI/rsync.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::rtsp" : {
"file" : "lib/URI/rtsp.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::rtspu" : {
"file" : "lib/URI/rtspu.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::sftp" : {
"file" : "lib/URI/sftp.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::sip" : {
"file" : "lib/URI/sip.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::sips" : {
"file" : "lib/URI/sips.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::snews" : {
"file" : "lib/URI/snews.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::ssh" : {
"file" : "lib/URI/ssh.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::telnet" : {
"file" : "lib/URI/telnet.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::tn3270" : {
"file" : "lib/URI/tn3270.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::urn" : {
"file" : "lib/URI/urn.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::urn::isbn" : {
"file" : "lib/URI/urn/isbn.pm",
- "version" : "5.10"
+ "version" : "5.12"
},
"URI::urn::oid" : {
"file" : "lib/URI/urn/oid.pm",
- "version" : "5.10"
+ "version" : "5.12"
}
},
"release_status" : "stable",
"x_IRC" : "irc://irc.perl.org/#lwp",
"x_MailingList" : "mailto:libwww@perl.org"
},
- "version" : "5.10",
+ "version" : "5.12",
"x_Dist_Zilla" : {
"perl" : {
- "version" : "5.030002"
+ "version" : "5.036000"
},
"plugins" : [
{
{
"class" : "Dist::Zilla::Plugin::Encoding",
"name" : "Encoding",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MetaConfig",
"name" : "MetaConfig",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MetaProvides::Package",
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : "MetaProvides::Package/AUTOVIV/:InstallModulesPM",
- "version" : "6.024"
+ "version" : "6.025"
}
],
"include_underscores" : 0
{
"class" : "Dist::Zilla::Plugin::MetaNoIndex",
"name" : "MetaNoIndex",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MetaYAML",
"name" : "MetaYAML",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MetaJSON",
"name" : "MetaJSON",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MetaResources",
"name" : "MetaResources",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::Git::Contributors",
"config" : {
"Dist::Zilla::Plugin::Git::Contributors" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"include_authors" : 0,
"include_releaser" : 1,
"order_by" : "commits",
{
"class" : "Dist::Zilla::Plugin::Manifest",
"name" : "Manifest",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::License",
"name" : "License",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::ExecDir",
"name" : "ExecDir",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::Prereqs::FromCPANfile",
{
"class" : "Dist::Zilla::Plugin::Readme",
"name" : "Readme",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::MakeMaker",
"config" : {
"Dist::Zilla::Role::TestRunner" : {
- "default_jobs" : "1"
+ "default_jobs" : "8"
}
},
"name" : "MakeMaker",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::CheckChangesHasContent",
{
"class" : "Dist::Zilla::Plugin::MetaTests",
"name" : "MetaTests",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::Test::ChangesHasContent",
{
"class" : "Dist::Zilla::Plugin::PodSyntaxTests",
"name" : "PodSyntaxTests",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable",
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
}
},
"class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts",
"config" : {
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
}
},
"class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch",
"config" : {
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
}
},
{
"class" : "Dist::Zilla::Plugin::TestRelease",
"name" : "TestRelease",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::RunExtraTests",
"config" : {
"Dist::Zilla::Role::TestRunner" : {
- "default_jobs" : "1"
+ "default_jobs" : "8"
}
},
"name" : "RunExtraTests",
{
"class" : "Dist::Zilla::Plugin::UploadToCPAN",
"name" : "UploadToCPAN",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod",
}
},
"name" : "@Git::VersionManager/pluginbundle version",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::VersionFromMainModule",
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
"branch" : null,
"changelog" : "Changes",
"signed" : 0,
- "tag" : "v5.10",
+ "tag" : "v5.12",
"tag_format" : "v%V",
"tag_message" : "v%V"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
{
"class" : "Dist::Zilla::Plugin::NextRelease",
"name" : "@Git::VersionManager/NextRelease",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::Git::Commit",
"changelog" : "Changes"
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
},
"Dist::Zilla::Role::Git::StringFormatter" : {
"remotes_must_exist" : 1
},
"Dist::Zilla::Role::Git::Repo" : {
- "git_version" : "2.33.1",
+ "git_version" : "2.37.0",
"repo_root" : "."
}
},
{
"class" : "Dist::Zilla::Plugin::ConfirmRelease",
"name" : "ConfirmRelease",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":InstallModules",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":IncModules",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":TestFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":ExtraTestFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":ExecFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":PerlExecFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":ShareFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":MainModule",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":AllFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":NoFiles",
- "version" : "6.024"
+ "version" : "6.025"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : "MetaProvides::Package/AUTOVIV/:InstallModulesPM",
- "version" : "6.024"
+ "version" : "6.025"
}
],
"zilla" : {
"config" : {
"is_trial" : 0
},
- "version" : "6.024"
+ "version" : "6.025"
}
},
"x_contributors" : [
"Ville Skytt\u00e4 <ville.skytta@iki.fi>",
"Mark Stosberg <mark@stosberg.com>",
"Michael G. Schwern <schwern@pobox.com>",
- "Julien Fiegehenn <simbabque@cpan.org>",
"Shoichi Kaji <skaji@cpan.org>",
+ "Julien Fiegehenn <simbabque@cpan.org>",
+ "Perlbotics <perlbotix@cpan.org>",
"Slaven Rezic <slaven@rezic.de>",
"Adam Herzog <adam@adamherzog.com>",
"Alex Kapranoff <kapranoff@gmail.com>",
"Tatsuhiko Miyagawa <miyagawa@bulknews.net>",
"Torsten F\u00f6rtsch <torsten.foertsch@gmx.net>"
],
- "x_generated_by_perl" : "v5.30.2",
- "x_serialization_backend" : "Cpanel::JSON::XS version 4.26",
+ "x_generated_by_perl" : "v5.36.0",
+ "x_serialization_backend" : "Cpanel::JSON::XS version 4.29",
"x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later"
}
configure_requires:
ExtUtils::MakeMaker: '0'
dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010'
+generated_by: 'Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
provides:
URI:
file: lib/URI.pm
- version: '5.10'
+ version: '5.12'
URI::Escape:
file: lib/URI/Escape.pm
- version: '5.10'
+ version: '5.12'
URI::Heuristic:
file: lib/URI/Heuristic.pm
- version: '5.10'
+ version: '5.12'
URI::IRI:
file: lib/URI/IRI.pm
- version: '5.10'
+ version: '5.12'
URI::QueryParam:
file: lib/URI/QueryParam.pm
- version: '5.10'
+ version: '5.12'
URI::Split:
file: lib/URI/Split.pm
- version: '5.10'
+ version: '5.12'
URI::URL:
file: lib/URI/URL.pm
- version: '5.10'
+ version: '5.12'
URI::WithBase:
file: lib/URI/WithBase.pm
- version: '5.10'
+ version: '5.12'
URI::data:
file: lib/URI/data.pm
- version: '5.10'
+ version: '5.12'
URI::file:
file: lib/URI/file.pm
- version: '5.10'
+ version: '5.12'
URI::file::Base:
file: lib/URI/file/Base.pm
- version: '5.10'
+ version: '5.12'
URI::file::FAT:
file: lib/URI/file/FAT.pm
- version: '5.10'
+ version: '5.12'
URI::file::Mac:
file: lib/URI/file/Mac.pm
- version: '5.10'
+ version: '5.12'
URI::file::OS2:
file: lib/URI/file/OS2.pm
- version: '5.10'
+ version: '5.12'
URI::file::QNX:
file: lib/URI/file/QNX.pm
- version: '5.10'
+ version: '5.12'
URI::file::Unix:
file: lib/URI/file/Unix.pm
- version: '5.10'
+ version: '5.12'
URI::file::Win32:
file: lib/URI/file/Win32.pm
- version: '5.10'
+ version: '5.12'
URI::ftp:
file: lib/URI/ftp.pm
- version: '5.10'
+ version: '5.12'
URI::gopher:
file: lib/URI/gopher.pm
- version: '5.10'
+ version: '5.12'
URI::http:
file: lib/URI/http.pm
- version: '5.10'
+ version: '5.12'
URI::https:
file: lib/URI/https.pm
- version: '5.10'
+ version: '5.12'
URI::ldap:
file: lib/URI/ldap.pm
- version: '5.10'
+ version: '5.12'
URI::ldapi:
file: lib/URI/ldapi.pm
- version: '5.10'
+ version: '5.12'
URI::ldaps:
file: lib/URI/ldaps.pm
- version: '5.10'
+ version: '5.12'
URI::mailto:
file: lib/URI/mailto.pm
- version: '5.10'
+ version: '5.12'
URI::mms:
file: lib/URI/mms.pm
- version: '5.10'
+ version: '5.12'
URI::news:
file: lib/URI/news.pm
- version: '5.10'
+ version: '5.12'
URI::nntp:
file: lib/URI/nntp.pm
- version: '5.10'
+ version: '5.12'
URI::nntps:
file: lib/URI/nntps.pm
- version: '5.10'
+ version: '5.12'
URI::pop:
file: lib/URI/pop.pm
- version: '5.10'
+ version: '5.12'
URI::rlogin:
file: lib/URI/rlogin.pm
- version: '5.10'
+ version: '5.12'
URI::rsync:
file: lib/URI/rsync.pm
- version: '5.10'
+ version: '5.12'
URI::rtsp:
file: lib/URI/rtsp.pm
- version: '5.10'
+ version: '5.12'
URI::rtspu:
file: lib/URI/rtspu.pm
- version: '5.10'
+ version: '5.12'
URI::sftp:
file: lib/URI/sftp.pm
- version: '5.10'
+ version: '5.12'
URI::sip:
file: lib/URI/sip.pm
- version: '5.10'
+ version: '5.12'
URI::sips:
file: lib/URI/sips.pm
- version: '5.10'
+ version: '5.12'
URI::snews:
file: lib/URI/snews.pm
- version: '5.10'
+ version: '5.12'
URI::ssh:
file: lib/URI/ssh.pm
- version: '5.10'
+ version: '5.12'
URI::telnet:
file: lib/URI/telnet.pm
- version: '5.10'
+ version: '5.12'
URI::tn3270:
file: lib/URI/tn3270.pm
- version: '5.10'
+ version: '5.12'
URI::urn:
file: lib/URI/urn.pm
- version: '5.10'
+ version: '5.12'
URI::urn::isbn:
file: lib/URI/urn/isbn.pm
- version: '5.10'
+ version: '5.12'
URI::urn::oid:
file: lib/URI/urn/oid.pm
- version: '5.10'
+ version: '5.12'
requires:
Carp: '0'
Cwd: '0'
bugtracker: https://github.com/libwww-perl/URI/issues
homepage: https://github.com/libwww-perl/URI
repository: https://github.com/libwww-perl/URI.git
-version: '5.10'
+version: '5.12'
x_Dist_Zilla:
perl:
- version: '5.030002'
+ version: '5.036000'
plugins:
-
class: Dist::Zilla::Plugin::Git::GatherDir
-
class: Dist::Zilla::Plugin::Encoding
name: Encoding
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MetaConfig
name: MetaConfig
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MetaProvides::Package
config:
-
class: Dist::Zilla::Plugin::FinderCode
name: MetaProvides::Package/AUTOVIV/:InstallModulesPM
- version: '6.024'
+ version: '6.025'
include_underscores: 0
Dist::Zilla::Role::MetaProvider::Provider:
$Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004'
inherit_missing: '0'
inherit_version: '0'
- meta_noindex: '1'
+ meta_noindex: 1
Dist::Zilla::Role::ModuleMetadata:
Module::Metadata: '1.000037'
version: '0.006'
-
class: Dist::Zilla::Plugin::MetaNoIndex
name: MetaNoIndex
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MetaYAML
name: MetaYAML
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MetaJSON
name: MetaJSON
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MetaResources
name: MetaResources
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::Git::Contributors
config:
Dist::Zilla::Plugin::Git::Contributors:
- git_version: 2.33.1
+ git_version: 2.37.0
include_authors: 0
include_releaser: 1
order_by: commits
-
class: Dist::Zilla::Plugin::Manifest
name: Manifest
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::License
name: License
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::ExecDir
name: ExecDir
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::Prereqs::FromCPANfile
name: Prereqs::FromCPANfile
-
class: Dist::Zilla::Plugin::Readme
name: Readme
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::MakeMaker
config:
Dist::Zilla::Role::TestRunner:
- default_jobs: '1'
+ default_jobs: '8'
name: MakeMaker
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::CheckChangesHasContent
name: CheckChangesHasContent
-
class: Dist::Zilla::Plugin::MetaTests
name: MetaTests
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::Test::ChangesHasContent
name: Test::ChangesHasContent
-
class: Dist::Zilla::Plugin::PodSyntaxTests
name: PodSyntaxTests
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable
name: Test::Pod::Coverage::Configurable
allow_dirty_match: []
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
name: Git::Check
version: '2.048'
class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts
config:
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
name: Git::CheckFor::MergeConflicts
version: '0.014'
class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch
config:
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
name: Git::CheckFor::CorrectBranch
version: '0.014'
-
class: Dist::Zilla::Plugin::TestRelease
name: TestRelease
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::RunExtraTests
config:
Dist::Zilla::Role::TestRunner:
- default_jobs: '1'
+ default_jobs: '8'
name: RunExtraTests
version: '0.029'
-
class: Dist::Zilla::Plugin::UploadToCPAN
name: UploadToCPAN
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::ReadmeAnyFromPod
config:
phase: develop
type: recommends
name: '@Git::VersionManager/pluginbundle version'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::VersionFromMainModule
config:
allow_dirty_match: []
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
branch: ~
changelog: Changes
signed: 0
- tag: v5.10
+ tag: v5.12
tag_format: v%V
tag_message: v%V
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
-
class: Dist::Zilla::Plugin::NextRelease
name: '@Git::VersionManager/NextRelease'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::Git::Commit
config:
- (?^:^lib/.*\.pm$)
changelog: Changes
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
Dist::Zilla::Role::Git::StringFormatter:
time_zone: local
- origin
remotes_must_exist: 1
Dist::Zilla::Role::Git::Repo:
- git_version: 2.33.1
+ git_version: 2.37.0
repo_root: .
name: Git::Push
version: '2.048'
-
class: Dist::Zilla::Plugin::ConfirmRelease
name: ConfirmRelease
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':InstallModules'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':IncModules'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':TestFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':ExtraTestFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':ExecFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':PerlExecFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':ShareFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':MainModule'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':AllFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':NoFiles'
- version: '6.024'
+ version: '6.025'
-
class: Dist::Zilla::Plugin::FinderCode
name: MetaProvides::Package/AUTOVIV/:InstallModulesPM
- version: '6.024'
+ version: '6.025'
zilla:
class: Dist::Zilla::Dist::Builder
config:
- is_trial: '0'
- version: '6.024'
+ is_trial: 0
+ version: '6.025'
x_contributors:
- 'Gisle Aas <gisle@aas.no>'
- 'Karen Etheridge <ether@cpan.org>'
- 'Ville Skyttä <ville.skytta@iki.fi>'
- 'Mark Stosberg <mark@stosberg.com>'
- 'Michael G. Schwern <schwern@pobox.com>'
- - 'Julien Fiegehenn <simbabque@cpan.org>'
- 'Shoichi Kaji <skaji@cpan.org>'
+ - 'Julien Fiegehenn <simbabque@cpan.org>'
+ - 'Perlbotics <perlbotix@cpan.org>'
- 'Slaven Rezic <slaven@rezic.de>'
- 'Adam Herzog <adam@adamherzog.com>'
- 'Alex Kapranoff <kapranoff@gmail.com>'
- 'Salvatore Bonaccorso <carnil@launchpad.net>'
- 'Tatsuhiko Miyagawa <miyagawa@bulknews.net>'
- 'Torsten Förtsch <torsten.foertsch@gmx.net>'
-x_generated_by_perl: v5.30.2
+x_generated_by_perl: v5.36.0
x_serialization_backend: 'YAML::Tiny version 1.73'
x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.025.
use strict;
use warnings;
"Test::Needs" => 0,
"utf8" => 0
},
- "VERSION" => "5.10",
+ "VERSION" => "5.12",
"test" => {
"TESTS" => "t/*.t"
}
This archive contains the distribution URI,
-version 5.10:
+version 5.12:
Uniform Resource Identifiers (absolute and relative)
the same terms as the Perl 5 programming language system itself.
-This README file was generated by Dist::Zilla::Plugin::Readme v6.024.
+This README file was generated by Dist::Zilla::Plugin::Readme v6.025.
requires "strict" => "0";
requires "warnings" => "0";
requires "utf8" => '0';
+ suggests 'Regexp::IPv6' => "0.03";
suggests 'Business::ISBN' => "3.005";
};
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
+
+# 1=version 5.10 and earlier; 0=version 5.11 and later
+use constant HAS_RESERVED_SQUARE_BRACKETS => $ENV{URI_HAS_RESERVED_SQUARE_BRACKETS} ? 1 : 0;
our ($ABS_REMOTE_LEADING_DOTS, $ABS_ALLOW_RELATIVE_SCHEME, $DEFAULT_QUERY_FORM_DELIMITER);
# Some "official" character classes
-our $reserved = q(;/?:@&=+$,[]);
+our $reserved = HAS_RESERVED_SQUARE_BRACKETS ? q(;/?:@&=+$,[]) : q(;/?:@&=+$,);
our $mark = q(-_.!~*'()); #'; emacs
our $unreserved = "A-Za-z0-9\Q$mark\E";
our $uric = quotemeta($reserved) . $unreserved . "%";
+our $uric4host = $uric . ( HAS_RESERVED_SQUARE_BRACKETS ? '' : quotemeta( q([]) ) );
+our $uric4user = quotemeta( q{!$'()*,;:._~%-+=%&} ) . "A-Za-z0-9" . ( HAS_RESERVED_SQUARE_BRACKETS ? quotemeta( q([]) ) : '' ); # RFC-3987: iuserinfo w/o UTF
our $scheme_re = '[a-zA-Z][a-zA-Z0-9.+\-]*';
+# These schemes don't have an IPv6+ address part.
+our $schemes_without_host_part_re = 'data|ldapi|urn|sqlite|sqlite3';
+
+# These schemes can have an IPv6+ authority part:
+# file, ftp, gopher, http, https, ldap, ldaps, mms, news, nntp, nntps, pop, rlogin, rtsp, rtspu, rsync, sip, sips, snews,
+# telnet, tn3270, ssh, sftp
+# (all DB URIs, i.e. cassandra, couch, couchdb, etc.), except 'sqlite:', 'sqlite3:'. Others?
+#MAINT: URI has no test coverage for DB schemes
+#MAINT: decoupling - perhaps let each class decide itself by defining a member function 'scheme_has_authority_part()'?
+
+#MAINT: 'mailto:' needs special treatment for IPv* addresses / RFC 5321 (4.1.3). Until then: restore all '[', ']'
+# These schemes need fallback to previous (<= 5.10) encoding until a specific handler is available.
+our $fallback_schemes_re = 'mailto';
+
use Carp ();
use URI::Escape ();
}
+#-- Version: 5.11+
+# Since the complete URI will be percent-encoded including '[' and ']',
+# we selectively unescape square brackets from the authority/host part of the URI.
+# Derived modules that implement _uric_escape() should take this into account
+# if they do not rely on URI::_uric_escape().
+# No unescaping is performed for the userinfo@ part of the authority part.
+sub _fix_uric_escape_for_host_part {
+ return if HAS_RESERVED_SQUARE_BRACKETS;
+ return if $_[0] !~ /%/;
+ return if $_[0] =~ m{^(?:$URI::schemes_without_host_part_re):}os;
+
+ # until a scheme specific handler is available, fall back to previous behavior of v5.10 (i.e. 'mailto:')
+ if ($_[0] =~ m{^(?:$URI::fallback_schemes_re):}os) {
+ $_[0] =~ s/\%5B/[/gi;
+ $_[0] =~ s/\%5D/]/gi;
+ return;
+ }
+
+ if ($_[0] =~ m{^((?:$URI::scheme_re:)?)//([^/?\#]+)(.*)$}os) {
+ my $orig = $2;
+ my ($user, $host) = $orig =~ /^(.*@)?([^@]*)$/;
+ $user ||= '';
+ my $port = $host =~ s/(:\d+)$// ? $1 : '';
+ #MAINT: die() here if scheme indicates TCP/UDP and port is out of range [0..65535] ?
+ $host =~ s/\%5B/[/gi;
+ $host =~ s/\%5D/]/gi;
+ $_[0] =~ s/\Q$orig\E/$user$host$port/;
+ }
+}
+
+
sub _uric_escape
{
my($class, $str) = @_;
$str =~ s*([^$uric\#])* URI::Escape::escape_char($1) *ego;
+ _fix_uric_escape_for_host_part( $str );
utf8::downgrade($str);
return $str;
}
=back
+=head1 ENVIRONMENT VARIABLES
+
+=over 4
+
+=item URI_HAS_RESERVED_SQUARE_BRACKETS
+
+Before version 5.11, URI treated square brackets as reserved characters
+throughout the whole URI string. However, these brackets are reserved
+only within the authority/host part of the URI and nowhere else (RFC 3986).
+
+Starting with version 5.11, URI takes this distinction into account.
+Setting the environment variable C<URI_HAS_RESERVED_SQUARE_BRACKETS>
+(programmatically or via the shell), restores the old behavior.
+
+ #-- restore 5.10 behavior programmatically
+ BEGIN {
+ $ENV{URI_HAS_RESERVED_SQUARE_BRACKETS} = 1;
+ }
+ use URI ();
+
+I<Note>: This environment variable is just used during initialization and has to be set
+ I<before> module URI is used/required. Changing it at run time has no effect.
+
+Its value can be checked programmatically by accessing the constant
+C<URI::HAS_RESERVED_SQUARE_BRACKETS>.
+
+=back
+
=head1 BUGS
There are some things that are not quite right:
our %escapes;
our @EXPORT = qw(uri_escape uri_unescape uri_escape_utf8);
our @EXPORT_OK = qw(%escapes);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use Carp ();
use Exporter 5.57 'import';
our @EXPORT_OK = qw(uf_uri uf_uristr uf_url uf_urlstr);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
our ($MY_COUNTRY, $DEBUG);
use overload '""' => sub { shift->as_string };
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub new {
my($class, $uri, $scheme) = @_;
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub URI::_query::query_param {
my $self = shift;
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use Exporter 5.57 'import';
our @EXPORT_OK = qw(uri_split uri_join);
use parent 'URI::WithBase';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
# Provide as much as possible of the old URI::URL interface for backwards
# compatibility...
use URI ();
use Scalar::Util qw(blessed);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use overload '""' => "as_string", fallback => 1;
use parent 'URI::_generic';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
1;
use URI::Escape qw(uri_unescape);
use Carp ();
-our $VERSION = '5.10';
+our $VERSION = '5.12';
-my $ACHAR = $URI::uric; $ACHAR =~ s,\\[/?],,g;
-my $PCHAR = $URI::uric; $PCHAR =~ s,\\[?],,g;
+my $ACHAR = URI::HAS_RESERVED_SQUARE_BRACKETS ? $URI::uric : $URI::uric4host; $ACHAR =~ s,\\[/?],,g;
+my $PCHAR = $URI::uric; $PCHAR =~ s,\\[?],,g;
sub _no_scheme_ok { 1 }
+our $IPv6_re;
+
+sub _looks_like_raw_ip6_address {
+ my $addr = shift;
+
+ if ( !$IPv6_re ) { #-- lazy / runs once / use Regexp::IPv6 if installed
+ eval {
+ require Regexp::IPv6;
+ Regexp::IPv6->import( qw($IPv6_re) );
+ 1;
+ } || do { $IPv6_re = qr/[:0-9a-f]{3,}/; }; #-- fallback: unambitious guess
+ }
+
+ return 0 unless $addr;
+ return 0 if $addr =~ tr/:/:/ < 2; #-- fallback must not create false positive for IPv4:Port = 0:0
+ return 1 if $addr =~ /^$IPv6_re$/i;
+ return 0;
+}
+
+
sub authority
{
my $self = shift;
my $rest = $3;
if (defined $auth) {
$auth =~ s/([^$ACHAR])/ URI::Escape::escape_char($1)/ego;
+ if ( my ($user, $host) = $auth =~ /^(.*@)?([^@]+)$/ ) { #-- special escape userinfo part
+ $user ||= '';
+ $user =~ s/([^$URI::uric4user])/ URI::Escape::escape_char($1)/ego;
+ $user =~ s/%40$/\@/; # recover final '@'
+ $host = "[$host]" if _looks_like_raw_ip6_address( $host );
+ $auth = $user . $host;
+ }
utf8::downgrade($auth);
$$self .= "//$auth";
}
use URI::_punycode qw(decode_punycode encode_punycode);
use Carp qw(croak);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
BEGIN {
*URI::_idna::_ENV_::JOIN_LEAKS_UTF8_FLAGS = "$]" < 5.008_003
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use URI::Escape qw(uri_unescape);
use parent qw(URI::_server URI::_userpass);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
# Generic terminal logins. This is used as a base class for 'telnet',
# 'tn3270', and 'rlogin' URL schemes.
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use Exporter 'import';
our @EXPORT = qw(encode_punycode decode_punycode);
use URI ();
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub query
{
use overload '""' => sub { $_[0]->[0] },
fallback => 1;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub new
{
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub _uric_escape {
my($class, $str) = @_;
}
sub _host_escape {
- return unless $_[0] =~ /[^$URI::uric]/;
+ return if URI::HAS_RESERVED_SQUARE_BRACKETS and $_[0] !~ /[^$URI::uric]/;
+ return if !URI::HAS_RESERVED_SQUARE_BRACKETS and $_[0] !~ /[^$URI::uric4host]/;
eval {
require URI::_idna;
$_[0] = URI::_idna::encode($_[0]);
$new =~ s/.*@//; # remove old stuff
my $ui = shift;
if (defined $ui) {
- $ui =~ s/@/%40/g; # protect @
- $new = "$ui\@$new";
+ $ui =~ s/([^$URI::uric4user])/ URI::Escape::escape_char($1)/ego;
+ $new = "$ui\@$new";
}
$self->authority($new);
}
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub user
{
use parent 'URI';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use MIME::Base64 qw(decode_base64 encode_base64);
use URI::Escape qw(uri_unescape);
use warnings;
use parent 'URI::_generic';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use URI::Escape qw(uri_unescape);
=head1 SYNOPSIS
use URI::file;
-
+
$u1 = URI->new("file:/foo/bar");
$u2 = URI->new("foo/bar", "file");
-
+
$u3 = URI::file->new($path);
$u4 = URI::file->new("c:\\windows\\", "win32");
-
+
$u1->file;
$u1->file("mac");
=item $URI::file::DEFAULT_AUTHORITY
-This determine what "authority" string to include in absolute file
+This determines what "authority" string to include in absolute file
URIs. It defaults to "". If you prefer verbose URIs you might set it
to be "localhost".
-Setting this value to C<undef> force behaviour compatible to URI v1.31
+Setting this value to C<undef> forces behaviour compatible to URI v1.31
and earlier. In this mode host names in UNC paths and drive letters
are mapped to the authority component on Windows, while we produce
authority-less URIs on Unix.
use URI::Escape ();
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub new
{
use parent 'URI::file::Win32';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub fix_path
{
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub _file_extract_path
{
use parent 'URI::file::Win32';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
# The Win32 version translates k:/foo to file://k:/foo (?!)
# We add an empty host
use parent 'URI::file::Unix';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub _file_extract_path
{
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub _file_extract_path
{
use URI::Escape qw(uri_unescape);
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub _file_extract_authority
{
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent qw(URI::_server URI::_userpass);
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_server';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_server';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::http';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent qw(URI::_ldap URI::_server);
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent qw(URI::_ldap URI::_generic);
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::ldap';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent qw(URI URI::_query);
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::http';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_server';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::news';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::nntp';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_server';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_login';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent qw(URI::_server URI::_userpass);
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::http';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::rtsp';
use parent 'URI::ssh';
-our $VERSION = '5.10';
+our $VERSION = '5.12';
1;
use URI::Escape ();
-our $VERSION = '5.10';
+our $VERSION = '5.12';
sub default_port { 5060 }
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::sip';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::news';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_login';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_login';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::_login';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::urn';
use strict;
use warnings;
-our $VERSION = '5.10';
+our $VERSION = '5.12';
use parent 'URI::urn';
'warnings' => '0'
},
'suggests' => {
- 'Business::ISBN' => '3.005'
+ 'Business::ISBN' => '3.005',
+ 'Regexp::IPv6' => '0.03'
}
},
'test' => {
use strict;
use warnings;
+use Test::More;
use URI::file;
-my @tests = (
-[ "file", "unix", "win32", "mac" ],
-#---------------- ------------ --------------- --------------
-[ "file://localhost/foo/bar",
- "!/foo/bar", "!\\foo\\bar", "!foo:bar", ],
-[ "file:///foo/bar",
- "/foo/bar", "\\foo\\bar", "!foo:bar", ],
-[ "file:/foo/bar", "!/foo/bar", "!\\foo\\bar", "foo:bar", ],
-[ "foo/bar", "foo/bar", "foo\\bar", ":foo:bar",],
-[ "file://foo3445x/bar","!//foo3445x/bar", "!\\\\foo3445x\\bar", "!foo3445x:bar"],
-[ "file://a:/", "!//a:/", "!A:\\", undef],
-[ "file:///A:/", "/A:/", "A:\\", undef],
-[ "file:///", "/", "\\", undef],
-[ ".", ".", ".", ":"],
-[ "..", "..", "..", "::"],
-[ "%2E", "!.", "!.", ":."],
-[ "../%2E%2E", "!../..", "!..\\..", "::.."],
-);
-
-my @os = @{shift @tests};
-shift @os; # file
-
-my $num = @tests;
-print "1..$num\n";
-
-my $testno = 1;
-
-for my $t (@tests) {
- my @t = @$t;
- my $file = shift @t;
- my $err;
-
- my $u = URI->new($file, "file");
- my $i = 0;
- for my $os (@os) {
- my $f = $u->file($os);
- my $expect = $t[$i];
- $f = "<undef>" unless defined $f;
- $expect = "<undef>" unless defined $expect;
- my $loose;
- $loose++ if $expect =~ s/^!//;
- if ($expect ne $f) {
- print "URI->new('$file', 'file')->file('$os') ne $expect, but $f\n";
- $err++;
- }
- if (defined($t[$i]) && !$loose) {
- my $u2 = URI::file->new($t[$i], $os);
- unless ($u2->as_string eq $file) {
- print "URI::file->new('$t[$i]', '$os') ne $file, but $u2\n";
- $err++;
- }
- }
- $i++;
- }
- print "not " if $err;
- print "ok $testno\n";
- $testno++;
+
+subtest 'OS related tests (unix, win32, mac)' => sub {
+
+ my @tests = (
+ ["file", "unix", "win32", "mac"],
+
+ #---------------- ------------ --------------- --------------
+ ["file://localhost/foo/bar", "!/foo/bar", "!\\foo\\bar", "!foo:bar",],
+ ["file:///foo/bar", "/foo/bar", "\\foo\\bar", "!foo:bar",],
+ ["file:/foo/bar", "!/foo/bar", "!\\foo\\bar", "foo:bar",],
+ ["foo/bar", "foo/bar", "foo\\bar", ":foo:bar",],
+ [
+ "file://foo3445x/bar", "!//foo3445x/bar",
+ "!\\\\foo3445x\\bar", "!foo3445x:bar"
+ ],
+ ["file://a:/", "!//a:/", "!A:\\", undef],
+ ["file:///A:/", "/A:/", "A:\\", undef],
+ ["file:///", "/", "\\", undef],
+ [".", ".", ".", ":"],
+ ["..", "..", "..", "::"],
+ ["%2E", "!.", "!.", ":."],
+ ["../%2E%2E", "!../..", "!..\\..", "::.."],
+ );
+
+ my @os = @{shift @tests};
+ shift @os; # file
+
+ for my $t (@tests) {
+ my @t = @$t;
+ my $file = shift @t;
+ my $u = URI->new($file, "file");
+ my $i = 0;
+
+ for my $os (@os) {
+ my $f = $u->file($os);
+ my $expect = $t[$i];
+ $f = "<undef>" unless defined $f;
+ $expect = "<undef>" unless defined $expect;
+ my $loose;
+ $loose++ if $expect =~ s/^!//;
+
+ is($f, $expect) or diag "URI->new('$file', 'file')->file('$os')";
+
+ if (defined($t[$i]) && !$loose) {
+ my $u2 = URI::file->new($t[$i], $os);
+ is($u2->as_string, $file)
+ or diag "URI::file->new('$t[$i]', '$os')";
+ }
+
+ $i++;
+ }
+ }
+
+};
+
+
+SKIP: {
+ skip "No pre 5.11 regression tests yet.", 1
+ if URI::HAS_RESERVED_SQUARE_BRACKETS;
+
+ subtest "Including Domains" => sub {
+
+ is(
+ URI->new('file://example.com/tmp/file.part[1]'),
+ 'file://example.com/tmp/file.part%5B1%5D'
+ );
+ is(
+ URI->new('file://127.0.0.1/tmp/file.part[2]'),
+ 'file://127.0.0.1/tmp/file.part%5B2%5D'
+ );
+ is(
+ URI->new('file://localhost/tmp/file.part[3]'),
+ 'file://localhost/tmp/file.part%5B3%5D'
+ );
+ is(
+ URI->new('file://[1:2:3::beef]/tmp/file.part[4]'),
+ 'file://[1:2:3::beef]/tmp/file.part%5B4%5D'
+ );
+ is(
+ URI->new('file:///[1:2:3::1ce]/tmp/file.part[5]'),
+ 'file:///%5B1:2:3::1ce%5D/tmp/file.part%5B5%5D'
+ );
+
+ };
+
}
+
+
+subtest "Regression Tests" => sub {
+
+ # Regression test for https://github.com/libwww-perl/URI/issues/102
+ my $with_hashes = URI::file->new_abs("/tmp/###");
+ is($with_hashes, 'file:///tmp/%23%23%23', "issue GH#102");
+
+};
+
+
+done_testing;
is $u, 'mailto:%22foo%20bar+baz%22@example.com', '... and stringification works';
}
+# RFC 5321 (4.1.3) - Address Literals
+
+# IPv4
+$u = URI->new('mailto:user@[127.0.0.1]');
+is $u->to, 'user@[127.0.0.1]', 'IPv4 host name';
+is $u, 'mailto:user@[127.0.0.1]', '... and stringification works';
+
+# IPv6
+$u = URI->new('mailto:user@[IPv6:fe80::e828:209d:20e:c0ae]');
+is $u->to, 'user@[IPv6:fe80::e828:209d:20e:c0ae]', 'IPv4 host name';
+is $u, 'mailto:user@[IPv6:fe80::e828:209d:20e:c0ae]', '... and stringification works';
+
done_testing;
is($all, $new, "uri_escape->uri_unescape"),
$url->path($all);
- is($url->full_path, q(%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%&'()*+,-./0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF), ref($url) . '->as_string');
+
+ if ( URI::HAS_RESERVED_SQUARE_BRACKETS ) {
+ # legacy: this was legal before '[' and ']' were restricted to the host part of the URI (see: RFC 3513 & RFC 3986)
+ is($url->full_path, q(%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%&'()*+,-./0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF), ref($url) . '->as_string');
+ } else {
+ is($url->full_path, q(%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%&'()*+,-./0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF), ref($url) . '->as_string');
+ }
# test escaping uses uppercase (preferred by rfc1837)
$url = new URI::URL 'file://h/';
--- /dev/null
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN {
+ $ENV{URI_HAS_RESERVED_SQUARE_BRACKETS} = 1;
+}
+
+use URI ();
+
+sub show {
+ diag explain("self: ", shift);
+}
+
+
+#-- test bugfix of https://github.com/libwww-perl/URI/issues/99
+
+
+no warnings; #-- don't complain about the fragment # being a potential comment
+my @legacy_tests = qw(
+ ftp://[::1]/
+ http://example.com/path_with_square_[brackets]
+ http://[::1]/and_[%5Bmixed%5D]_stuff_in_path
+ https://[::1]/path_with_square_[brackets]_and_query?par=value[1]&par=value[2]
+ http://[::1]/path_with_square_[brackets]_and_query?par=value[1]#and_fragment[2]
+ https://root[user]@[::1]/welcome.html
+ );
+use warnings;
+
+is( URI::HAS_RESERVED_SQUARE_BRACKETS, 1, "constant indicates to treat square brackets as reserved characters (legacy)" );
+
+foreach my $same ( @legacy_tests ) {
+ my $u = URI->new( $same );
+ is( $u->canonical,
+ $same,
+ "legacy: reserved square brackets not escaped"
+ ) or show $u;
+}
+
+done_testing;
--- /dev/null
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN {
+ $ENV{URI_HAS_RESERVED_SQUARE_BRACKETS} = 0;
+}
+
+use URI ();
+
+sub show {
+ diag explain("self: ", shift);
+}
+
+
+#-- test bugfix of https://github.com/libwww-perl/URI/issues/99
+
+
+is( URI::HAS_RESERVED_SQUARE_BRACKETS, 0, "constant indicates NOT to treat square brackets as reserved characters" );
+
+{
+ my $u = URI->new("http://[::1]/path_with_square_[brackets]?par=value[1]");
+ is( $u->canonical,
+ "http://[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D",
+ "sqb in path and request"
+ ) or show $u;
+}
+
+
+{
+ my $u = URI->new("http://[::1]/path_with_square_[brackets]?par=value[1]#fragment[2]");
+ is( $u->canonical,
+ "http://[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D#fragment%5B2%5D",
+ "sqb in path and request and fragment"
+ ) or show $u;
+}
+
+
+{
+ my $u = URI->new("http://root[user]@[::1]/path_with_square_[brackets]?par=value[1]#fragment[2]");
+ is( $u->canonical,
+ "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D#fragment%5B2%5D",
+ "sqb in userinfo, host, path, request and fragment"
+ ) or show $u;
+}
+
+
+{
+ my $u = URI->new("http://root[user]@[::1]/path_with_square_[brackets]?par=value[1]&par[2]=value[2]#fragment[2]");
+ is( $u->canonical,
+ "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D#fragment%5B2%5D",
+ "sqb in userinfo, host, path, request and fragment"
+ ) or show $u;
+
+ is( $u->scheme() , "http", "scheme");
+ is( $u->userinfo() , "root%5Buser%5D", "userinfo");
+ is( $u->host() , "::1", "host");
+ is( $u->ihost() , "::1", "ihost");
+ is( $u->port() , "80", "port");
+ is( $u->default_port() , "80", "default_port");
+ is( $u->host_port() , "[::1]:80", "host_port");
+ is( $u->secure() , "0", "is_secure" );
+ is( $u->path() , "/path_with_square_%5Bbrackets%5D", "path");
+ is( $u->opaque() , "//root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D", "opaque");
+ is( $u->fragment() , "fragment%5B2%5D", "fragment");
+ is( $u->query() , "par=value%5B1%5D&par%5B2%5D=value%5B2%5D", "query");
+ is( $u->as_string() , "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D#fragment%5B2%5D", "as_string");
+ is( $u->has_recognized_scheme() , "1", "has_recognized_scheme");
+ is( $u->as_iri() , "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D#fragment%5B2%5D", "as_iri"); #TODO: utf8
+
+ is( $u->abs( "/BASEDIR")->as_string() , "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D#fragment%5B2%5D", "abs (no change)");
+ is( $u->rel("../BASEDIR") , "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D#fragment%5B2%5D", "rel");
+
+ is( $u->authority() , "root%5Buser%5D@[::1]", "authority" );
+ is( $u->path_query() , "/path_with_square_%5Bbrackets%5D?par=value%5B1%5D&par%5B2%5D=value%5B2%5D", "path_query");
+ is( $u->query_keywords() , undef, "query_keywords");
+
+ my @segments = $u->path_segments();
+ is( join(" | ", @segments), " | path_with_square_[brackets]", "segments");
+}
+
+
+{ #-- form/query related tests
+ my $u = URI->new("http://root[user]@[::1]/path_with_square_[brackets]/segment[2]?par=value[1]&par[2]=value[2]#fragment[2]");
+
+ is( $u->query_form(), "4", "scalar: query_form");
+ is( join(" | ", $u->query_form()), "par | value[1] | par[2] | value[2]", "list: query_form");
+
+ $u->query_form( {} );
+ is( $u->query(), undef, "query removed");
+ is( join(" | ", $u->query_form()), "", "list: query_form");
+ is( $u->canonical(), "http://root%5Buser%5D@[::1]/path_with_square_%5Bbrackets%5D/segment%5B2%5D#fragment%5B2%5D", "query removed: canonical");
+
+ $u->query_form( key1 => 'val1', key2 => 'val[2]' );
+ is( $u->query(), "key1=val1&key2=val%5B2%5D", "query");
+}
+
+
+{ #-- path segments
+ my $u = URI->new("http://root[user]@[::1]/path_with_square_[brackets]/segment[2]?par=value[1]#fragment[2]");
+ my @segments = $u->path_segments();
+ is( join(" | ", @segments), " | path_with_square_[brackets] | segment[2]", "segments");
+}
+
+
+{ #-- rel
+ my $u = URI->new("http://root[user]@[::1]/oldbase/next/path_with_square_[brackets]/segment[2]?par=value[1]#fragment[2]");
+ #TODO: is userinfo@ optional?
+ is( $u->rel("http://root%5Buser%5D@[::1]/oldbase/next/")->canonical(),
+ "path_with_square_%5Bbrackets%5D/segment%5B2%5D?par=value%5B1%5D#fragment%5B2%5D",
+ "rel/canonical"
+ );
+}
+
+
+{ #-- various setters
+ my $ip6 = 'fedc:ba98:7654:3210:fedc:ba98:7654:3210';
+ my $u = URI->new("http://\[" . uc($ip6) . "\]/index.html");
+ is ($u->canonical(), "http://[$ip6]/index.html", "basic IPv6 URI");
+
+ $u->scheme("https");
+ is ($u->canonical(), "https://[$ip6]/index.html", "basic IPv6 URI");
+
+ $u->userinfo("user[42]"); #-- tolerate unescaped '[', ']'
+ is ($u->canonical(), "https://user%5B42%5D@[$ip6]/index.html", "userinfo added (unescaped)");
+ is ($u->userinfo(), "user%5B42%5D", "userinfo is escaped");
+
+ $u->userinfo("user%5B77%5D"); #-- already escaped
+ is ($u->canonical(), "https://user%5B77%5D@[$ip6]/index.html", "userinfo replaced (escaped)");
+ is ($u->userinfo(), "user%5B77%5D", "userinfo is escaped");
+
+ $u->userinfo( q(weird.al$!:secret*[1]++) );
+ is ($u->canonical(), "https://weird.al\$!:secret*%5B1%5D++@[$ip6]/index.html", "userinfo replaced (escaped2)");
+ is ($u->userinfo(), "weird.al\$!:secret*%5B1%5D++", "userinfo is escaped2");
+
+ $u->userinfo( q(j.doe@example.com:secret) );
+ is ($u->canonical(), "https://j.doe%40example.com:secret@[$ip6]/index.html", "userinfo replaced (escaped3)");
+ is ($u->userinfo() , "j.doe%40example.com:secret", "userinfo is escaped3");
+
+ $u->host("example.com");
+ is ($u->canonical(), "https://j.doe%40example.com:secret\@example.com/index.html", "hostname replaced");
+
+ $u->host("127.0.0.1");
+ is ($u->canonical(), "https://j.doe%40example.com:secret\@127.0.0.1/index.html", "hostname replaced");
+
+ for my $host ( qw(example.com 127.0.0.1)) {
+ $u->host( $host );
+ my $expect = "https://j.doe%40example.com:secret\@$host/index.html";
+ is ($u->canonical(), $expect, "host: $host");
+ is ($u->host(), $host, "same hosts ($host)");
+ }
+
+ for my $host6 ( $ip6, qw(::1) ) {
+ $u->host( $host6 );
+ my $expect = "https://j.doe%40example.com:secret\@[$host6]/index.html";
+ is ($u->canonical(), $expect, "IPv6 host: $host6");
+ is ($u->host(), $host6, "same IPv6 hosts ($host6)");
+ }
+
+ $u->host($ip6);
+ $u->path("/subdir/index[1].html");
+ is( $u->canonical(), "https://j.doe%40example.com:secret@[$ip6]/subdir/index%5B1%5D.html", "path replaced");
+
+ $u->fragment("fragment[xyz]");
+ is( $u->canonical(), "https://j.doe%40example.com:secret@[$ip6]/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "fragment added");
+
+ $u->authority("user[doe]@[::1]");
+ is( $u->canonical(), "https://user%5Bdoe%5D@[::1]/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+ $u->authority("::1");
+ is( $u->canonical(), "https://[::1]/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+ $u->authority("[::1]:19999");
+ is( $u->canonical(), "https://[::1]:19999/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+ # $u->authority("::1:18000"); #-- theoretically, we could guess an [::1]:18000 ... but for now it will just be ill formatted.
+ # is( $u->canonical(), "https://::1:18000/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+ $u->authority("user[abc]\@::1");
+ is( $u->canonical(), "https://user%5Babc%5D@[::1]/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+ $u->authority("user[xyz]\@example.com\@[::1]:22022");
+ is( $u->canonical(), "https://user%5Bxyz%5D%40example.com@[::1]:22022/subdir/index%5B1%5D.html#fragment%5Bxyz%5D", "authority replaced");
+
+}
+
+done_testing;
use Test::Needs 'Storable';
print "1..3\n";
-system($^X, "-Iblib/lib", "t/storable-test.pl", "store");
-system($^X, "-Iblib/lib", "t/storable-test.pl", "retrieve");
+my $inc = -d "blib/lib" ? "blib/lib" : "lib";
+system($^X, "-I$inc", "t/storable-test.pl", "store");
+system($^X, "-I$inc", "t/storable-test.pl", "retrieve");
unlink('urls.sto');
require URI;
+warn "Using: $INC{'URI.pm'}\n" if $INC{'URI.pm'} ne 'lib/URI.pm' and -t STDOUT and -t STDIN;
+
my @ctor_arg = ($uri);
push(@ctor_arg, shift) while @ARGV && $ARGV[0] =~ s/^\+//;
OpenLDAP
Parkhurst
Perl
+Perlbotics
Peter
Piotr
Punycode
nntps
oid
olaf
+perlbotix
piotr
pop
relativize
note 'Checking Changes';
my $changes_file = 'Changes';
-my $newver = '5.10';
+my $newver = '5.12';
my $trial_token = '-TRIAL';
my $encoding = 'UTF-8';