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

Reply via email to