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-07-07 21:05:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old)
and /work/SRC/openSUSE:Factory/.perl-Mojolicious.new.1982 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojolicious"
Tue Jul 7 21:05:54 2026 rev:185 rq:1364270 version:9.470.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes
2026-06-10 16:18:39.948152821 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Mojolicious.new.1982/perl-Mojolicious.changes
2026-07-07 21:08:17.240846688 +0200
@@ -1,0 +2,18 @@
+Mon Jul 6 09:12:41 UTC 2026 - Tina Müller <[email protected]>
+
+- updated to 9.470.0 (9.47)
+ see /usr/share/doc/packages/perl-Mojolicious/Changes
+
+ 9.47 2026-07-05
+ - Added support for the QUERY HTTP request method from RFC 10008.
+ - Added query and query_p methods to Mojo::UserAgent.
+ - Added query method to Mojolicious::Routes::Route.
+ - Added query method to Mojolicious::Lite.
+ - Added query_ok method to Test::Mojo.
+ - Fixed a security issue where the pure-Perl implementation of Mojo::JSON
could exhaust all available memory when
+ decoding deeply nested data. Decoding is now limited to 512 levels of
nesting, to match the default of
+ Cpanel::JSON::XS.
+ - Fixed a memory leak in Morbo. (heikojansen)
+ - Fixed Mojo::File::list_tree to no longer follow symbolic links to
directories.
+
+-------------------------------------------------------------------
Old:
----
Mojolicious-9.46.tar.gz
New:
----
Mojolicious-9.47.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Mojolicious.spec ++++++
--- /var/tmp/diff_new_pack.lwtY6J/_old 2026-07-07 21:08:17.844867564 +0200
+++ /var/tmp/diff_new_pack.lwtY6J/_new 2026-07-07 21:08:17.852867840 +0200
@@ -18,10 +18,10 @@
%define cpan_name Mojolicious
Name: perl-Mojolicious
-Version: 9.460.0
+Version: 9.470.0
Release: 0
-# 9.46 -> normalize -> 9.460.0
-%define cpan_version 9.46
+# 9.47 -> normalize -> 9.470.0
+%define cpan_version 9.47
License: Artistic-2.0
Summary: Real-time web framework
URL: https://metacpan.org/release/%{cpan_name}
++++++ Mojolicious-9.46.tar.gz -> Mojolicious-9.47.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/Changes new/Mojolicious-9.47/Changes
--- old/Mojolicious-9.46/Changes 2026-06-04 19:08:08.000000000 +0200
+++ new/Mojolicious-9.47/Changes 2026-07-05 16:00:40.000000000 +0200
@@ -1,4 +1,16 @@
+9.47 2026-07-05
+ - Added support for the QUERY HTTP request method from RFC 10008.
+ - Added query and query_p methods to Mojo::UserAgent.
+ - Added query method to Mojolicious::Routes::Route.
+ - Added query method to Mojolicious::Lite.
+ - Added query_ok method to Test::Mojo.
+ - Fixed a security issue where the pure-Perl implementation of Mojo::JSON
could exhaust all available memory when
+ decoding deeply nested data. Decoding is now limited to 512 levels of
nesting, to match the default of
+ Cpanel::JSON::XS.
+ - Fixed a memory leak in Morbo. (heikojansen)
+ - Fixed Mojo::File::list_tree to no longer follow symbolic links to
directories.
+
9.46 2026-06-04
- Added random_bytes function to Mojo::Util. (leont)
- Improved randomness for CSRF token generation. (leont)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/META.json
new/Mojolicious-9.47/META.json
--- old/Mojolicious-9.46/META.json 2026-06-04 19:09:43.000000000 +0200
+++ new/Mojolicious-9.47/META.json 2026-07-05 16:01:49.000000000 +0200
@@ -64,6 +64,6 @@
"web" : "https://web.libera.chat/#mojo"
}
},
- "version" : "9.46",
+ "version" : "9.47",
"x_serialization_backend" : "JSON::PP version 4.16"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/META.yml
new/Mojolicious-9.47/META.yml
--- old/Mojolicious-9.46/META.yml 2026-06-04 19:09:42.000000000 +0200
+++ new/Mojolicious-9.47/META.yml 2026-07-05 16:01:49.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.46'
+version: '9.47'
x_serialization_backend: 'CPAN::Meta::YAML version 0.020'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojo/File.pm
new/Mojolicious-9.47/lib/Mojo/File.pm
--- old/Mojolicious-9.46/lib/Mojo/File.pm 2026-05-04 17:29:38.000000000
+0200
+++ new/Mojolicious-9.47/lib/Mojo/File.pm 2026-07-05 15:58:53.000000000
+0200
@@ -76,7 +76,8 @@
my $child = $self->new($path, $name);
my $is_dir = -d $$child;
push @results, $child if $options->{dir} || !$is_dir;
- $walk->($$child, $depth + 1) if $is_dir && (!$options->{max_depth} ||
$depth + 1 < $options->{max_depth});
+ __SUB__->($$child, $depth + 1)
+ if $is_dir && !-l $$child && (!$options->{max_depth} || $depth + 1 <
$options->{max_depth});
}
};
$walk->($$self, 0);
@@ -378,7 +379,7 @@
my $collection = $path->list_tree({hidden => 1});
List all files recursively in the directory and return a L<Mojo::Collection>
object containing the results as
-L<Mojo::File> objects. The list does not include C<.> and C<..>.
+L<Mojo::File> objects. The list does not include C<.> and C<..>, and symbolic
links to directories are not followed.
# List all templates
say for path('/home/sri/myapp/templates')->list_tree->each;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojo/JSON.pm
new/Mojolicious-9.47/lib/Mojo/JSON.pm
--- old/Mojolicious-9.46/lib/Mojo/JSON.pm 2025-10-01 01:50:15.000000000
+0200
+++ new/Mojolicious-9.47/lib/Mojo/JSON.pm 2026-07-05 15:58:53.000000000
+0200
@@ -15,12 +15,21 @@
use constant CORE_BOOLS => defined &builtin::is_bool;
+# Maximum nesting level for decoding, to match the default of Cpanel::JSON::XS
+use constant MAX_DEPTH => 512;
+
BEGIN {
warnings->unimport('experimental::builtin') if CORE_BOOLS;
}
+# Deep recursion is expected when working with nested data structures
+no warnings 'recursion';
+
our @EXPORT_OK = qw(decode_json encode_json false from_json j to_json true);
+# Current nesting level while decoding
+our $DEPTH = 0;
+
# Escaped special character map
my %ESCAPE
= ('"' => '"', '\\' => '\\', '/' => '/', 'b' => "\x08", 'f' => "\x0c", 'n'
=> "\x0a", 'r' => "\x0d", 't' => "\x09");
@@ -86,6 +95,10 @@
}
sub _decode_array {
+
+ # Nesting limit
+ _throw('Nesting too deep') if (local $DEPTH = $DEPTH + 1) > MAX_DEPTH;
+
my @array;
until (m/\G[\x20\x09\x0a\x0d]*\]/gc) {
@@ -106,6 +119,10 @@
}
sub _decode_object {
+
+ # Nesting limit
+ _throw('Nesting too deep') if (local $DEPTH = $DEPTH + 1) > MAX_DEPTH;
+
my %hash;
until (m/\G[\x20\x09\x0a\x0d]*\}/gc) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojo/UserAgent/Transactor.pm
new/Mojolicious-9.47/lib/Mojo/UserAgent/Transactor.pm
--- old/Mojolicious-9.46/lib/Mojo/UserAgent/Transactor.pm 2025-07-03
14:03:09.000000000 +0200
+++ new/Mojolicious-9.47/lib/Mojo/UserAgent/Transactor.pm 2026-07-05
15:58:53.000000000 +0200
@@ -131,14 +131,14 @@
my $proto = $location->protocol;
return undef if ($proto ne 'http' && $proto ne 'https') || !$location->host;
- # Clone request if necessary
- my $new = Mojo::Transaction::HTTP->new;
- if ($code == 307 || $code == 308) {
+ # Clone request if necessary (QUERY is safe and idempotent, so it keeps its
content like 307 and 308)
+ my $new = Mojo::Transaction::HTTP->new;
+ my $method = uc $req->method;
+ if ($code == 307 || $code == 308 || ($method eq 'QUERY' && $code != 303)) {
return undef unless my $clone = $req->clone;
$new->req($clone);
}
else {
- my $method = uc $req->method;
$method = $code == 303 || $method eq 'POST' ? 'GET' : $method;
$new->req->method($method)->content->headers(my $headers =
$req->headers->clone);
$headers->remove($_) for grep {/^content-/i} @{$headers->names};
@@ -450,7 +450,8 @@
my $tx = $t->redirect(Mojo::Transaction::HTTP->new);
Build L<Mojo::Transaction::HTTP> follow-up request for C<301>, C<302>, C<303>,
C<307> or C<308> redirect response if
-possible.
+possible. Since C<QUERY> requests are safe and idempotent, they are never
redirected as C<GET> requests and keep their
+content, except for C<303> responses.
=head2 tx
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojo/UserAgent.pm
new/Mojolicious-9.47/lib/Mojo/UserAgent.pm
--- old/Mojolicious-9.46/lib/Mojo/UserAgent.pm 2025-07-01 13:31:23.000000000
+0200
+++ new/Mojolicious-9.47/lib/Mojo/UserAgent.pm 2026-07-05 15:58:53.000000000
+0200
@@ -32,7 +32,7 @@
has transactor => sub { Mojo::UserAgent::Transactor->new
};
# Common HTTP methods
-for my $name (qw(DELETE GET HEAD OPTIONS PATCH POST PUT)) {
+for my $name (qw(DELETE GET HEAD OPTIONS PATCH POST PUT QUERY)) {
monkey_patch __PACKAGE__, lc $name, sub {
my ($self, $cb) = (shift, ref $_[-1] eq 'CODE' ? pop : undef);
return $self->start($self->build_tx($name, @_), $cb);
@@ -908,6 +908,33 @@
say $tx->result->body;
})->catch(sub ($err) {
warn "Connection error: $err";
+ })->wait;
+
+=head2 query
+
+ my $tx = $ua->query('example.com');
+ my $tx = $ua->query('http://example.com' => {Accept => '*/*'} => 'Content!');
+ my $tx = $ua->query('http://example.com' => {Accept => '*/*'} => form => {a
=> 'b'});
+ my $tx = $ua->query('http://example.com' => {Accept => '*/*'} => json => {a
=> 'b'});
+
+Perform blocking C<QUERY> request and return resulting
L<Mojo::Transaction::HTTP> object, takes the same arguments as
+L<Mojo::UserAgent::Transactor/"tx"> (except for the C<QUERY> method, which is
implied). You can also append a callback
+to perform requests non-blocking.
+
+ $ua->query('http://example.com' => json => {a => 'b'} => sub ($ua, $tx) {
say $tx->result->body });
+ Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
+
+=head2 query_p
+
+ my $promise = $ua->query_p('http://example.com');
+
+Same as L</"query">, but performs all requests non-blocking and returns a
L<Mojo::Promise> object instead of accepting
+a callback.
+
+ $ua->query_p('http://example.com' => json => {a => 'b'})->then(sub ($tx) {
+ say $tx->result->body;
+ })->catch(sub ($err) {
+ warn "Connection error: $err";
})->wait;
=head2 start
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojolicious/Lite.pm
new/Mojolicious-9.47/lib/Mojolicious/Lite.pm
--- old/Mojolicious-9.46/lib/Mojolicious/Lite.pm 2025-03-10
15:57:13.000000000 +0100
+++ new/Mojolicious-9.47/lib/Mojolicious/Lite.pm 2026-07-05
15:58:53.000000000 +0200
@@ -29,7 +29,7 @@
# The Mojolicious::Lite DSL
my $root = $routes;
- for my $name (qw(any get options patch post put websocket)) {
+ for my $name (qw(any get options patch post put query websocket)) {
monkey_patch $caller, $name, sub { $routes->$name(@_) }
}
monkey_patch($caller, $_, sub {$app}) for qw(new app);
@@ -293,6 +293,17 @@
Generate route with L<Mojolicious::Routes::Route/"put">, matching only C<PUT>
requests. See
L<Mojolicious::Guides::Tutorial> and L<Mojolicious::Guides::Routing> for more
information.
+=head2 query
+
+ my $route = query '/:foo' => sub ($c) {...};
+ my $route = query '/:foo' => sub ($c) {...} => 'name';
+ my $route = query '/:foo' => {foo => 'bar'} => sub ($c) {...};
+ my $route = query '/:foo' => [foo => qr/\w+/] => sub ($c) {...};
+ my $route = query '/:foo' => (agent => qr/Firefox/) => sub ($c) {...};
+
+Generate route with L<Mojolicious::Routes::Route/"query">, matching only
C<QUERY> requests. See
+L<Mojolicious::Guides::Tutorial> and L<Mojolicious::Guides::Routing> for more
information.
+
=head2 under
my $route = under sub ($c) {...};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojolicious/Routes/Route.pm
new/Mojolicious-9.47/lib/Mojolicious/Routes/Route.pm
--- old/Mojolicious-9.46/lib/Mojolicious/Routes/Route.pm 2023-03-08
19:43:31.000000000 +0100
+++ new/Mojolicious-9.47/lib/Mojolicious/Routes/Route.pm 2026-07-05
15:58:53.000000000 +0200
@@ -85,6 +85,7 @@
sub patch { shift->_generate_route(PATCH => @_) }
sub post { shift->_generate_route(POST => @_) }
sub put { shift->_generate_route(PUT => @_) }
+sub query { shift->_generate_route(QUERY => @_) }
sub remove {
my $self = shift;
@@ -521,6 +522,23 @@
# Route with destination
$r->put('/user')->to('user#replace');
+=head2 query
+
+ my $route = $r->query;
+ my $route = $r->query('/:foo');
+ my $route = $r->query('/:foo' => sub ($c) {...});
+ my $route = $r->query('/:foo' => sub ($c) {...} => 'name');
+ my $route = $r->query('/:foo' => {foo => 'bar'} => sub ($c) {...});
+ my $route = $r->query('/:foo' => [foo => qr/\w+/] => sub ($c) {...});
+ my $route = $r->query('/:foo' => (agent => qr/Firefox/) => sub ($c) {...});
+
+Generate L<Mojolicious::Routes::Route> object matching only C<QUERY> requests,
takes the same arguments as L</"any">
+(except for the HTTP methods to match, which are implied). See
L<Mojolicious::Guides::Tutorial> and
+L<Mojolicious::Guides::Routing> for more information.
+
+ # Route with destination
+ $r->query('/user')->to('user#search');
+
=head2 remove
$r = $r->remove;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Mojolicious.pm
new/Mojolicious-9.47/lib/Mojolicious.pm
--- old/Mojolicious-9.46/lib/Mojolicious.pm 2026-06-04 19:06:14.000000000
+0200
+++ new/Mojolicious-9.47/lib/Mojolicious.pm 2026-06-04 19:10:03.000000000
+0200
@@ -57,7 +57,7 @@
has validator => sub { Mojolicious::Validator->new };
our $CODENAME = 'Waffle';
-our $VERSION = '9.46';
+our $VERSION = '9.47';
sub BUILD_DYNAMIC {
my ($class, $method, $dyn_methods) = @_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/lib/Test/Mojo.pm
new/Mojolicious-9.47/lib/Test/Mojo.pm
--- old/Mojolicious-9.46/lib/Test/Mojo.pm 2025-07-03 14:03:09.000000000
+0200
+++ new/Mojolicious-9.47/lib/Test/Mojo.pm 2026-07-05 15:58:53.000000000
+0200
@@ -275,6 +275,8 @@
sub put_ok { shift->_build_ok(PUT => @_) }
+sub query_ok { shift->_build_ok(QUERY => @_) }
+
sub request_ok { shift->_request_ok($_[0], $_[0]->req->url->to_string) }
sub reset_session {
@@ -1161,6 +1163,17 @@
Perform a C<PUT> request and check for transport errors, takes the same
arguments as L<Mojo::UserAgent/"put">, except
for the callback.
+=head2 query_ok
+
+ $t = $t->query_ok('http://example.com/foo');
+ $t = $t->query_ok('/foo');
+ $t = $t->query_ok('/foo' => {Accept => '*/*'} => 'Content!');
+ $t = $t->query_ok('/foo' => {Accept => '*/*'} => form => {a => 'b'});
+ $t = $t->query_ok('/foo' => {Accept => '*/*'} => json => {a => 'b'});
+
+Perform a C<QUERY> request and check for transport errors, takes the same
arguments as L<Mojo::UserAgent/"query">,
+except for the callback.
+
=head2 request_ok
$t = $t->request_ok(Mojo::Transaction::HTTP->new);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/mojo/file.t
new/Mojolicious-9.47/t/mojo/file.t
--- old/Mojolicious-9.46/t/mojo/file.t 2025-10-01 16:31:32.000000000 +0200
+++ new/Mojolicious-9.47/t/mojo/file.t 2026-07-05 15:58:53.000000000 +0200
@@ -310,6 +310,23 @@
'right files';
};
+subtest 'list_tree with symlinks' => sub {
+ my $dir = tempdir;
+ my $real = $dir->child('real')->make_path;
+ my $inside = $real->child('deep.txt')->spew('');
+ my $link = $dir->child('link');
+ plan skip_all => 'symlink unimplemented' unless eval { symlink $real, $link
};
+ my $top = $dir->child('top.txt')->spew('');
+ is_deeply $dir->list_tree->map('to_string')->to_array, [sort
$inside->to_string, $top->to_string], 'right files';
+ is_deeply $dir->list_tree({dir => 1})->map('to_string')->to_array,
+ [sort $inside->to_string, $link->to_string, $real->to_string,
$top->to_string], 'right files';
+
+ my $loop = $dir->child('loop');
+ symlink $dir, $loop;
+ is_deeply $dir->list_tree({dir => 1})->map('to_string')->to_array,
+ [sort $inside->to_string, $link->to_string, $loop->to_string,
$real->to_string, $top->to_string], 'right files';
+};
+
subtest 'touch' => sub {
my $dir = tempdir;
my $file = $dir->child('test.txt');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/mojo/json.t
new/Mojolicious-9.47/t/mojo/json.t
--- old/Mojolicious-9.46/t/mojo/json.t 2025-10-01 01:50:15.000000000 +0200
+++ new/Mojolicious-9.47/t/mojo/json.t 2026-07-05 15:58:53.000000000 +0200
@@ -405,4 +405,16 @@
like $@, qr/JSON: Unexpected data at line 3, offset 8 at.*json\.t/, 'right
error';
};
+subtest 'Maximum nesting level' => sub {
+ ok decode_json('[' x 512 . ']' x 512), 'decode deeply nested array';
+ eval { decode_json('[' x 513 . ']' x 513) };
+ like $@, qr/Malformed JSON: Nesting too deep at line 1, offset 513/, 'right
error';
+ ok decode_json('{"a":' x 512 . '1' . '}' x 512), 'decode deeply nested
object';
+ eval { decode_json('{"a":' x 513 . '1' . '}' x 513) };
+ like $@, qr/Malformed JSON: Nesting too deep at line 1, offset 2561/, 'right
error';
+ eval { decode_json('[{"a":' x 257 . '1' . '}]' x 257) };
+ like $@, qr/Malformed JSON: Nesting too deep/, 'right error';
+ ok decode_json('[' x 512 . ']' x 512), 'decode deeply nested array again';
+};
+
done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/mojo/transactor.t
new/Mojolicious-9.47/t/mojo/transactor.t
--- old/Mojolicious-9.46/t/mojo/transactor.t 2025-04-14 15:15:04.000000000
+0200
+++ new/Mojolicious-9.47/t/mojo/transactor.t 2026-07-05 15:58:53.000000000
+0200
@@ -924,6 +924,70 @@
is $t->redirect($tx), undef, 'unsupported redirect';
};
+subtest 'QUERY 301 redirect with content' => sub {
+ my $tx = $t->tx(QUERY => 'http://mojolicious.org/foo' => {Accept => '*/*'}
=> 'whatever');
+ $tx->res->code(301);
+ $tx->res->headers->location('http://example.com/bar');
+ is $tx->req->headers->accept, '*/*', 'right "Accept" value';
+ is $tx->req->body, 'whatever', 'right content';
+ $tx = $t->redirect($tx);
+ is $tx->req->method, 'QUERY', 'right method';
+ is $tx->req->url->to_abs, 'http://example.com/bar', 'right URL';
+ is $tx->req->headers->accept, '*/*', 'right "Accept"
value';
+ is $tx->req->headers->location, undef, 'no "Location"
value';
+ is $tx->req->body, 'whatever', 'right content';
+ is $tx->res->code, undef, 'no status';
+ is $tx->res->headers->location, undef, 'no "Location"
value';
+};
+
+subtest 'QUERY 302 redirect with content' => sub {
+ my $tx = $t->tx(QUERY => 'http://mojolicious.org/foo' => {Accept => '*/*'}
=> 'whatever');
+ $tx->res->code(302);
+ $tx->res->headers->location('http://example.com/bar');
+ is $tx->req->headers->accept, '*/*', 'right "Accept" value';
+ is $tx->req->body, 'whatever', 'right content';
+ $tx = $t->redirect($tx);
+ is $tx->req->method, 'QUERY', 'right method';
+ is $tx->req->url->to_abs, 'http://example.com/bar', 'right URL';
+ is $tx->req->headers->accept, '*/*', 'right "Accept"
value';
+ is $tx->req->headers->location, undef, 'no "Location"
value';
+ is $tx->req->body, 'whatever', 'right content';
+ is $tx->res->code, undef, 'no status';
+ is $tx->res->headers->location, undef, 'no "Location"
value';
+};
+
+subtest 'QUERY 303 redirect with content' => sub {
+ my $tx = $t->tx(QUERY => 'http://mojolicious.org/foo' => {Accept => '*/*'}
=> 'whatever');
+ $tx->res->code(303);
+ $tx->res->headers->location('http://example.com/bar');
+ is $tx->req->headers->accept, '*/*', 'right "Accept" value';
+ is $tx->req->body, 'whatever', 'right content';
+ $tx = $t->redirect($tx);
+ is $tx->req->method, 'GET', 'right method';
+ is $tx->req->url->to_abs, 'http://example.com/bar', 'right URL';
+ is $tx->req->headers->accept, '*/*', 'right "Accept"
value';
+ is $tx->req->headers->location, undef, 'no "Location"
value';
+ is $tx->req->body, '', 'no content';
+ is $tx->res->code, undef, 'no status';
+ is $tx->res->headers->location, undef, 'no "Location"
value';
+};
+
+subtest 'QUERY 307 redirect with content' => sub {
+ my $tx = $t->tx(QUERY => 'http://mojolicious.org/foo' => {Accept => '*/*'}
=> 'whatever');
+ $tx->res->code(307);
+ $tx->res->headers->location('http://example.com/bar');
+ is $tx->req->headers->accept, '*/*', 'right "Accept" value';
+ is $tx->req->body, 'whatever', 'right content';
+ $tx = $t->redirect($tx);
+ is $tx->req->method, 'QUERY', 'right method';
+ is $tx->req->url->to_abs, 'http://example.com/bar', 'right URL';
+ is $tx->req->headers->accept, '*/*', 'right "Accept"
value';
+ is $tx->req->headers->location, undef, 'no "Location"
value';
+ is $tx->req->body, 'whatever', 'right content';
+ is $tx->res->code, undef, 'no status';
+ is $tx->res->headers->location, undef, 'no "Location"
value';
+};
+
subtest '309 redirect (unsupported)' => sub {
my $tx = $t->tx(POST => 'http://mojolicious.org/foo' => {Accept =>
'application/json'});
$tx->res->code(309);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/mojo/user_agent.t
new/Mojolicious-9.47/t/mojo/user_agent.t
--- old/Mojolicious-9.46/t/mojo/user_agent.t 2023-03-08 19:43:36.000000000
+0100
+++ new/Mojolicious-9.47/t/mojo/user_agent.t 2026-07-05 15:58:53.000000000
+0200
@@ -172,6 +172,8 @@
is $result, 'POST', 'right result';
$ua->put_p('/method')->then(sub { $result = shift->res->body })->wait;
is $result, 'PUT', 'right result';
+$ua->query_p('/method')->then(sub { $result = shift->res->body })->wait;
+is $result, 'QUERY', 'right result';
$ua->start_p($ua->build_tx(TEST => '/method'))->then(sub { $result =
shift->res->body })->wait;
is $result, 'TEST', 'right result';
@@ -249,6 +251,7 @@
is $ua->patch('/method')->res->body, 'PATCH', 'right method';
is $ua->post('/method')->res->body, 'POST', 'right method';
is $ua->put('/method')->res->body, 'PUT', 'right method';
+is $ua->query('/method')->res->body, 'QUERY', 'right method';
# No keep-alive
$tx = $ua->get('/one?connection=test');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/mojolicious/lite_app.t
new/Mojolicious-9.47/t/mojolicious/lite_app.t
--- old/Mojolicious-9.46/t/mojolicious/lite_app.t 2025-02-25
01:50:19.000000000 +0100
+++ new/Mojolicious-9.47/t/mojolicious/lite_app.t 2026-07-05
15:58:53.000000000 +0200
@@ -309,6 +309,11 @@
$c->render(text => $c->url_for('foxy', {stuff => 'foo'}));
} => 'foxy';
+query '/query' => sub {
+ my $c = shift;
+ $c->render(text => $c->req->method);
+};
+
get '/url_for_foxy' => sub {
my $c = shift;
$c->render(text => $c->url_for('foxy', stuff => '#test'));
@@ -920,6 +925,9 @@
->header_is(Server => 'Mojolicious (Perl)')
->content_like(qr/Oops!/);
+# QUERY request
+$t->query_ok('/query')->status_is(200)->header_is(Server => 'Mojolicious
(Perl)')->content_is('QUERY');
+
# URL for route with condition
$t->get_ok('/url_for_foxy')->status_is(200)->header_is(Server => 'Mojolicious
(Perl)')->content_is('/firefox/%23test');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-9.46/t/test/mojo.t
new/Mojolicious-9.47/t/test/mojo.t
--- old/Mojolicious-9.46/t/test/mojo.t 2025-07-03 14:03:09.000000000 +0200
+++ new/Mojolicious-9.47/t/test/mojo.t 2026-07-05 15:58:53.000000000 +0200
@@ -83,6 +83,12 @@
is $t->tx->req->method, 'OPTIONS', 'right method';
};
+subtest 'query_ok' => sub {
+ $t->query_ok('/');
+ is_deeply \@args, ['ok', 1, 'QUERY /'], 'right result';
+ is $t->tx->req->method, 'QUERY', 'right method';
+};
+
subtest 'status_is' => sub {
$t->status_is(200);
is_deeply \@args, ['is', 200, 200, '200 OK'], 'right result';
++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.lwtY6J/_old 2026-07-07 21:08:18.588893278 +0200
+++ /var/tmp/diff_new_pack.lwtY6J/_new 2026-07-07 21:08:18.596893555 +0200
@@ -1,6 +1,6 @@
-mtime: 1780792824
-commit: cfcac4fb4de0dc32e06ddc9645e2d39292e13ade3af77638350bf9df0c64f88e
+mtime: 1783329162
+commit: bce999112d433396c90604c7f31c3e545b3032dbab35a011adba07ea9689cc17
url: https://src.opensuse.org/perl/perl-Mojolicious
-revision: cfcac4fb4de0dc32e06ddc9645e2d39292e13ade3af77638350bf9df0c64f88e
+revision: bce999112d433396c90604c7f31c3e545b3032dbab35a011adba07ea9689cc17
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-07-06 11:12:42.000000000 +0200
@@ -0,0 +1 @@
+.osc