Hello community,
here is the log from the commit of package perl-Mojolicious for
openSUSE:Factory checked in at 2020-05-05 19:07:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old)
and /work/SRC/openSUSE:Factory/.perl-Mojolicious.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojolicious"
Tue May 5 19:07:09 2020 rev:131 rq:800395 version:8.42
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes
2020-05-04 18:40:44.793079387 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Mojolicious.new.2738/perl-Mojolicious.changes
2020-05-05 19:07:31.342952048 +0200
@@ -1,0 +2,18 @@
+Tue May 5 03:12:00 UTC 2020 - Tina Müller <[email protected]>
+
+updated to 8.42
+ see /usr/share/doc/packages/perl-Mojolicious/Changes
+
+ 8.42 2020-05-04
+ - This release contains fixes for security issues, everybody should
upgrade!
+ - Added EXPERIMENTAL support for :any-link pseudo-class to Mojo::DOM::CSS.
+ - Added EXPERIMENTAL support for case-sensitive attribute selectors like
+ [foo="bar" s] to Mojo::DOM::CSS
+ - Renamed experimental :matches pseudo-class to :is in Mojo::DOM::CSS.
+ - Fixed a security issue that allowed for _method query parameters to be
used
+ with GET requests.
+ - Fixed a bug in Mojo::DOM::CSS where the case-sensitivity identifier was
+ case-sensitive.
+
+
+-------------------------------------------------------------------
Old:
----
Mojolicious-8.41.tar.gz
New:
----
Mojolicious-8.42.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Mojolicious.spec ++++++
--- /var/tmp/diff_new_pack.JTr5Zx/_old 2020-05-05 19:07:33.202955902 +0200
+++ /var/tmp/diff_new_pack.JTr5Zx/_new 2020-05-05 19:07:33.206955910 +0200
@@ -17,7 +17,7 @@
Name: perl-Mojolicious
-Version: 8.41
+Version: 8.42
Release: 0
%define cpan_name Mojolicious
Summary: Real-time web framework
++++++ Mojolicious-8.41.tar.gz -> Mojolicious-8.42.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/Changes new/Mojolicious-8.42/Changes
--- old/Mojolicious-8.41/Changes 2020-04-30 18:01:34.000000000 +0200
+++ new/Mojolicious-8.42/Changes 2020-05-04 18:58:21.000000000 +0200
@@ -1,4 +1,15 @@
+8.42 2020-05-04
+ - This release contains fixes for security issues, everybody should upgrade!
+ - Added EXPERIMENTAL support for :any-link pseudo-class to Mojo::DOM::CSS.
+ - Added EXPERIMENTAL support for case-sensitive attribute selectors like
+ [foo="bar" s] to Mojo::DOM::CSS
+ - Renamed experimental :matches pseudo-class to :is in Mojo::DOM::CSS.
+ - Fixed a security issue that allowed for _method query parameters to be used
+ with GET requests.
+ - Fixed a bug in Mojo::DOM::CSS where the case-sensitivity identifier was
+ case-sensitive.
+
8.41 2020-04-30
- Improved Mojolicious::Commands to treat commands like
"mojo generate lite_app" as "mojo generate lite-app".
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/META.json
new/Mojolicious-8.42/META.json
--- old/Mojolicious-8.41/META.json 2020-05-01 15:34:16.000000000 +0200
+++ new/Mojolicious-8.42/META.json 2020-05-04 19:14:24.000000000 +0200
@@ -62,6 +62,6 @@
},
"x_IRC" : "irc://irc.freenode.net/#mojo"
},
- "version" : "8.41",
+ "version" : "8.42",
"x_serialization_backend" : "JSON::PP version 4.04"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/META.yml
new/Mojolicious-8.42/META.yml
--- old/Mojolicious-8.41/META.yml 2020-05-01 15:34:16.000000000 +0200
+++ new/Mojolicious-8.42/META.yml 2020-05-04 19:14:24.000000000 +0200
@@ -34,5 +34,5 @@
homepage: https://mojolicious.org
license: http://www.opensource.org/licenses/artistic-license-2.0
repository: https://github.com/mojolicious/mojo.git
-version: '8.41'
+version: '8.42'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/lib/Mojo/DOM/CSS.pm
new/Mojolicious-8.42/lib/Mojo/DOM/CSS.pm
--- old/Mojolicious-8.41/lib/Mojo/DOM/CSS.pm 2020-03-30 11:31:15.000000000
+0200
+++ new/Mojolicious-8.42/lib/Mojo/DOM/CSS.pm 2020-05-01 22:08:48.000000000
+0200
@@ -12,7 +12,7 @@
(?:
(\W)?= # Operator
(?:"((?:\\"|[^"])*)"|'((?:\\'|[^'])*)'|([^\]]+?)) # Value
- (?:\s+(i))? # Case-sensitivity
+ (?:\s+(?:(i|I)|s|S))? # Case-sensitivity
)?
\]
/x;
@@ -102,8 +102,8 @@
elsif ($css =~ /\G:([\w\-]+)(?:\(((?:\([^)]+\)|[^)])+)\))?/gcs) {
my ($name, $args) = (lc $1, $2);
- # ":matches" and ":not" (contains more selectors)
- $args = _compile($args, %ns) if $name eq 'matches' || $name eq 'not';
+ # ":is" and ":not" (contains more selectors)
+ $args = _compile($args, %ns) if $name eq 'is' || $name eq 'not';
# ":nth-*" (with An+B notation)
$args = _equation($args) if $name =~ /^nth-/;
@@ -183,8 +183,8 @@
# ":not"
return !_match($args, $current, $current) if $class eq 'not';
- # ":matches"
- return !!_match($args, $current, $current) if $class eq 'matches';
+ # ":is"
+ return !!_match($args, $current, $current) if $class eq 'is';
# ":empty"
return !grep { !_empty($_) } @$current[4 .. $#$current] if $class eq 'empty';
@@ -192,8 +192,8 @@
# ":root"
return $current->[3] && $current->[3][0] eq 'root' if $class eq 'root';
- # ":link" and ":visited"
- if ($class eq 'link' || $class eq 'visited') {
+ # ":any-link", ":link" and ":visited"
+ if ($class eq 'any-link' || $class eq 'link' || $class eq 'visited') {
return undef unless $current->[0] eq 'tag' && exists $current->[2]{href};
return !!grep { $current->[1] eq $_ } qw(a area link);
}
@@ -397,6 +397,18 @@
L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
in progress.
+=head2 E[foo="bar" s]
+
+An C<E> element whose C<foo> attribute value is exactly and case-sensitively
+equal to C<bar>. Note that this selector is B<EXPERIMENTAL> and might change
+without warning!
+
+ my $case_sensitive = $css->select('input[type="hidden" s]');
+
+This selector is part of
+L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
+in progress.
+
=head2 E[foo~="bar"]
An C<E> element whose C<foo> attribute value is a list of whitespace-separated
@@ -519,13 +531,21 @@
my $empty = $css->select(':empty');
+=head2 E:any-link
+
+Alias for L</"E:link">. Note that this selector is B<EXPERIMENTAL> and might
+change without warning! This selector is part of
+L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
+in progress.
+
=head2 E:link
An C<E> element being the source anchor of a hyperlink of which the target is
not yet visited (C<:link>) or already visited (C<:visited>). Note that
-L<Mojo::DOM::CSS> is not stateful, therefore C<:link> and C<:visited> yield
-exactly the same results.
+L<Mojo::DOM::CSS> is not stateful, therefore C<:any-link>, C<:link> and
+C<:visited> yield exactly the same results.
+ my $links = $css->select(':any-link');
my $links = $css->select(':link');
my $links = $css->select(':visited');
@@ -564,13 +584,13 @@
L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
in progress.
-=head2 E:matches(s1, s2)
+=head2 E:is(s1, s2)
An C<E> element that matches compound selector C<s1> and/or compound selector
C<s2>. Note that this selector is B<EXPERIMENTAL> and might change without
warning!
- my $headers = $css->select(':matches(section, article, aside, nav) h1');
+ my $headers = $css->select(':is(section, article, aside, nav) h1');
This selector is part of
L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/lib/Mojolicious/Guides/Testing.pod
new/Mojolicious-8.42/lib/Mojolicious/Guides/Testing.pod
--- old/Mojolicious-8.41/lib/Mojolicious/Guides/Testing.pod 2020-03-31
18:39:11.000000000 +0200
+++ new/Mojolicious-8.42/lib/Mojolicious/Guides/Testing.pod 2020-05-01
18:58:43.000000000 +0200
@@ -669,7 +669,7 @@
sub location_is {
my ($self, $value, $desc) = @_;
$desc ||= "Location: $value";
- return $self->test('is', $t->tx->res->headers->location, $value, $desc);
+ return $self->test('is', $self->tx->res->headers->location, $value, $desc);
}
1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/lib/Mojolicious/Routes.pm
new/Mojolicious-8.42/lib/Mojolicious/Routes.pm
--- old/Mojolicious-8.41/lib/Mojolicious/Routes.pm 2020-03-30
11:31:27.000000000 +0200
+++ new/Mojolicious-8.42/lib/Mojolicious/Routes.pm 2020-05-04
18:52:54.000000000 +0200
@@ -75,8 +75,10 @@
else { $path = $req->url->path->to_route }
# Method (HEAD will be treated as GET)
- my $method = uc($req->url->query->clone->param('_method') || $req->method);
- $method = 'GET' if $method eq 'HEAD';
+ my $method = uc $req->method;
+ my $override = $req->url->query->clone->param('_method');
+ $method = uc $override if $override && $method eq 'POST';
+ $method = 'GET' if $method eq 'HEAD';
# Check cache
my $ws = $c->tx->is_websocket ? 1 : 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/lib/Mojolicious.pm
new/Mojolicious-8.42/lib/Mojolicious.pm
--- old/Mojolicious-8.41/lib/Mojolicious.pm 2020-04-29 18:27:30.000000000
+0200
+++ new/Mojolicious-8.42/lib/Mojolicious.pm 2020-05-01 15:35:06.000000000
+0200
@@ -59,7 +59,7 @@
has validator => sub { Mojolicious::Validator->new };
our $CODENAME = 'Supervillain';
-our $VERSION = '8.41';
+our $VERSION = '8.42';
sub BUILD_DYNAMIC {
my ($class, $method, $dyn_methods) = @_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/lib/Test/Mojo.pm
new/Mojolicious-8.42/lib/Test/Mojo.pm
--- old/Mojolicious-8.41/lib/Test/Mojo.pm 2020-04-21 21:50:08.000000000
+0200
+++ new/Mojolicious-8.42/lib/Test/Mojo.pm 2020-05-01 19:01:44.000000000
+0200
@@ -1138,7 +1138,7 @@
$t = $t->test('is', 'first value', 'second value', 'right value');
Call L<Test::More> functions through L</"handler">, used to implement
-L<Test::Mojo> roles. Result is stored in L</"success">.
+L<Test::Mojo> roles. The result will be stored in L</"success">.
=head2 text_is
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/t/mojo/dom.t
new/Mojolicious-8.42/t/mojo/dom.t
--- old/Mojolicious-8.41/t/mojo/dom.t 2020-03-30 11:31:42.000000000 +0200
+++ new/Mojolicious-8.42/t/mojo/dom.t 2020-05-01 22:10:34.000000000 +0200
@@ -1117,7 +1117,7 @@
->each(sub { push @e, shift->text });
is_deeply \@e, [qw(C E F H)], 'found all odd li elements';
@e = ();
-$dom->find('ul li:matches(:first-child, :last-child)')
+$dom->find('ul li:is(:first-child, :last-child)')
->each(sub { push @e, shift->text });
is_deeply \@e, [qw(A I)], 'found all odd li elements';
@e = ();
@@ -1225,16 +1225,21 @@
<area href=/ alt=F>
<div href=borked>very borked</div>
EOF
+is $dom->find(':any-link')->map(sub { $_->tag })->join(','), 'a,link,area',
+ 'right tags';
is $dom->find(':link')->map(sub { $_->tag })->join(','), 'a,link,area',
'right tags';
is $dom->find(':visited')->map(sub { $_->tag })->join(','), 'a,link,area',
'right tags';
-is $dom->at('a:link')->text, 'B', 'right result';
-is $dom->at('a:visited')->text, 'B', 'right result';
-is $dom->at('link:link')->{rel}, 'D', 'right result';
-is $dom->at('link:visited')->{rel}, 'D', 'right result';
-is $dom->at('area:link')->{alt}, 'F', 'right result';
-is $dom->at('area:visited')->{alt}, 'F', 'right result';
+is $dom->at('a:link')->text, 'B', 'right result';
+is $dom->at('a:any-link')->text, 'B', 'right result';
+is $dom->at('a:visited')->text, 'B', 'right result';
+is $dom->at('link:any-link')->{rel}, 'D', 'right result';
+is $dom->at('link:link')->{rel}, 'D', 'right result';
+is $dom->at('link:visited')->{rel}, 'D', 'right result';
+is $dom->at('area:link')->{alt}, 'F', 'right result';
+is $dom->at('area:any-link')->{alt}, 'F', 'right result';
+is $dom->at('area:visited')->{alt}, 'F', 'right result';
# Sibling combinator
$dom = Mojo::DOM->new(<<EOF);
@@ -2418,20 +2423,30 @@
is $dom->find('.foo')->map('text')->join(','), 'A,B', 'right
result';
is $dom->find('.FOO')->map('text')->join(','), 'C', 'right
result';
is $dom->find('[class=foo]')->map('text')->join(','), 'A', 'right
result';
+is $dom->find('[class=foo s]')->map('text')->join(','), 'A', 'right
result';
+is $dom->find('[class=foo S]')->map('text')->join(','), 'A', 'right
result';
is $dom->find('[class=foo i]')->map('text')->join(','), 'A,C', 'right
result';
is $dom->find('[class="foo" i]')->map('text')->join(','), 'A,C', 'right
result';
-is $dom->find('[class="foo bar"]')->size, 0, 'no results';
+is $dom->find('[class="foo" I]')->map('text')->join(','), 'A,C', 'right
result';
+is $dom->find('[class="foo bar"]')->size, 0, 'no results';
+is $dom->find('[class="foo bar s"]')->size, 0, 'no results';
+is $dom->find('[class="foo bar S"]')->size, 0, 'no results';
is $dom->find('[class="foo bar" i]')->map('text')->join(','), 'B',
'right result';
-is $dom->find('[class~=foo]')->map('text')->join(','), 'A,B', 'right result';
+is $dom->find('[class~=foo]')->map('text')->join(','), 'A,B', 'right result';
+is $dom->find('[class~=foo s]')->map('text')->join(','), 'A,B', 'right result';
is $dom->find('[class~=foo i]')->map('text')->join(','), 'A,B,C',
'right result';
-is $dom->find('[class*=f]')->map('text')->join(','), 'A,B,D', 'right result';
+is $dom->find('[class*=f]')->map('text')->join(','), 'A,B,D', 'right result';
+is $dom->find('[class*=f s]')->map('text')->join(','), 'A,B,D', 'right result';
is $dom->find('[class*=f i]')->map('text')->join(','), 'A,B,C,D',
'right result';
-is $dom->find('[class^=F]')->map('text')->join(','), 'C', 'right result';
+is $dom->find('[class^=F]')->map('text')->join(','), 'C', 'right result';
+is $dom->find('[class^=F S]')->map('text')->join(','), 'C', 'right result';
is $dom->find('[class^=F i]')->map('text')->join(','), 'A,B,C,D',
'right result';
+is $dom->find('[class^=F I]')->map('text')->join(','), 'A,B,C,D',
+ 'right result';
is $dom->find('[class$=O]')->map('text')->join(','), 'C', 'right result';
is $dom->find('[class$=O i]')->map('text')->join(','), 'A,C', 'right result';
is $dom->find('[class|=foo]')->map('text')->join(','), 'A,D', 'right result';
@@ -2611,11 +2626,11 @@
</foo>
EOF
%ns = (foons => 'ns:foo', barns => 'ns:bar');
-ok $dom->at('foons|foo', %ns), 'result';
-ok $dom->at('foons|foo:not(barns|*)', %ns), 'result';
-ok $dom->at('foo:not(|foo)', %ns), 'result';
-ok $dom->at('foons|foo:root', %ns), 'result';
-ok $dom->at('foo:matches(:root, foons|*)', %ns), 'result';
+ok $dom->at('foons|foo', %ns), 'result';
+ok $dom->at('foons|foo:not(barns|*)', %ns), 'result';
+ok $dom->at('foo:not(|foo)', %ns), 'result';
+ok $dom->at('foons|foo:root', %ns), 'result';
+ok $dom->at('foo:is(:root, foons|*)', %ns), 'result';
ok !$dom->at('foons|foo:not(:root)', %ns), 'no result';
is $dom->at('foons|tag', %ns)->{val}, 1, 'right value';
is $dom->at('foons|tag:empty', %ns)->{val}, 1, 'right value';
@@ -2628,11 +2643,11 @@
ok $dom->at('barns|bar', %ns), 'result';
ok $dom->at('barns|bar:not(foons|*)', %ns), 'result';
ok $dom->at('bar:not(|bar)', %ns), 'result';
-ok $dom->at('bar:matches(barns|*)', %ns), 'result';
+ok $dom->at('bar:is(barns|*)', %ns), 'result';
ok !$dom->at('barns|bar:root', %ns), 'no result';
-ok $dom->at('barns|bar:not(:root)', %ns), 'result';
-ok $dom->at('bar:matches(barns|*, :not(:root))', %ns), 'result';
-ok $dom->at('foons|foo barns|bar', %ns), 'result';
+ok $dom->at('barns|bar:not(:root)', %ns), 'result';
+ok $dom->at('bar:is(barns|*, :not(:root))', %ns), 'result';
+ok $dom->at('foons|foo barns|bar', %ns), 'result';
is $dom->at('barns|tag', %ns)->{val}, 2, 'right value';
is $dom->at('barns|tag:empty', %ns)->{val}, 2, 'right value';
ok $dom->at('barns|tag[val="2"]', %ns), 'result';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/t/mojo/ioloop_tls.t
new/Mojolicious-8.42/t/mojo/ioloop_tls.t
--- old/Mojolicious-8.41/t/mojo/ioloop_tls.t 2020-03-30 11:31:38.000000000
+0200
+++ new/Mojolicious-8.42/t/mojo/ioloop_tls.t 2020-05-02 18:30:10.000000000
+0200
@@ -303,7 +303,7 @@
# Ignore invalid client certificate
$loop = Mojo::IOLoop->new;
-my $cipher;
+my ($cipher, $version);
($server, $client, $client_err) = ();
$id = $loop->server(
address => '127.0.0.1',
@@ -331,24 +331,28 @@
$stream->timeout(0.5);
$client_err = $err;
$client = 'connected';
- $cipher = $stream->handle->get_cipher;
+ my $handle = $stream->handle;
+ $cipher = $handle->get_cipher;
+ $version = $handle->get_sslversion;
}
);
$loop->start;
is $server, 'accepted', 'right result';
is $client, 'connected', 'right result';
ok !$client_err, 'no error';
-is $cipher, 'AES256-SHA', 'AES256-SHA has been negotiatied';
+my $expect = $version eq 'TLSv1_3' ? 'TLS_AES_256_GCM_SHA384' : 'AES256-SHA';
+is $cipher, $expect, "$expect has been negotiatied";
# Ignore missing client certificate
($server, $client, $client_err) = ();
$id = Mojo::IOLoop->server(
- address => '127.0.0.1',
- tls => 1,
- tls_ca => 't/mojo/certs/ca.crt',
- tls_cert => 't/mojo/certs/server.crt',
- tls_key => 't/mojo/certs/server.key',
- tls_verify => 0x01,
+ address => '127.0.0.1',
+ tls => 1,
+ tls_ca => 't/mojo/certs/ca.crt',
+ tls_cert => 't/mojo/certs/server.crt',
+ tls_key => 't/mojo/certs/server.key',
+ tls_verify => 0x01,
+ tls_version => 'TLSv1_2',
sub { $server = 'accepted' }
);
$port = Mojo::IOLoop->acceptor($id)->port;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/t/mojo/tls.t
new/Mojolicious-8.42/t/mojo/tls.t
--- old/Mojolicious-8.41/t/mojo/tls.t 2020-03-30 11:31:38.000000000 +0200
+++ new/Mojolicious-8.42/t/mojo/tls.t 2020-05-02 18:30:10.000000000 +0200
@@ -52,8 +52,12 @@
$delay->then(sub { ($server_result, $client_result) = @_ });
$delay->wait;
is ref $client_result, 'IO::Socket::SSL', 'right class';
-is $client_result->get_cipher, 'AES256-SHA', 'AES256-SHA has been negotiatied';
is ref $server_result, 'IO::Socket::SSL', 'right class';
-is $server_result->get_cipher, 'AES256-SHA', 'AES256-SHA has been negotiatied';
+my $expect
+ = $server_result->get_sslversion eq 'TLSv1_3'
+ ? 'TLS_AES_256_GCM_SHA384'
+ : 'AES256-SHA';
+is $client_result->get_cipher, $expect, "$expect has been negotiatied";
+is $server_result->get_cipher, $expect, "$expect has been negotiatied";
done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Mojolicious-8.41/t/mojolicious/app.t
new/Mojolicious-8.42/t/mojolicious/app.t
--- old/Mojolicious-8.41/t/mojolicious/app.t 2020-03-30 11:32:00.000000000
+0200
+++ new/Mojolicious-8.42/t/mojolicious/app.t 2020-05-04 18:52:46.000000000
+0200
@@ -336,9 +336,11 @@
# Foo::something
$t->put_ok('/somethingtest' => {'X-Test' => 'Hi there!'})->status_is(200)
->header_is(Server => 'Mojolicious (Perl)')->content_is('/test4/42');
-$t->get_ok('/somethingtest?_method=PUT' => {'X-Test' => 'Hi there!'})
+$t->post_ok('/somethingtest?_method=PUT' => {'X-Test' => 'Hi there!'})
->status_is(200)->header_is(Server => 'Mojolicious (Perl)')
->content_is('/test4/42');
+$t->get_ok('/somethingtest?_method=PUT' => {'X-Test' => 'Hi there!'})
+ ->status_is(404);
# Foo::url_for_missing
$t->get_ok('/something_missing' => {'X-Test' => 'Hi there!'})->status_is(200)