Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Mojolicious for
openSUSE:Factory checked in at 2026-06-10 16:14:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old)
and /work/SRC/openSUSE:Factory/.perl-Mojolicious.new.2375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojolicious"
Wed Jun 10 16:14:32 2026 rev:184 rq:1358525 version:9.460.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes
2026-05-13 17:23:19.221201375 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Mojolicious.new.2375/perl-Mojolicious.changes
2026-06-10 16:18:39.948152821 +0200
@@ -1,0 +2,12 @@
+Sun Jun 7 00:40:23 UTC 2026 - Tina Müller <[email protected]>
+
+- updated to 9.460.0 (9.46)
+ see /usr/share/doc/packages/perl-Mojolicious/Changes
+
+ 9.46 2026-06-04
+ - Added random_bytes function to Mojo::Util. (leont)
+ - Improved randomness for CSRF token generation. (leont)
+ - Fixed tls_options handling in Mojo::IOLoop::TLS. (krauro)
+ - Fixed spec compliance issue with attribute selectors in Mojo::DOM::CSS.
+
+-------------------------------------------------------------------
Old:
----
Mojolicious-9.45.tar.gz
New:
----
Mojolicious-9.46.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Mojolicious.spec ++++++
--- /var/tmp/diff_new_pack.yRbSgt/_old 2026-06-10 16:18:42.416255101 +0200
+++ /var/tmp/diff_new_pack.yRbSgt/_new 2026-06-10 16:18:42.440256096 +0200
@@ -18,10 +18,10 @@
%define cpan_name Mojolicious
Name: perl-Mojolicious
-Version: 9.450.0
+Version: 9.460.0
Release: 0
-# 9.45 -> normalize -> 9.450.0
-%define cpan_version 9.45
+# 9.46 -> normalize -> 9.460.0
+%define cpan_version 9.46
License: Artistic-2.0
Summary: Real-time web framework
URL: https://metacpan.org/release/%{cpan_name}
++++++ Mojolicious-9.45.tar.gz -> Mojolicious-9.46.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/Changes new/Mojolicious-9.46/Changes
--- old/Mojolicious-9.45/Changes 2026-05-05 20:30:05.000000000 +0200
+++ new/Mojolicious-9.46/Changes 2026-06-04 19:08:08.000000000 +0200
@@ -1,4 +1,10 @@
+9.46 2026-06-04
+ - Added random_bytes function to Mojo::Util. (leont)
+ - Improved randomness for CSRF token generation. (leont)
+ - Fixed tls_options handling in Mojo::IOLoop::TLS. (krauro)
+ - Fixed spec compliance issue with attribute selectors in Mojo::DOM::CSS.
+
9.45 2026-05-05
- Fixed portability issue in WebSocket tests.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/MANIFEST
new/Mojolicious-9.46/MANIFEST
--- old/Mojolicious-9.45/MANIFEST 2026-05-05 20:33:03.000000000 +0200
+++ new/Mojolicious-9.46/MANIFEST 2026-06-04 19:09:43.000000000 +0200
@@ -183,6 +183,8 @@
t/mojo/certs/client.key
t/mojo/certs/domain.crt
t/mojo/certs/domain.key
+t/mojo/certs/mojo_server.crt
+t/mojo/certs/mojo_server.key
t/mojo/certs/server.crt
t/mojo/certs/server.key
t/mojo/cgi.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/META.json
new/Mojolicious-9.46/META.json
--- old/Mojolicious-9.45/META.json 2026-05-05 20:33:03.000000000 +0200
+++ new/Mojolicious-9.46/META.json 2026-06-04 19:09:43.000000000 +0200
@@ -64,6 +64,6 @@
"web" : "https://web.libera.chat/#mojo"
}
},
- "version" : "9.45",
+ "version" : "9.46",
"x_serialization_backend" : "JSON::PP version 4.16"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/META.yml
new/Mojolicious-9.46/META.yml
--- old/Mojolicious-9.45/META.yml 2026-05-05 20:33:03.000000000 +0200
+++ new/Mojolicious-9.46/META.yml 2026-06-04 19:09:42.000000000 +0200
@@ -35,5 +35,5 @@
homepage: https://mojolicious.org
license: https://opensource.org/license/artistic-2-0
repository: https://github.com/mojolicious/mojo.git
-version: '9.45'
+version: '9.46'
x_serialization_backend: 'CPAN::Meta::YAML version 0.020'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/lib/Mojo/DOM/CSS.pm
new/Mojolicious-9.46/lib/Mojo/DOM/CSS.pm
--- old/Mojolicious-9.45/lib/Mojo/DOM/CSS.pm 2026-05-05 18:08:48.000000000
+0200
+++ new/Mojolicious-9.46/lib/Mojo/DOM/CSS.pm 2026-05-12 12:16:41.000000000
+0200
@@ -46,14 +46,14 @@
}
sub _attr {
- my ($name_re, $value_re, $current) = @_;
+ my ($name, $value_re, $current) = @_;
my $attrs = $current->[2];
- for my $name (keys %$attrs) {
- my $value = $attrs->{$name};
- next if $name !~ $name_re || (!defined $value && defined $value_re);
- return 1 if !(defined $value && defined $value_re) || $value =~ $value_re;
- }
+ return undef unless exists $attrs->{$name};
+
+ my $value = $attrs->{$name};
+ return undef if !defined $value && defined $value_re;
+ return 1 if !defined $value_re || $value =~ $value_re;
return undef;
}
@@ -84,11 +84,11 @@
# Class or ID
elsif ($css =~ /\G([.#])((?:$ESCAPE_RE\s?|[^,.#:[\s>~+])+)/gco) {
my ($name, $op) = $1 eq '.' ? ('class', '~') : ('id', '');
- push @$last, ['attr', _name($name), _value($op, $2)];
+ push @$last, ['attr', $name, _value($op, $2)];
}
# Attributes
- elsif ($css =~ /\G$ATTR_RE/gco) { push @$last, ['attr', _name($1),
_value($2 // '', $3 // $4 // $5, $6)] }
+ elsif ($css =~ /\G$ATTR_RE/gco) { push @$last, ['attr', _unescape($1),
_value($2 // '', $3 // $4 // $5, $6)] }
# Pseudo-class
elsif ($css =~ /\G:([\w\-]+)(?:\(((?:\([^)]+\)|[^)])+)\))?/gcs) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/lib/Mojo/IOLoop/TLS.pm
new/Mojolicious-9.46/lib/Mojo/IOLoop/TLS.pm
--- old/Mojolicious-9.45/lib/Mojo/IOLoop/TLS.pm 2023-04-27 22:33:00.000000000
+0200
+++ new/Mojolicious-9.46/lib/Mojo/IOLoop/TLS.pm 2026-06-04 18:58:27.000000000
+0200
@@ -58,8 +58,10 @@
$tls->{SSL_key_file} ||= $KEY;
}
else {
- $tls->{SSL_hostname} = IO::Socket::SSL->can_client_sni ?
$args->{address} : '';
- $tls->{SSL_verifycn_name} = $args->{address};
+ unless (exists $tls->{SSL_hostname}) {
+ $tls->{SSL_hostname} = IO::Socket::SSL->can_client_sni ?
$args->{address} : '';
+ }
+ $tls->{SSL_verifycn_name} ||= $args->{address};
}
return $tls;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/lib/Mojo/Util.pm
new/Mojolicious-9.46/lib/Mojo/Util.pm
--- old/Mojolicious-9.45/lib/Mojo/Util.pm 2026-02-12 12:07:38.000000000
+0100
+++ new/Mojolicious-9.46/lib/Mojo/Util.pm 2026-06-04 18:58:27.000000000
+0200
@@ -6,6 +6,7 @@
use Digest::MD5 qw(md5 md5_hex);
use Digest::SHA qw(hmac_sha1_hex sha1 sha1_hex);
use Encode qw(find_encoding);
+use Errno ();
use Exporter qw(import);
use File::Basename qw(dirname);
use Getopt::Long qw(GetOptionsFromArray);
@@ -13,7 +14,7 @@
use IO::Poll qw(POLLIN POLLPRI);
use IO::Uncompress::Gunzip;
use List::Util qw(min);
-use MIME::Base64 qw(decode_base64 encode_base64);
+use MIME::Base64 qw(decode_base64 encode_base64 encode_base64url);
use Mojo::BaseUtil qw(class_to_path monkey_patch);
use Pod::Usage qw(pod2usage);
use Socket qw(inet_pton AF_INET6 AF_INET);
@@ -31,6 +32,7 @@
CryptX->VERSION('0.080');
1;
});
+use constant WIN32_API => eval { require Win32::API };
# Check for monotonic clock support
use constant MONOTONIC => !!eval {
Time::HiRes::clock_gettime(Time::HiRes::CLOCK_MONOTONIC()) };
@@ -82,8 +84,8 @@
qw(b64_decode b64_encode camelize class_to_file class_to_path decamelize
decode decrypt_cookie deprecated dumper),
qw(encode encrypt_cookie extract_usage generate_secret getopt gunzip gzip
header_params hmac_sha1_sum),
qw(html_attr_unescape html_unescape humanize_bytes md5_bytes md5_sum
monkey_patch network_contains punycode_decode),
- qw(punycode_encode quote scope_guard secure_compare sha1_bytes sha1_sum
slugify split_cookie_header split_header),
- qw(steady_time tablify term_escape trim unindent unquote url_escape
url_unescape xml_escape xor_encode)
+ qw(punycode_encode quote random_bytes scope_guard secure_compare sha1_bytes
sha1_sum slugify split_cookie_header),
+ qw(split_header steady_time tablify term_escape trim unindent unquote
url_escape url_unescape xml_escape xor_encode)
);
# Aliases
@@ -176,9 +178,7 @@
}
sub generate_secret {
- return Crypt::Misc::encode_b64u(Crypt::PRNG::random_bytes(128)) if CRYPTX;
- srand;
- return sha1_sum($$ . steady_time() . rand);
+ return encode_base64url(random_bytes(128));
}
sub getopt {
@@ -344,6 +344,36 @@
return qq{"$str"};
}
+sub random_bytes {
+ my ($count) = @_;
+ croak 'Byte count must be a defined, non-negative integer' unless defined
$count && $count =~ /\A\d+\z/a;
+ if (CRYPTX) {
+ return Crypt::PRNG::random_bytes($count);
+ }
+ elsif (WIN32_API) {
+ state $genrand = Win32::API->new('advapi32', 'INT SystemFunction036(PVOID
RandomBuffer, ULONG RandomBufferLength)')
+ or die "Could not import SystemFunction036: $^E";
+ return '' if $count == 0;
+ my $buffer = chr(0) x $count;
+ $genrand->Call($buffer, $count) or croak("Could not read random bytes");
+ return $buffer;
+ }
+ elsif (-e '/dev/urandom') {
+ open my $fh, '<:raw', '/dev/urandom' or die "Couldn't open /dev/urandom:
$!";
+ my ($result, $offset) = ('', 0);
+ while ($offset < $count) {
+ my $read = sysread $fh, $result, $count - $offset, $offset;
+ next if not defined $read and $!{EINTR};
+ croak("Could not read random bytes") if not defined $read or $read == 0;
+ $offset += $read;
+ }
+ return $result;
+ }
+ else {
+ die "Can't find source of randomness on your system, consider installing
CryptX";
+ }
+}
+
sub scope_guard { Mojo::Util::_Guard->new(cb => shift) }
sub secure_compare {
@@ -726,8 +756,7 @@
my $secret = generate_secret;
-Generate a random secret with a cryptographically secure random number
generator if available, and a less secure
-fallback if not.
+Generate a random secret with a cryptographically secure random number
generator.
=head2 getopt
@@ -886,6 +915,12 @@
Quote string.
+=head2 random_bytes
+
+ my $random = random_bytes($bytes);
+
+Generate C<$bytes> worth of high entropy randomness.
+
=head2 scope_guard
my $guard = scope_guard sub {...};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Mojolicious-9.45/lib/Mojolicious/Guides/Contributing.pod
new/Mojolicious-9.46/lib/Mojolicious/Guides/Contributing.pod
--- old/Mojolicious-9.45/lib/Mojolicious/Guides/Contributing.pod
2024-07-20 16:51:55.000000000 +0200
+++ new/Mojolicious-9.46/lib/Mojolicious/Guides/Contributing.pod
2026-05-12 12:16:41.000000000 +0200
@@ -79,6 +79,9 @@
All code changes should emulate the style of the surrounding code, include
tests that fail without them, and update
relevant documentation.
+AI-assisted contributions are welcome, but we expect all contributions to be
submitted by a human who takes full
+responsibility for them.
+
While the L<Mojolicious> distribution covers a wide range of features, we are
rather conservative when it comes to
adding new ones. So if your contribution is not a simple bug fix, it is
B<strongly recommended> that you discuss it in
advance in the L<Forum|https://forum.mojolicious.org> or the official IRC
channel C<#mojo> on C<irc.libera.chat>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Mojolicious-9.45/lib/Mojolicious/Plugin/DefaultHelpers.pm
new/Mojolicious-9.46/lib/Mojolicious/Plugin/DefaultHelpers.pm
--- old/Mojolicious-9.45/lib/Mojolicious/Plugin/DefaultHelpers.pm
2023-08-15 16:57:23.000000000 +0200
+++ new/Mojolicious-9.46/lib/Mojolicious/Plugin/DefaultHelpers.pm
2026-06-04 18:58:27.000000000 +0200
@@ -8,7 +8,7 @@
use Mojo::Exception;
use Mojo::IOLoop;
use Mojo::Promise;
-use Mojo::Util qw(dumper hmac_sha1_sum steady_time);
+use Mojo::Util qw(dumper random_bytes);
use Time::HiRes qw(gettimeofday tv_interval);
use Scalar::Util qw(blessed weaken);
@@ -95,7 +95,7 @@
return (blessed $e && $e->isa('Mojo::Exception')) ? $e :
Mojo::Exception->new($e);
}
-sub _csrf_token { $_[0]->session->{csrf_token} ||= hmac_sha1_sum($$ .
steady_time . rand, $_[0]->app->secrets->[0]) }
+sub _csrf_token { $_[0]->session->{csrf_token} ||= unpack "H*",
random_bytes(20) }
sub _current_route {
return '' unless my $route = shift->match->endpoint;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/lib/Mojolicious.pm
new/Mojolicious-9.46/lib/Mojolicious.pm
--- old/Mojolicious-9.45/lib/Mojolicious.pm 2026-05-05 20:09:38.000000000
+0200
+++ new/Mojolicious-9.46/lib/Mojolicious.pm 2026-06-04 19:06:14.000000000
+0200
@@ -57,7 +57,7 @@
has validator => sub { Mojolicious::Validator->new };
our $CODENAME = 'Waffle';
-our $VERSION = '9.45';
+our $VERSION = '9.46';
sub BUILD_DYNAMIC {
my ($class, $method, $dyn_methods) = @_;
@@ -1042,6 +1042,8 @@
Leon Brocard
+Leon Timmermans
+
Lukas Mai
Magnus Holm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/bad.crt
new/Mojolicious-9.46/t/mojo/certs/bad.crt
--- old/Mojolicious-9.45/t/mojo/certs/bad.crt 2022-06-14 13:31:51.000000000
+0200
+++ new/Mojolicious-9.46/t/mojo/certs/bad.crt 2026-06-04 18:58:27.000000000
+0200
@@ -1,14 +1,19 @@
-----BEGIN CERTIFICATE-----
-MIICMDCCAZmgAwIBAgIJAL3i8FjIa505MA0GCSqGSIb3DQEBBQUAMBsxCzAJBgNV
-BAYTAlVTMQwwCgYDVQQDEwNiYWQwHhcNMTQxMjEyMDUwNDA3WhcNMzQxMjA3MDUw
-NDA3WjAbMQswCQYDVQQGEwJVUzEMMAoGA1UEAxMDYmFkMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDa3Y/PG8MEfLboJQ2pPKOTgXLCBDPPPii8L3AYMaqo6b9M
-S4ofj0qE6uiAne4ZMOoXl18U/9isZ5V8DKYTiNBDwTYyl9r6n+z+4uyINfxPhwhm
-q3eYK2/WRRNgGkaBX1Jn+woSQNj/Xq9hxu0oy5oUez+vDtg5vfgvQHZX48igbQID
-AQABo3wwejAdBgNVHQ4EFgQUG+9Mb16GLXdUYxAkv5T0VNIXAMgwSwYDVR0jBEQw
-QoAUG+9Mb16GLXdUYxAkv5T0VNIXAMihH6QdMBsxCzAJBgNVBAYTAlVTMQwwCgYD
-VQQDEwNiYWSCCQC94vBYyGudOTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA
-A4GBALxX+nkjDBh+Ir6QqBcdhiZ8i4rBhLUHaNDUFKq18WoxpTOtgwh7LUf+gT3D
-XeelteXWgd4Ta7+emaAMS0+lSceJGHJJGYqcgHecIrKWtBAXL3z5K1YTZJb6jpCb
-nAdXvj3b84/6AkrguWUeh/S0VMUtI11L984xCPbNizvnepAV
+MIIDFzCCAf+gAwIBAgIUFdHIH6LWHEoR1S1XjCeHzqMUaMowDQYJKoZIhvcNAQEL
+BQAwGzELMAkGA1UEBhMCVVMxDDAKBgNVBAMMA2JhZDAeFw0yNjA0MzAxMDAyNTda
+Fw00NjA0MjUxMDAyNTdaMBsxCzAJBgNVBAYTAlVTMQwwCgYDVQQDDANiYWQwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1L37L3BHAElsohU3l46Kfp0zO
++b/FQPQ0kMvyJZemYBbSPp+nlyo8Q66hTuGB4Hy/G8xLmH1rhXq8UQ8/XKNbllHM
+415uBn9kc66nK56e3TAmB0Ov79X1yQtvcXCjiWDWw9Nge5kQSyksOaYCSVBlKiyK
+i+pAQgAmJjoSE1JdirCxHxJ4gEVMBrPCxEZc741Vgbk0d7GRjDJBu/HPz/ot3YXp
+MrUdCo5wSOm7fPybl/wGVR84BjRZ7G3tmP331FZ7FMagClEdymMKF+aNpkkRCmA1
+D0NAnxGUZejuHO+c1RjNQuKtTVKQ96866UNDUJ8TU8CMop0M9pZz94OpnMpjAgMB
+AAGjUzBRMB0GA1UdDgQWBBRKrVvFdiieY9A/c4d3+MBLqDOH7jAfBgNVHSMEGDAW
+gBRKrVvFdiieY9A/c4d3+MBLqDOH7jAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQCYbw6YFeQaZ8oLxq/i21rc+GKlRGkV5tOZn/mRK6dBn3ahdiqd
+8Hvk6DtsTfObI0waVUyy2pvkya78MFdwkg1KjWhcmQ6uZnHs7T7yeKA0npsuU1Xj
+KCDj2vK+YcFmzq4H9bSYl35gJTlgzEE9E5mAThdrDUylthKI8rRk1IH8D7RP0rjK
+f+LkQc0QOAlp6JeQtu48p/Np21lIg1eUAK6H1Vq3o1Bexo8G1kbO9ZLXbMcq4I9n
+nxN/KYx19pe5HO0sB48bGIz/FO9sJCD5Zry2xxr2I0CwYkI/2PGwdbeQvto/OVOX
+GaYQGFapY8X19NxwpBFa1CLxREFkwL/fKsgt
-----END CERTIFICATE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/bad.key
new/Mojolicious-9.46/t/mojo/certs/bad.key
--- old/Mojolicious-9.45/t/mojo/certs/bad.key 2022-06-14 13:31:51.000000000
+0200
+++ new/Mojolicious-9.46/t/mojo/certs/bad.key 2026-06-04 18:58:27.000000000
+0200
@@ -1,15 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQDa3Y/PG8MEfLboJQ2pPKOTgXLCBDPPPii8L3AYMaqo6b9MS4of
-j0qE6uiAne4ZMOoXl18U/9isZ5V8DKYTiNBDwTYyl9r6n+z+4uyINfxPhwhmq3eY
-K2/WRRNgGkaBX1Jn+woSQNj/Xq9hxu0oy5oUez+vDtg5vfgvQHZX48igbQIDAQAB
-AoGAJuHz2YyKEfMCH63thmJygRMfSx6qAah+XihjVrkEI6wbQzesWzz+tSxyj97+
-3NTW0cgfqUBmwwJICVjJ7HCC5yJQMvgAVv8MdPjuabZOEVthhHJJKe9CtVlkQC+F
-5gybqf7m5EIWosd9ROjhBes4FaPLDG3ujOO27KEzY9CJmpUCQQD9aAn8qe7TVXnj
-on9q6lu5aNB1lQ1G2h1yOkZDauY1TDec8/Vk6MjLmWIKu0GAATQAnGohNPGxVwZP
-WdchXbAHAkEA3RsFRJkigPHudmimE2RH5Tf8UxfE89R7lhsBs7hTXSxeLUx2U5iv
-G2g5KcKKnOJ+di5hB1dzW9q8zgTYGGEm6wJBAJqNcMHkVuAYGt5GRpZL16OulK2S
-OeXDs//uINqPgVZyZNzaQgnInGbo5s4KxXkvwqq4u1YDd4GkxRlyfu4/uNMCQEST
-KtEZxY/EeTcUQd3lzj6TXJjQ2G7fSe1GNwLsej59kj/uZQyMYFLZwlDnW2JJBPvW
-apWCU+77Km+jJPp6tz0CQQDleMOZi70ikb04E0kagpJiRtNOLThDKjY6r6ZZWPro
-saqxw29J/bAReUYXAcW5EzwRG97R/2u1HY77Y43YA3v0
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1L37L3BHAElso
+hU3l46Kfp0zO+b/FQPQ0kMvyJZemYBbSPp+nlyo8Q66hTuGB4Hy/G8xLmH1rhXq8
+UQ8/XKNbllHM415uBn9kc66nK56e3TAmB0Ov79X1yQtvcXCjiWDWw9Nge5kQSyks
+OaYCSVBlKiyKi+pAQgAmJjoSE1JdirCxHxJ4gEVMBrPCxEZc741Vgbk0d7GRjDJB
+u/HPz/ot3YXpMrUdCo5wSOm7fPybl/wGVR84BjRZ7G3tmP331FZ7FMagClEdymMK
+F+aNpkkRCmA1D0NAnxGUZejuHO+c1RjNQuKtTVKQ96866UNDUJ8TU8CMop0M9pZz
+94OpnMpjAgMBAAECggEADWTKGMPXRBLso4gx2VFZ5OIh2W248W9Qc3pTY+kc1shk
+/NHITO6YdAVaKW6Crm6BNOzBzhd4XgnAqEnNuL9eYWzb9dYbqu0sCamg5Za3ORiH
+cKg6JrgHYbik8cNkXOfQ6CS9wXTMPITHMbppPTiyNWhIC/iKg97dJ/TMzNKaKh6b
+Q034p3mZjqhT529oOZphIcnDka4QpVxJoD6lMBnqQXezplfsUp9xiopXWQjYT1VZ
+/nGPreU4NKgGVvJIbNcdg4vx0kOGY9gV3NkESmU576k9Ejn+Sz8om/bE7bJeRNXS
+HTibnge2AyCjMabW3J+1jolHskxg15FWMOCfmI+8sQKBgQDnbcZhpZ4UWN5T8Sug
+9oHsP9LOpx1W977De+QNssak14GLJUFcjlaRLH4lprQIYOOzChZmYO6ebcjIUJdk
+0nyCtzh0IO1FbVehn7WEcTAlFJWQ8DA/nQVBt3RoQJc+u1ohQO15xqaUIXHCw/ka
+mVjNINlHJMEBwJEeacxra2y9pQKBgQDIbBw09QF9RlYkA7n9T3aJylGqyLskfHGT
+u9wK7iASVOHJMpSXX/fdUGjowENwtvhqdmcxNPY4OSKJl1Y/m6mAap9FT3Mbkzgm
+7YaklO4/6PvViFiy1ODNsKji50MuyqXlCKY/lJIrLLJvP/sochoWT66ZWCpuvPmL
+Oj8UPBv5ZwKBgDdPbh1CRtCYGLK5LfMvVwfOjSRknkd9uHLh9jQr6PvWoZhO1Bs5
+zYiuuItpFxf1iBXvMEFRo1Xr6ROu5y/qemWHQo/Gms5//nSbRfecUaRbEg/sx6s8
+bNgy7zhHT55ninfuG5OCHafDgnvI+I0Z3zZPRn6RUyuHCWfaY0e9CeUdAoGAX5a4
+aUWFXVNjmC+y0C7LEXLOOo8cOo2juds6WngyEawsN8KI/h2GYSaNspyoTaTmnBg2
+pVBmMnCFmWv1dcbvM9Emf28iLj+r410b/3kMnKypF7G85CYFxfSAyB+WekWqk67p
+Y5+fizn5LHgueJ7a9FMyqe5T5pb4yb+RADye9vcCgYEAjj68g8cgqLmu9VXTA4W3
+eVWxEHpPv6Ljr3gjRyvG1lQs2J43WzvnP98qLLdZdkrQTiIanEE+tu17GiZW2H9a
+wkAUZJx01JO2Vzt2lTUQYgPJxOHpmy5HEGpxrQVKvERwYrBOBGpiTBK/STTNXlI4
+qPKNO7zaSx/Sf0XP+uoVVvQ=
+-----END PRIVATE KEY-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/ca.crt
new/Mojolicious-9.46/t/mojo/certs/ca.crt
--- old/Mojolicious-9.45/t/mojo/certs/ca.crt 2022-06-14 13:31:51.000000000
+0200
+++ new/Mojolicious-9.46/t/mojo/certs/ca.crt 2026-06-04 18:58:27.000000000
+0200
@@ -1,14 +1,19 @@
-----BEGIN CERTIFICATE-----
-MIICLTCCAZagAwIBAgIJALx7JaBkhvU1MA0GCSqGSIb3DQEBBQUAMBoxCzAJBgNV
-BAYTAlVTMQswCQYDVQQDEwJjYTAeFw0xNDEyMTIwNTAzMDFaFw0zNDEyMDcwNTAz
-MDFaMBoxCzAJBgNVBAYTAlVTMQswCQYDVQQDEwJjYTCBnzANBgkqhkiG9w0BAQEF
-AAOBjQAwgYkCgYEAozbnJr3IvXwQeQV7n63p8XgXSpLgGmOsldyyIOBNy9zhoN7e
-ZFvzNysr80+4a2+o3vRzXptGYuFjocBRruWm7Z42HLOKiiI/X317whfvm4dqsa9s
-Bo4WN+2Ptsz31X+v/XnD6oZS5nLCeQ/WNuzd6Am9V0Y6Z//NReGOA3lotPkCAwEA
-AaN7MHkwHQYDVR0OBBYEFPW1qzZDKPG4QYd7GN8rHWpVCdaLMEoGA1UdIwRDMEGA
-FPW1qzZDKPG4QYd7GN8rHWpVCdaLoR6kHDAaMQswCQYDVQQGEwJVUzELMAkGA1UE
-AxMCY2GCCQC8eyWgZIb1NTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GB
-ABHz4htmRT6rG6tcSZ4dfpFZpd0Njj2pikkeymDK6s7vmfKVdY7NK0kisoHG88ms
-y2mzRwbUSshuYfjghqZdizwf5bdprNSHRPfeey44pNTV8aVeKK13IxHGZk49hWHX
-cq59GdoKy+AX9n0NI58u2GUrdwmM7Q8Qo8gVvfY19NFW
+MIIDFTCCAf2gAwIBAgIUIg/ZSQVaHJEy3HxHEd+BjHU9J8swDQYJKoZIhvcNAQEL
+BQAwGjELMAkGA1UEBhMCVVMxCzAJBgNVBAMMAmNhMB4XDTI2MDQzMDEwMDI1N1oX
+DTQ2MDQyNTEwMDI1N1owGjELMAkGA1UEBhMCVVMxCzAJBgNVBAMMAmNhMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7wUSbjig3L9r0q4cJkUjNiAt9r4D
+K/hnr0CLG2Bl0z+MmB6iFvdGA38Lj6mSLM4Z1SW9xgCl+YDNAPcy1AWitIxcyk2A
+z+P7enALMAZMA9LyXU8M8bw6Ki1doEm0Zeqfy56oEKZzzsboY7jGs7yl8Zmwi40R
+Ds73ZD7L5gQYproNgaytImqu7EwgLp9E4HgIO7Ggo015YjEv6DYGMvKQ6um0XOTr
+tkixY9L8BxoQf8F219HRNZ3eXIUAp0zhzDTFiuW7Ro1RMHZpg4Sp6GzPHz00rLko
+ed1hyKkk8QX1SP4tLv+Fxqz3YjXdURbDs1uxEDH/0Gjok3ExbkN6t/ifOwIDAQAB
+o1MwUTAdBgNVHQ4EFgQUoYCDs6x/u8Gf7SNVODzpcqImZVAwHwYDVR0jBBgwFoAU
+oYCDs6x/u8Gf7SNVODzpcqImZVAwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
+AQsFAAOCAQEAY+OJclo9n8oHmnlFEqi2+j9JyTs+n7JHbZiAulRXOe+RsDWISCoV
+Qf4PTSjj7Xq+Z2emb5ir4ubyVVXz9hudZJ755Txp2tGYRe4AxI9Pif9VMiEgxYi7
+6iOxFlCNGnaxF1lk8xx1kMgC/gFA/iGjz8ZFrf7VL25gqVSruI8UBKxauOjMzYiP
+xLC7MC9LunNs/OmOvr7+BAvMfvEkgSy6LgKmiyya/BH1TzrXCajW+qofUhRAdcQd
+o2sbMABLVijI91zeldS5sCicLhF5dfBUU/i9Ke3372U7kIUoLjOlGanYhvkq1NwJ
+Hm0jU2TXdODUlaJgxV2VSiwxi3gPj7f+hQ==
-----END CERTIFICATE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/ca.key
new/Mojolicious-9.46/t/mojo/certs/ca.key
--- old/Mojolicious-9.45/t/mojo/certs/ca.key 2022-06-14 13:31:51.000000000
+0200
+++ new/Mojolicious-9.46/t/mojo/certs/ca.key 2026-06-04 18:58:27.000000000
+0200
@@ -1,15 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQCjNucmvci9fBB5BXufrenxeBdKkuAaY6yV3LIg4E3L3OGg3t5k
-W/M3KyvzT7hrb6je9HNem0Zi4WOhwFGu5abtnjYcs4qKIj9ffXvCF++bh2qxr2wG
-jhY37Y+2zPfVf6/9ecPqhlLmcsJ5D9Y27N3oCb1XRjpn/81F4Y4DeWi0+QIDAQAB
-AoGAD3Sdgv+pyLe835jzUfWoF6OloPwzmIwjxbU2cQKMm2d5PkCckqhaabj+2nWM
-IzBZr3M6kZTmn2p0gtaxZXx9yA/iSc/H5agWtmP2L5+XLVFY2U+GlLtlF8BPCzf8
-GoUHfq4phHyJ0tqzduVxO6p9UgdLhud0E07KuiF/lw0a5uECQQDOSIoMezNkOKkt
-Ilza9RZR4R2S1NB23RfASddKyQK91sXC7uBiKvQO+GWzlJnbpTOEjpxTi0zMaYBS
-9OpODiCVAkEAyo0POddC8VOVSSXZfbVuATmbr7Gu9JR9Qy9zzXObrrUtQDAX/8Kp
-MKAujFlT+6XqM/AFfP9ZH4FvFj2qLVX11QJAX/hLkYb339akjoUAIjYIDkvnUFqG
-KeaumB1Cdl6SUfPLyecMqV9GcHiMCEJIWnG/SBp5DD0wm6ExvGaJY4sbCQJBAJNE
-Bfr24GwXaiX5x+yXGbj4SpJuLJcU0xIjER4iXOGkRpcxoHFK9bot7EoMtHv1gJds
-foEIIqM+dycDhJRbuFUCQQCRnWBGk+Ess3FIilnfS0wfHzuY0DvMgyiF+qu+EWuD
-254B3GxDGf2PMDa59DSY+zIzj/vfIhQqYdjiJbJpoXGK
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDvBRJuOKDcv2vS
+rhwmRSM2IC32vgMr+GevQIsbYGXTP4yYHqIW90YDfwuPqZIszhnVJb3GAKX5gM0A
+9zLUBaK0jFzKTYDP4/t6cAswBkwD0vJdTwzxvDoqLV2gSbRl6p/LnqgQpnPOxuhj
+uMazvKXxmbCLjREOzvdkPsvmBBimug2BrK0iaq7sTCAun0TgeAg7saCjTXliMS/o
+NgYy8pDq6bRc5Ou2SLFj0vwHGhB/wXbX0dE1nd5chQCnTOHMNMWK5btGjVEwdmmD
+hKnobM8fPTSsuSh53WHIqSTxBfVI/i0u/4XGrPdiNd1RFsOzW7EQMf/QaOiTcTFu
+Q3q3+J87AgMBAAECggEAA7HrPo3lJ8rdgAy+d1NjwaDIQewJqXKvsci92YPC2eJO
+4cR5EJsGICAcdmBJ+gGbyDmxeJyZ0h53rvqayfNdr4xxiwudJOZkwILvTqyNckfS
+FeH9KfjZad/Fh6AVqi8CJ2PhxJPcCHShiENBVPxAu62c486XNHMzS/9+7BwcgGFu
+jSryO8eFAPj3U1eG4EYwjsyglE6D++FHdxIy3olgPyg0iO08iKC+iUJOOXGqfHVi
+4cgwL0wZyF3Hxe7/V84TNRJfGJs/0GnraFlE+t9IJLHRoUqOgxoVaOhB48dnoipp
+NUZt8+JQNoskM3pFYf8lZx+Ss3lb7nA5HswFgP5heQKBgQD3+4/jXtTmosteB8iw
+dwADTGRPVmGC9YmscuoZNXyCYUeaYkLq9NRqBazM8U5rv0ZIrKjcTNzcuzh7vsS0
+sPPQR93b4Y8nFPNFWT45EH5UBVvbJZ9Bl/p+8fMwxzCyDp91qFVS1VT+V/2ZLBk8
+pruT/WHwFd+AvafGgaCGP5SDlwKBgQD2v1Qbs77SdJFGnR0SxPCS7XyKbFTRwMgF
+r5luBovXloHAesiDYC+TSg8RWU5UyfJkxczWYWm6EhJRECBJtZqW6D0/QCYZjKEW
+SLqkSY4jTwUy8NOSRRK/2mIH1Gcfwk0nW6HR3hbod2xiEvKQD7WTJHS8d3W6kEtF
+zw3HsPhl/QKBgQDkNkY84NDdT4QIjPFMNLd2UZ8exEgI1R5V7Ysyl951vkC++x7K
+S3YP/BkCoi+hSO3Ng9gCpVm8aS+Z8f3kq9Q1IW4zJGkxdj5K284/hcY8XJIkI4Nk
+QhDtMoyznxxZQMvO45NiH6GQUDm59LNk9aw6jTzMTdTaDa+RJ0orQefTEQKBgQCB
+TEUgtxHZamfuHsprWXPPKk9GofnYaDLod9nog9mnwSCA4lZMMYz8m6RFrQyU9bXl
+BJmQBT/H10xt2gtxVI6LYWsmx9CvNrf622WiTUEEU5Yf2X6keTmX+zG/dJgNVl3j
+r+qd9MkATAQpaFBfGTxGvKXHVLoGZzJqhFNuPtgLaQKBgQDAV0TxIYELMxg921cj
+m785Hw7KQh+Oiyl+kay/+0IcLW40Au7xXm5C9wXjRziil0hVx8Nt0502TBfAzKCc
+k9y83UlPgwqQB/Kqo2PP9rDCLleuXPQFN4ZZjX9axKIrC47c3mndp7eJPXj1ZwRE
+bCrDc0NTASDu6dOytWOGLzLwJQ==
+-----END PRIVATE KEY-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/client.crt
new/Mojolicious-9.46/t/mojo/certs/client.crt
--- old/Mojolicious-9.45/t/mojo/certs/client.crt 2022-06-14
13:31:51.000000000 +0200
+++ new/Mojolicious-9.46/t/mojo/certs/client.crt 2026-06-04
18:58:27.000000000 +0200
@@ -1,12 +1,19 @@
-----BEGIN CERTIFICATE-----
-MIIBsjCCARsCCQCptEBZlSnk3zANBgkqhkiG9w0BAQUFADAaMQswCQYDVQQGEwJV
-UzELMAkGA1UEAxMCY2EwHhcNMTQxMjEyMDUwMzQ5WhcNMzQxMjA3MDUwMzQ5WjAh
-MQswCQYDVQQGEwJVUzESMBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQC74ZFnrU3GHG/XdPih2bdMLXKlKL86dTsdt5y4dWHP2yFS
-2hyDNC8Oy5qlrL5GjbTbqpX65IkjYa8IfWbvn036DofU2vCYnQQZW25Egmrek+K1
-J3hR8sxHyOFsGBcV7UDgzuQD8UtDzfalQ0DvmqTUgNl00gT3B8tV/eHmL8XPlQID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAHZ/un7lY0QzL7NSpF4xr5ThtNQyxkGDb63B
-etmaRrmTyH1dhZ7haXrYC12biE9r5H4mMo01SdOIkwpbN3zabGxKJM5bB627hXW3
-+DAsS/a3riKU5lQHByADwXhblbFFOMEUiDqb80ukhemRtE3fE+qV9jeLYhc/EO9c
-nmX6gNkZ
+MIIDCzCCAfOgAwIBAgIUBKV+XGuJKjGEShXmaq6DWtOLPaswDQYJKoZIhvcNAQEL
+BQAwGjELMAkGA1UEBhMCVVMxCzAJBgNVBAMMAmNhMB4XDTI2MDQzMDEwMDI1N1oX
+DTQ2MDQyNTEwMDI1N1owITELMAkGA1UEBhMCVVMxEjAQBgNVBAMMCTEyNy4wLjAu
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMLXRH0zTttakBbX67JI
+HwK83Vx/qHoce29+vwtJiuHOVMO2TjqVEiZAABgX4x4UhHdYraVgg6hdrtC0k+hJ
+kwik/FV4i+H5qBvcjhctJHo1f++Vodnr/Qnrs5/X2VEZ76iUG62TAPYAC9oCzu9r
+e4awP8AXcUGmlc1Xvdgk50GuTJT+bP2JAPUCiGucu50ODIw2xE8cHyaWdttFXO+3
+sGquIpPfLX4GXZTAuORQ6EggRXHbwoHNfPhWnJxAusOABSSw3pvv3h8e/sF3MKEw
+auTBeRLTo38wYyRAjuYpujTJS+6c2AfRPa1EpUpVvfFBL7ZUqcQJcWqDzsXDaze1
+gwsCAwEAAaNCMEAwHQYDVR0OBBYEFGLQttOWI5XAJmG7Vu83Wpn5re2XMB8GA1Ud
+IwQYMBaAFKGAg7Osf7vBn+0jVTg86XKiJmVQMA0GCSqGSIb3DQEBCwUAA4IBAQAt
+f5jsoEDgCADarUZu4miMHLmAxQhYlJ0gEYRmdSQqyY7sL3G7iBxzmrcf6N0sPK4G
+oiypKY8JqAXUKLQKYztR3IPfRfUdSBmBxM0sD8mT17/M9n9cNf+OjR8AjOQ2G/Ng
+D7erGGoQTdcVdrYR8ciXaMzYbwiHaS2eZJ3UPIygTaiTI2JttA/ht6Kb8GEL1RRj
+o6bLsfMOB8eVBEi0E/VplOtmD83WlmKImzWAzlQyoPjQHw35imZnyhNOSvzhSeGs
+0Y6aMfawFiD8UhbG0gRq/Mqr0y0lxvVHWzOFlS1jZz3i97d5ukMoz6bWIYpyUVrN
+T08l6cBCy3MaqmxjRejY
-----END CERTIFICATE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/client.key
new/Mojolicious-9.46/t/mojo/certs/client.key
--- old/Mojolicious-9.45/t/mojo/certs/client.key 2022-06-14
13:31:51.000000000 +0200
+++ new/Mojolicious-9.46/t/mojo/certs/client.key 2026-06-04
18:58:27.000000000 +0200
@@ -1,15 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQC74ZFnrU3GHG/XdPih2bdMLXKlKL86dTsdt5y4dWHP2yFS2hyD
-NC8Oy5qlrL5GjbTbqpX65IkjYa8IfWbvn036DofU2vCYnQQZW25Egmrek+K1J3hR
-8sxHyOFsGBcV7UDgzuQD8UtDzfalQ0DvmqTUgNl00gT3B8tV/eHmL8XPlQIDAQAB
-AoGAaeEbtWa4Dq5V5QD5YRS1tItkMWk+Iy6PqxafjmAwSBgAtpVOPi55WogpVbZ8
-4HvZcXW34dVK55KUNl+dU+rd4NaDpka8RBjY99c1sJz7CmtPh9G3HHvcq0LIHZ+o
-zDDLOwY5501czxJ+H6nwf3tmiZlGVqd7D4UQsG3ZWSBdVH0CQQDv2zYFX3H2sMZV
-ntLvL00XizzNinQTK5Znnjpb4ZpAQFJcGTZa0jahc/8cTQRqcGfJATg4lLEcs+Jy
-C1Kroe+zAkEAyIbPi8ONBRJA+pWoPvSRBNRhmboWVJ9424t8mLzXhwyo+NOYb3f8
-6Rm2YNfkUB/DEJTwhxmRPeL2fCPT4HpflwJAc805KqTnJ7w3NXVFz7bdmIVf6Lh0
-zCCaMBLDiELGr0ieutptVLHzMEYJoAdLH3x/jxsooqCfVgU/SeJPmo/HYwJARaPL
-4FYBW4mDV4Mx8usskejQHHsr1ier6VL/6mtqzlPvOrsBbXTWOH3dgLR5bfoZ3GBd
-SA3xCvUPdP1cT9Ev8QJBANIsQHxb4VsyRvz5La0oNwrjzp9BrV8t7xf4Sz46T/6m
-uVl7tyb/M2x6qpYmz1u9D3hUDSysssd0eJbtCbfuU/0=
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDC10R9M07bWpAW
+1+uySB8CvN1cf6h6HHtvfr8LSYrhzlTDtk46lRImQAAYF+MeFIR3WK2lYIOoXa7Q
+tJPoSZMIpPxVeIvh+agb3I4XLSR6NX/vlaHZ6/0J67Of19lRGe+olButkwD2AAva
+As7va3uGsD/AF3FBppXNV73YJOdBrkyU/mz9iQD1AohrnLudDgyMNsRPHB8mlnbb
+RVzvt7BqriKT3y1+Bl2UwLjkUOhIIEVx28KBzXz4VpycQLrDgAUksN6b794fHv7B
+dzChMGrkwXkS06N/MGMkQI7mKbo0yUvunNgH0T2tRKVKVb3xQS+2VKnECXFqg87F
+w2s3tYMLAgMBAAECggEAJSydTKX1bbShuToJJkLMZ+FQ+s0AgAvfIS61lJm7fcm4
+Mn8d/d9jTxj266HjG2IexAaPWvZHKGB3ciqB7dfbzdJssoIFbmALywURtypNw2Nh
+vXx3HPUBmlr2MpEkTWz9ZNSdU0iw7j6kBDx07wk60D/gae4PFc+K1VrgRdUEqmsZ
+s+qwypPMkf0WtWSU+aPlLgPgeT6kSj/DCIBqh+Nl17Ud/pXID4KWY8Hi562aN2sP
+ZVN76+8UokntSrHVQU8hfER8HL8D3T4DnpjXLv7Iy/ZUa1hxJ2iNQ2CTNPTHQdkX
+ZE8o2FkSniH1ufK5KhsJlMH9R/DdYacWi9lwrN+UwQKBgQDpMIrEeu/lp5c29Z1/
+rDk8FUn1usBUTFjcXj+0aMP2m19X0kSNLEWxZdzW2A5nJiTxGMmB/atKkZmdgfEG
+7JBzNv4xXESckWFtuznDmOHpA6NP5zfdLrzphZuw32P768kRv9UP3VGgQe5sba21
+41/MuRvH6yMgwPIzocuOmUX61wKBgQDV5mjAeqRs6fdXolDqaTKGZLkUvVLVpO09
+Sa+blOqZpNOBy4SK6yrZlhIZNlfCDbpUgPn8ZHYLZE+YUDciqNJbzxx5y1DVM/JJ
+2J2dWmfmD6bAecynsGVLL/fF1iC5EnPV/3m2ppw3j0a/QGTQmFvTBihMRQmVkL7O
+rGdO+ibG7QKBgQDKA2KEGliPZKNsWlWKUGH4+hxrg9Cwdr+YkRGxMf1qO2nag+8d
+OdhaeXtaqCu6EmJ4d1fChEaLQB2LRRHQRMpS9bY6fst1s8BqtoKxP1WebqdhRlaw
+B5hi2XtqO+y7RqWW+dATgVEAe32Yc1/ErejFSyuVAtAYxO5N6oGU1JW6WwKBgQDL
+mkxvms3UVkh4BCsdVhEf19RMp4GnlxuzUOZ1I6TDpx8k10JMsVjSUITdttqF/mc0
+dKh/1GiAo3UYOJKizSue9F/Ylu1UY+Pm4uf0lc98L728TLO/kqp4jSo+CHqRb70P
+H+UNNT5RrHHdLkBIRh5xmdTV9IkQ8vyM4ZJcnMQ4aQKBgQCISG8EnnzNZXISelQh
+P0KpyfN0W+yMcCyKobWCqDHZmCeQi0Ft1Rh7yM/hOaVd1+lX8n/59wR6KTqVXBuw
+xwHudqDyuseZ3y/Em12TUVSinGQGPfzm2HVSX93DkOn5sCeqfhelgOTlq7MVQVGY
+Wghpr7XZza0irL2OV81pkcB9+Q==
+-----END PRIVATE KEY-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/mojo_server.crt
new/Mojolicious-9.46/t/mojo/certs/mojo_server.crt
--- old/Mojolicious-9.45/t/mojo/certs/mojo_server.crt 1970-01-01
01:00:00.000000000 +0100
+++ new/Mojolicious-9.46/t/mojo/certs/mojo_server.crt 2026-06-04
18:58:27.000000000 +0200
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDETCCAfmgAwIBAgIUBKV+XGuJKjGEShXmaq6DWtOLPaowDQYJKoZIhvcNAQEL
+BQAwGjELMAkGA1UEBhMCVVMxCzAJBgNVBAMMAmNhMB4XDTI2MDQzMDEwMDI1N1oX
+DTQ2MDQyNTEwMDI1N1owJzELMAkGA1UEBhMCVVMxGDAWBgNVBAMMD21vam9saWNp
+b3VzLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMzLXrlSPAUc
+LLEantrj9NpCVzHbNtuwrDtpUPNlAts48JUQIERHM+2KFd53TW7jVNSICt4MZfkb
+m0Y26OAJcKaEU7J9vyTkvTY3Uja5oqz4NtU9jXv7E9GZSSOhuy2kFlE/nopEBbmQ
+l/Xc7raFAWUtkRiJYeuvWBWTtwN4y2d2L6LeY9/Gf2GKjKV4kzwUuGkmzVlPShpB
+BeTdXMRp/22XwR1TduBlG0Oy6jYiQvvzs5k1Ls2/xd01hkGrXkXXqW0ERnzDweZO
+Z20S0o1zr2gWMtcngyVNo+/CS8lq5XWIBgn8HZoxw0/MkE8bd5MHhnMuIDDD6Gul
+lVuYsKECKncCAwEAAaNCMEAwHQYDVR0OBBYEFPW8pQtI/q1mdYNobVOxPj1lHW5i
+MB8GA1UdIwQYMBaAFKGAg7Osf7vBn+0jVTg86XKiJmVQMA0GCSqGSIb3DQEBCwUA
+A4IBAQAlZvaDY/blOQ0WJjzzM1o1yHRfTXN8BoS7gfoFEfVH+MDGq+wanC6d1E+I
+5Vk7qTGNQC75mUG9zxIHULmxuC0PsKgWNmE2rNe7AjZa4y03EhFO+ZcGN/MEFHsP
+SOO0zTuYqQn5LTJ/zaIuT6+U0bRZGblE4EjMJoc3k+Z4AwMhYBKlZYjWCZLBJgw8
+OHp9xn75bKBwI17zX4dkt8plwoe//Do4Zs2PhpvuO7JxFTLBqZew1z4qjW4RT0SD
+MGeX9thra7SCT0lZbmiJ/YtOFYbqlH5zTdBRWc20J6IgIsDztS7XMLvBScHPTdiY
+P3trLF7pmp43j3XcIu+tTnvsmakX
+-----END CERTIFICATE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/mojo_server.key
new/Mojolicious-9.46/t/mojo/certs/mojo_server.key
--- old/Mojolicious-9.45/t/mojo/certs/mojo_server.key 1970-01-01
01:00:00.000000000 +0100
+++ new/Mojolicious-9.46/t/mojo/certs/mojo_server.key 2026-06-04
18:58:27.000000000 +0200
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMy165UjwFHCyx
+Gp7a4/TaQlcx2zbbsKw7aVDzZQLbOPCVECBERzPtihXed01u41TUiAreDGX5G5tG
+NujgCXCmhFOyfb8k5L02N1I2uaKs+DbVPY17+xPRmUkjobstpBZRP56KRAW5kJf1
+3O62hQFlLZEYiWHrr1gVk7cDeMtndi+i3mPfxn9hioyleJM8FLhpJs1ZT0oaQQXk
+3VzEaf9tl8EdU3bgZRtDsuo2IkL787OZNS7Nv8XdNYZBq15F16ltBEZ8w8HmTmdt
+EtKNc69oFjLXJ4MlTaPvwkvJauV1iAYJ/B2aMcNPzJBPG3eTB4ZzLiAww+hrpZVb
+mLChAip3AgMBAAECggEAXvFdvc7ZEoloUscDpHkQN+uPnwaBHUJ/5p9Br0VCGL4C
+EylBvEXCVjqxPszScjkkR8+2MhFPaTiaOOgV+F+IATrRzqsrZYBCFBN7ovFW8Je2
+XA/IOxVAr+g/lyxQqa0rx4kWCAXXHZtiR9KgPK/W4MBKRzTR18EXthEgRJTIv/Kf
+VvsuydlBOmy0DhA0PUSqe8jCJ2a4qK63EduPJxbuIlZUV7+uXB/6sfYI/LrSbenN
+0ToI0rOcDlO/TRpCeyHSWr/WXBABe9r0ntyGL8KjvAY3KmszsQohkGdfA8IPqdnd
+j+z70gNVTujvFMjg+DaL2S2IRfEmJWIdy4iQZXkPQQKBgQDt7SAg6AMDQg+4gkVD
+BmtBYC1FSt/M1W+i6TGcSd0b4Y0ZqY3DrYr9Z5/NbMO/VbQVH/vgsJ3coWJ4ZEIk
+aMLJQCp8RiV387VuQhl0yK4TOR0t50m9KLnpISJzBKP+16F+sW2jajUE/W9qCQGJ
+WhiG6RiItmGSnkgpYPXEu5XzIQKBgQDcWfCqnOZZmvW/g2DcRoohtBu/v9UlSsFD
+BxuYassgyqqaZEKelRocoUgtqC6FDwmrz66Owiw1mvhGHdaP8Bq4FKIrplUbQvvr
+5hnFeHYTO+PNNkkmgHEYQLW1RRNPgF9GXBllH4FUHOilg4ALYhj3ZwWC9ROYfNZy
+rjQJ+/mClwKBgQDaSwJ8ToJdHeJQle04No53d+dxOOYnB/iaDrw+uaJNL18HGYKA
+8xufrdB3aIAcb2R/MU4mc8USpVs0PEBXKWr1vJJ+XNmJuadPlwPGG01jQ7aa5CbK
+j7AqzgTOZIaWjX6VP/LoyMwGXQQ41DR9sZTpSroAzNyu6dwpYtV6/+TvIQKBgFA/
+JOlNaIo7Z8HOG6k8uzNY/z4Oo5YIKme5n/Aa/Ey94fGGD8jm7fJ9Peb6t65XcqMy
+aBSvXCBNhpsqZKhYvbJKOWECGz5pX4tiagJDQ2Tvy59BZNRztDwr3MDeHhE24/ug
+sNLl7Vhvir40LJ54pDT9PMGbdP50gDiVfnggXpaTAoGAF/0HAeXgml/PWwThSL7L
+zX7mgHCSFp8gyuKBe/1S7tbN4c3fTt5S9ZIEWXYq3prxLE/3acBioACs7xfWK8yy
+OLM0oOMyAbjujZITuzGqHpkkXD7QAciMhd8EqXaVXWBZUwa9gSRLx0dBw7ninwKq
+giCc6t2Ok8BFqJxfOYDxmm0=
+-----END PRIVATE KEY-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/server.crt
new/Mojolicious-9.46/t/mojo/certs/server.crt
--- old/Mojolicious-9.45/t/mojo/certs/server.crt 2022-06-14
13:31:51.000000000 +0200
+++ new/Mojolicious-9.46/t/mojo/certs/server.crt 2026-06-04
18:58:27.000000000 +0200
@@ -1,12 +1,19 @@
-----BEGIN CERTIFICATE-----
-MIIBsjCCARsCCQCptEBZlSnk3jANBgkqhkiG9w0BAQUFADAaMQswCQYDVQQGEwJV
-UzELMAkGA1UEAxMCY2EwHhcNMTQxMjEyMDUwMzI1WhcNMzQxMjA3MDUwMzI1WjAh
-MQswCQYDVQQGEwJVUzESMBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDDhbj7nsfzahPilwn6pGdo6nKYCR21WZ73CuwPN86DmsZi
-5LIRYRfKA0unape2BQBnMnSmInaXvHHBdVsTyt3XSFZj5+iCF9RcorXAqcDygScj
-8MTWYAZxCu3lGAjtw0bGGYutlLg5jtEXvZwfe61XfJj9xDUPNQrP7mf/HTBmgQID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBACRIx9fB4x8UO44C9TGj3bKb1NX3bkuHMz0m
-WdhCkzUUiANtRMxp2oLA3KHY4yOusZLZIUNyP10Ri5q/U1mR0poYCMm7AYee2OV7
-NdQIyppeDLoWQ9uPISPjp1d+zjpGOrLrSkpD1rYLVw4R56A9ZQks/LNs6TSceZjZ
-c5QST/9i
+MIIDCzCCAfOgAwIBAgIUBKV+XGuJKjGEShXmaq6DWtOLPakwDQYJKoZIhvcNAQEL
+BQAwGjELMAkGA1UEBhMCVVMxCzAJBgNVBAMMAmNhMB4XDTI2MDQzMDEwMDI1N1oX
+DTQ2MDQyNTEwMDI1N1owITELMAkGA1UEBhMCVVMxEjAQBgNVBAMMCTEyNy4wLjAu
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKGGtlsNqpKi8gTQzWvm
+A6/DjBqzL6ncWG11lCoQlcQJBMtqFuboywTdI/wpwxxsiPYuMRQOolk5l4o+s/d3
+JkjilbZI18bLlPelavfDd0d/zjfoO6iHTP8vUeYrop23zBVpPZzxmG+6V2JpyG9T
+ypxxBlTnF3knWe2Jhj2NcOr1mKDEGpC3DiAWIiBgA/vfJI/ILjKkz+9+nd0zJbca
+IPuBpcrN23+z/SkBFY96o/WhNKM8uZ2BViX6jFJAIv2CVpmOZeHNhX0Cpv/iJ0Ax
+vzf53EIuSzFCOjxzCCTLvUecSL5OLvr4HMZphxKS7iHj7ClSj9kfkKiU1N0nDmhN
+pFkCAwEAAaNCMEAwHQYDVR0OBBYEFB4OqRXXu8sSoR5qBCSZJRE5huvyMB8GA1Ud
+IwQYMBaAFKGAg7Osf7vBn+0jVTg86XKiJmVQMA0GCSqGSIb3DQEBCwUAA4IBAQAz
+aSmPMf7XdaJKaIvNNTHcV8+ICbS94Qkh6uU+pCgEb3S/3+GMuzyvEGzLjQyAg0bD
+ohbpb8jV06LCpb+vjvyACx9SyMRlR6U9zJMC2pwiovFTEca1ZL5sSXMgNks/lmfI
+01ivdsBWBjkxESdhBi9Vp5L7itEm3Ib6uXY0jWistyz2K9VntBCg3L8u9gvsr7lK
+xa5E28hbU9L6UMM2wr8qEor5sYXVjamCQ1H6zrT66xHpYcduFrj+ngX4ma1KEaiA
+oFjAnZ8BERz/Hyu1jO/dBLZTJnVF0cBHPjiTpduSjw5xXGrhkGNt1ULj/RhPfUOa
+WLiLTmMfcJFkCvnUYKVF
-----END CERTIFICATE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/certs/server.key
new/Mojolicious-9.46/t/mojo/certs/server.key
--- old/Mojolicious-9.45/t/mojo/certs/server.key 2022-06-14
13:31:51.000000000 +0200
+++ new/Mojolicious-9.46/t/mojo/certs/server.key 2026-06-04
18:58:27.000000000 +0200
@@ -1,15 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQDDhbj7nsfzahPilwn6pGdo6nKYCR21WZ73CuwPN86DmsZi5LIR
-YRfKA0unape2BQBnMnSmInaXvHHBdVsTyt3XSFZj5+iCF9RcorXAqcDygScj8MTW
-YAZxCu3lGAjtw0bGGYutlLg5jtEXvZwfe61XfJj9xDUPNQrP7mf/HTBmgQIDAQAB
-AoGBAKqQ+XLobV435+kAAkCZM20fOaDQMw6FhFvXN19/O7UrTG3xPDZVET+16EXA
-g2DStCtSpNhZsENmrYYrLqzxiNxDHagmEizmicdjoU2sXCHUbLtSojwedGTixBNf
-ofuDPi/j7T24CQFK34ROwA4diMVsD8YBLOv+jXZMXaq1ROwBAkEA6RfoF2P9r7MW
-Q5Yq54eZdU6viQmHXV8ePe43NmcEXGUMKb049RHekCWggvAgcTz3bzLIP4v6SQxz
-J17wezU7sQJBANa8nYGOX29/TF2LS4vpAf85jPa+MqeFVOHXunlZbibXwPvx6WWS
-EwwimDX6Q0q+dA4XqSDrb622BED5A18fG9ECQHOT1xFCE1g7hJ6ep0eGhSEVkxRw
-FR7HO0eaBuaCzjbCI/XOTZ+27JStE5nZVzzO7iHFHGXmEoSGF9M90CBHlQECQH/0
-Ffpb5pweg1d+J/7vUcRN+6QPQ0m01hZYoIGse0lj6Fd4F3Xxa64gcwg+3pgMEkVP
-bfTytTISMkiw2IR2mfECQE343mUbDSOGGoDAN5ByWydkwfqaJvNBCHaBAkJ6lthU
-4yVXQabDGkZMh1jdxi8hK/TRLiNgGks8tgFp6Zqc0SU=
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQChhrZbDaqSovIE
+0M1r5gOvw4wasy+p3FhtdZQqEJXECQTLahbm6MsE3SP8KcMcbIj2LjEUDqJZOZeK
+PrP3dyZI4pW2SNfGy5T3pWr3w3dHf8436Duoh0z/L1HmK6Kdt8wVaT2c8Zhvuldi
+achvU8qccQZU5xd5J1ntiYY9jXDq9ZigxBqQtw4gFiIgYAP73ySPyC4ypM/vfp3d
+MyW3GiD7gaXKzdt/s/0pARWPeqP1oTSjPLmdgVYl+oxSQCL9glaZjmXhzYV9Aqb/
+4idAMb83+dxCLksxQjo8cwgky71HnEi+Ti76+BzGaYcSku4h4+wpUo/ZH5ColNTd
+Jw5oTaRZAgMBAAECggEACSWfCYB4XpXuJSIq49eScV9ePXvUsOaKtmYgZhJq3L9S
+/27qTZi0uHmKamL2CtPFnMVIX7WlcW6Ou5Qp7lNXvmxgZIJy/62zKaP7Lv0pccnV
+xHo4+KXy0QeduG5TpuFL5BGB3POceYVAohDR+iXxVRMcc+3jOSfmkopFaRJrqM55
+ACO8btMugElZm4I1vyuJrm2dhAEeuXXbW5pWlri4WgxK0AF7DdHhUFFXxC7TH3Zl
+omDTVxAJLYPGWYOMobgNl+Z5zqTaxnzIowAuPo8HIResGcgzLJgm87RJyKrROzGe
+Xv+kWoiciIrJvQ7NbrUEHiiioOJMZxq7gf7IAjT6JQKBgQDd2lM91rVqDvWB1fRT
+fk6z3jFcAVEbadWPR41QQyjpbS5DcY2ty9wRdmy2zziwsaZBf73kmWcHioX3athe
+QVi4399upi/lOMEJIL9xdlXbfuXxjwodYpvYRz0Xj0dwdQykmQYlVqQ+ItY6EF3X
+vZTiqlKaMCrZgOq7mo56EpIhrQKBgQC6Y1XnSyGbjNXKbf3+lWCCfiT92TJE0lNP
+kORVTVyG2Lo1Ke2FD77w3+fP7WGSz/1tJPJf9zHmEL2xJfoHheoq/5tK0+TaV0pi
+wPymql5IQJEv+b0BhPUVw0DFN16/blyOs8HvPsH9ond//r0DHIWcptXT7X32/CEL
+xrTKsQca3QKBgQC1dg+iRA2NG4E6WquG44gyXSqYa8dQmeeBU3BF1zkOfSxbI/VT
+06xEaE4R1Ts0Y4puhrLm2YbJR0e+kRk7N03/obYaxjnkzuAtvCh7AOTHLWudgncu
+g+qfI93XeG1hkYvu0e+R+OVMoagCRELN5RZztAbucTmLQIQ/QPMK7Ee03QKBgEge
+U4jRK0nSro5LDPJKvjL/uDR4q9ixQQcSWycebeTHSxVzCbJoq0rsd/eeNBjoXXiz
+yQyUyzvn0l4PAbWTfU3x5RaI8o4BJIkdfyTF2wE96m+TxCwoU+R9zjwA9qo/e5TD
+vRBjShBnorFl0aC4koJQk4AS7qB4Yhj6Y83hvYwJAoGAWcuSOmIYxPamUUnyFDZC
+T0W9SwamiIMrAbbsw06CM/rrV0pNZXgE0A45hKP3SJJ6YNtFikp/2/Qkmv3kWxkr
+5OxwcxReiMuFBylaJAwxPOZFwepTb8VbQBQqKxjrD8oiCah3tSt0qYmfam7SJWEP
+BAd3rs9dH7DuOwFTNwlvlxY=
+-----END PRIVATE KEY-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/dom.t
new/Mojolicious-9.46/t/mojo/dom.t
--- old/Mojolicious-9.45/t/mojo/dom.t 2026-05-05 18:10:15.000000000 +0200
+++ new/Mojolicious-9.46/t/mojo/dom.t 2026-05-12 12:16:41.000000000 +0200
@@ -341,6 +341,14 @@
is $dom->at('script')->text, ' console.log("<!-- <script> </script> -->");
', 'right script content';
};
+subtest 'Script tag with HTML comment containing stray characters' => sub {
+ my $dom = Mojo::DOM->new(q{<script>/* <!-- <foo --> */</script>});
+ is $dom->at('script')->text, '/* <!-- <foo --> */', 'right script content';
+
+ $dom = Mojo::DOM->new(q{<script>/* <!-- a-b --> */</script>});
+ is $dom->at('script')->text, '/* <!-- a-b --> */', 'right script content';
+};
+
subtest 'HTML5 (unquoted values)' => sub {
my $dom = Mojo::DOM->new('<div id = test foo ="bar" class=tset bar=/baz/
value baz=//>works</div>');
is $dom->at('#test')->text, 'works', 'right text';
@@ -586,14 +594,14 @@
is $dom->find('rss')->[0]->attr('version'), '2.0', 'right version';
is_deeply [$dom->at('title')->ancestors->map('tag')->each], [qw(channel
rss)], 'right results';
is $dom->at('extension')->attr('foo:id'), 'works', 'right id';
- like $dom->at('#works')->text, qr/\[awesome\]\]/, 'right text';
- like $dom->at('[id="works"]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id="works"]')->text, qr/\[awesome\]\]/, 'right text';
is $dom->find('description')->[1]->text, "\n <p>trololololo>\n
", 'right text';
is $dom->at('pubDate')->text, 'Mon, 12 Jul 2010 20:42:00',
'right text';
- like $dom->at('[id*="ork"]')->text, qr/\[awesome\]\]/, 'right text';
- like $dom->at('[id*="orks"]')->text, qr/\[awesome\]\]/, 'right text';
- like $dom->at('[id*="work"]')->text, qr/\[awesome\]\]/, 'right text';
- like $dom->at('[id*="or"]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id*="ork"]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id*="orks"]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id*="work"]')->text, qr/\[awesome\]\]/, 'right text';
+ like $dom->at('[foo\:id*="or"]')->text, qr/\[awesome\]\]/, 'right text';
ok $dom->at('rss')->xml, 'XML mode active';
ok $dom->at('extension')->parent->xml, 'XML mode active';
ok $dom->at('extension')->root->xml, 'XML mode active';
@@ -632,11 +640,6 @@
is $dom->at('k\:book'), undef,
'no result';
is $dom->at('ook'), undef,
'no result';
is $dom->at('[xmlns\:bk]')->{'xmlns:bk'}, 'uri:book-ns',
'right attribute';
- is $dom->at('[bk]')->{'xmlns:bk'}, 'uri:book-ns',
'right attribute';
- is $dom->at('[bk]')->attr('xmlns:bk'), 'uri:book-ns',
'right attribute';
- is $dom->at('[bk]')->attr('s:bk'), undef,
'no attribute';
- is $dom->at('[bk]')->attr('bk'), undef,
'no attribute';
- is $dom->at('[bk]')->attr('k'), undef,
'no attribute';
is $dom->at('[s\:bk]'), undef,
'no result';
is $dom->at('[k]'), undef,
'no result';
is $dom->at('number')->ancestors('meta')->first->{xmlns}, 'uri:meta-ns',
'right attribute';
@@ -1286,6 +1289,13 @@
is $dom->at('#♥ ~ #☃ ~ *:nth-last-child(1)')->text, 'G', 'right text';
is $dom->at('#♥ + *:nth-last-child(2)')->text, 'F', 'right text';
is $dom->at('#♥ ~ *:nth-last-child(2)')->text, 'F', 'right text';
+ ok $dom->at('#♥')->matches('h1 + p'), 'match';
+ ok !$dom->at('#☃')->matches('h1 + p'), 'no match';
+ ok !$dom->at('h1')->matches('h1 + p'), 'no match';
+ ok $dom->at('#☃')->matches('h1 ~ p'), 'match';
+ ok $dom->at('#♥')->matches('h1 ~ p'), 'match';
+ ok !$dom->at('div')->matches('h1 ~ p'), 'no match';
+ ok !$dom->matches('h1 + p'), 'no match';
};
subtest 'Whitespace as descendant combinator' => sub {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/ioloop_tls.t
new/Mojolicious-9.46/t/mojo/ioloop_tls.t
--- old/Mojolicious-9.45/t/mojo/ioloop_tls.t 2026-02-12 12:07:38.000000000
+0100
+++ new/Mojolicious-9.46/t/mojo/ioloop_tls.t 2026-06-04 18:58:27.000000000
+0200
@@ -9,21 +9,26 @@
plan skip_all => 'IO::Socket::SSL 2.009+ required for this test!' unless
Mojo::IOLoop::TLS->can_tls;
# To regenerate all required certificates run these commands (12.12.2014)
-# openssl genrsa -out ca.key 1024
+# openssl genrsa -out ca.key 2048
# openssl req -new -key ca.key -out ca.csr -subj "/C=US/CN=ca"
# openssl req -x509 -days 7300 -key ca.key -in ca.csr -out ca.crt
#
-# openssl genrsa -out server.key 1024
+# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -out server.csr -subj "/C=US/CN=127.0.0.1"
# openssl x509 -req -days 7300 -in server.csr -out server.crt -CA ca.crt \
# -CAkey ca.key -CAcreateserial
#
-# openssl genrsa -out client.key 1024
+# openssl genrsa -out mojo_server.key 2048
+# openssl req -new -key mojo_server.key -out mojo_server.csr -subj
"/C=US/CN=mojolicious.org"
+# openssl x509 -req -days 7300 -in mojo_server.csr -out mojo_server.crt -CA
ca.crt \
+# -CAkey ca.key -CAcreateserial
+#
+# openssl genrsa -out client.key 2048
# openssl req -new -key client.key -out client.csr -subj "/C=US/CN=127.0.0.1"
# openssl x509 -req -days 7300 -in client.csr -out client.crt -CA ca.crt \
# -CAkey ca.key -CAcreateserial
#
-# openssl genrsa -out bad.key 1024
+# openssl genrsa -out bad.key 2048
# openssl req -new -key bad.key -out bad.csr -subj "/C=US/CN=bad"
# openssl req -x509 -days 7300 -key bad.key -in bad.csr -out bad.crt
use Mojo::IOLoop;
@@ -390,4 +395,123 @@
is $client_proto, 'baz', 'right protocol';
};
+subtest 'conditionally override SSL_hostname' => sub {
+ plan skip_all => 'SNI support required!' unless
IO::Socket::SSL->can_client_sni;
+ my $sni;
+ $id = Mojo::IOLoop->server(
+ address => '127.0.0.1',
+ tls => 1,
+ sub {
+ my ($loop, $stream) = @_;
+ $sni = $stream->handle->get_servername;
+ $stream->close;
+ }
+ );
+ $port = Mojo::IOLoop->acceptor($id)->port;
+ Mojo::IOLoop->client(
+ port => $port,
+ tls => 1,
+ tls_options => {SSL_hostname => "mojolicious.org", SSL_verify_mode =>
0x00},
+ sub {
+ my ($loop, $err, $stream) = @_;
+ $stream->on(close => sub { Mojo::IOLoop->stop });
+ }
+ );
+ Mojo::IOLoop->start;
+ is $sni, 'mojolicious.org', 'right sni';
+};
+
+subtest 'can disable SNI' => sub {
+ plan skip_all => 'SNI support required!' unless
IO::Socket::SSL->can_client_sni;
+
+ my ($sni, $id, $port);
+ $id = Mojo::IOLoop->server(
+ address => '127.0.0.1',
+ tls => 1,
+ sub {
+ my ($loop, $stream) = @_;
+ $sni = $stream->handle->get_servername;
+ $stream->close;
+ }
+ );
+ $port = Mojo::IOLoop->acceptor($id)->port;
+ Mojo::IOLoop->client(
+ port => $port,
+ tls => 1,
+ tls_options => {SSL_hostname => "", SSL_verify_mode => 0x00},
+ sub {
+ my ($loop, $err, $stream) = @_;
+ $stream->on(close => sub { Mojo::IOLoop->stop });
+ }
+ );
+ Mojo::IOLoop->start;
+ ok !$sni, 'sni disabled';
+};
+
+subtest 'SNI defaults to address' => sub {
+ plan skip_all => 'SNI support required!' unless
IO::Socket::SSL->can_client_sni;
+
+ my ($sni, $id, $port);
+ $id = Mojo::IOLoop->server(
+ address => 'localhost',
+ tls => 1,
+ sub {
+ my ($loop, $stream) = @_;
+ $sni = $stream->handle->get_servername;
+ $stream->close;
+ }
+ );
+ $port = Mojo::IOLoop->acceptor($id)->port;
+ Mojo::IOLoop->client(
+ address => 'localhost',
+ port => $port,
+ tls => 1,
+ tls_options => {SSL_verify_mode => 0x00},
+ sub {
+ my ($loop, $err, $stream) = @_;
+ $stream->on(close => sub { Mojo::IOLoop->stop });
+ }
+ );
+ Mojo::IOLoop->start;
+ is $sni, 'localhost', 'sni defaults to address';
+};
+
+subtest 'valid certificates with custom verifycn_name' => sub {
+ my ($client_err, $server_err, $running) = ();
+ my $promise = Mojo::Promise->new;
+ my $id = Mojo::IOLoop->server(
+ address => '127.0.0.1',
+ tls => 1,
+ tls_ca => 't/mojo/certs/ca.crt',
+ tls_cert => 't/mojo/certs/mojo_server.crt',
+ tls_key => 't/mojo/certs/mojo_server.key',
+ sub {
+ my ($loop, $stream) = @_;
+ $running = Mojo::IOLoop->is_running;
+ $stream->on(close => sub { $promise->resolve; });
+ $stream->on(error => sub { $server_err = pop });
+ }
+ );
+ my $port = Mojo::IOLoop->acceptor($id)->port;
+ my $promise2 = Mojo::Promise->new;
+ Mojo::IOLoop->client(
+ port => $port,
+ tls => 1,
+ tls_ca => 't/mojo/certs/ca.crt',
+ tls_cert => 't/mojo/certs/client.crt',
+ tls_key => 't/mojo/certs/client.key',
+ tls_options => {SSL_verifycn_name => "mojolicious.org"},
+ sub {
+ my ($loop, $err, $stream) = @_;
+ $stream->on(close => sub { $promise2->resolve; });
+ $stream->on(error => sub { $client_err = pop });
+ $stream->close;
+ }
+ );
+ Mojo::Promise->all($promise, $promise2)->wait;
+ ok $running, 'loop was running';
+ ok !$server_err, 'no server error';
+ ok !$client_err, 'no client error';
+};
+
done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.45/t/mojo/util.t
new/Mojolicious-9.46/t/mojo/util.t
--- old/Mojolicious-9.45/t/mojo/util.t 2026-02-12 12:07:38.000000000 +0100
+++ new/Mojolicious-9.46/t/mojo/util.t 2026-06-04 18:58:27.000000000 +0200
@@ -9,9 +9,9 @@
use Sub::Util qw(subname);
use Mojo::Util qw(b64_decode b64_encode camelize class_to_file class_to_path
decamelize decode decrypt_cookie dumper),
- qw(encode encrypt_cookie extract_usage generate_secret getopt gunzip gzip
header_params hmac_sha1_sum html_unescape),
- qw(html_attr_unescape humanize_bytes md5_bytes md5_sum monkey_patch
network_contains punycode_decode),
- qw(punycode_encode quote scope_guard secure_compare sha1_bytes sha1_sum
slugify split_cookie_header split_header),
+ qw(encode encrypt_cookie extract_usage generate_secret getopt gunzip gzip
header_params hmac_sha1_sum),
+ qw(html_unescape html_attr_unescape humanize_bytes md5_bytes md5_sum
monkey_patch network_contains punycode_decode),
+ qw(punycode_encode quote random_bytes scope_guard secure_compare sha1_bytes
sha1_sum slugify split_cookie_header split_header),
qw(steady_time tablify term_escape trim unindent unquote url_escape
url_unescape xml_escape xor_encode);
subtest 'camelize' => sub {
@@ -678,6 +678,11 @@
is decrypt_cookie('6Y+LKA==-ROhxLDrUBVkXRKTM-v7Qm+Xgoi1t94GLSHYGkaw==',
'foo', 'salt'), 'test', 'decrypted';
};
+subtest 'random_bytes' => sub {
+ isnt random_bytes(16), random_bytes(16), "two random_bytes invocations
are not the same";
+ is length(random_bytes(16)), 16, "random_bytes(16) returns 16
bytes";
+};
+
subtest 'generate_secret' => sub {
like generate_secret, qr/^[A-Za-z0-9_-]{32,}$/, 'right format';
};
++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.yRbSgt/_old 2026-06-10 16:18:44.324334173 +0200
+++ /var/tmp/diff_new_pack.yRbSgt/_new 2026-06-10 16:18:44.376336328 +0200
@@ -1,6 +1,6 @@
-mtime: 1778053630
-commit: 9cad6b445729b6947032c8fc69fe825d33858ae62150882fb10b468f6cc1e9ad
+mtime: 1780792824
+commit: cfcac4fb4de0dc32e06ddc9645e2d39292e13ade3af77638350bf9df0c64f88e
url: https://src.opensuse.org/perl/perl-Mojolicious
-revision: 9cad6b445729b6947032c8fc69fe825d33858ae62150882fb10b468f6cc1e9ad
+revision: cfcac4fb4de0dc32e06ddc9645e2d39292e13ade3af77638350bf9df0c64f88e
projectscmsync: https://src.opensuse.org/perl/_ObsPrj
++++++ build.specials.obscpio ++++++
++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore 2026-06-07 02:40:24.000000000 +0200
@@ -0,0 +1 @@
+.osc