Hello community, here is the log from the commit of package perl-Mojolicious for openSUSE:Factory checked in at 2018-02-27 16:58:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old) and /work/SRC/openSUSE:Factory/.perl-Mojolicious.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojolicious" Tue Feb 27 16:58:07 2018 rev:91 rq:579897 version:7.69 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes 2018-02-21 14:13:57.512815527 +0100 +++ /work/SRC/openSUSE:Factory/.perl-Mojolicious.new/perl-Mojolicious.changes 2018-02-27 16:58:08.995625665 +0100 @@ -1,0 +2,23 @@ +Sun Feb 25 06:34:52 UTC 2018 - [email protected] + +- updated to 7.69 + see /usr/share/doc/packages/perl-Mojolicious/Changes + + 7.69 2018-02-24 + - Improved respond_to method in Mojolicious::Controller and accepts helper in + Mojolicious::Plugin::DefaultHelpers to no longer limit support for multiple + MIME types to requests containing an X-Requested-With header, since browsers + have become smarter about requesting what they actually want. + +------------------------------------------------------------------- +Sat Feb 24 06:39:22 UTC 2018 - [email protected] + +- updated to 7.68 + see /usr/share/doc/packages/perl-Mojolicious/Changes + + 7.68 2018-02-22 + - Fixed RFC 7230 compliance bugs in Mojo::Message::Request that prevented + "GET //foo/bar HTTP/1.1" to be interpreted as a request target in origin + form. + +------------------------------------------------------------------- Old: ---- Mojolicious-7.67.tar.gz New: ---- Mojolicious-7.69.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Mojolicious.spec ++++++ --- /var/tmp/diff_new_pack.QM307x/_old 2018-02-27 16:58:10.871557884 +0100 +++ /var/tmp/diff_new_pack.QM307x/_new 2018-02-27 16:58:10.875557740 +0100 @@ -17,7 +17,7 @@ Name: perl-Mojolicious -Version: 7.67 +Version: 7.69 Release: 0 %define cpan_name Mojolicious Summary: Real-time web framework ++++++ Mojolicious-7.67.tar.gz -> Mojolicious-7.69.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/Changes new/Mojolicious-7.69/Changes --- old/Mojolicious-7.67/Changes 2018-02-19 12:12:21.000000000 +0100 +++ new/Mojolicious-7.69/Changes 2018-02-24 19:50:34.000000000 +0100 @@ -1,4 +1,15 @@ +7.69 2018-02-24 + - Improved respond_to method in Mojolicious::Controller and accepts helper in + Mojolicious::Plugin::DefaultHelpers to no longer limit support for multiple + MIME types to requests containing an X-Requested-With header, since browsers + have become smarter about requesting what they actually want. + +7.68 2018-02-22 + - Fixed RFC 7230 compliance bugs in Mojo::Message::Request that prevented + "GET //foo/bar HTTP/1.1" to be interpreted as a request target in origin + form. + 7.67 2018-02-19 - Modernized ".perltidyrc". - Fixed a bug in Mojo::Asset::File where forked processes could delete diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/META.json new/Mojolicious-7.69/META.json --- old/Mojolicious-7.67/META.json 2018-02-20 00:10:29.000000000 +0100 +++ new/Mojolicious-7.69/META.json 2018-02-24 22:58:27.000000000 +0100 @@ -58,6 +58,6 @@ }, "x_IRC" : "irc://irc.perl.org/#mojo" }, - "version" : "7.67", + "version" : "7.69", "x_serialization_backend" : "JSON::PP version 2.97001" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/META.yml new/Mojolicious-7.69/META.yml --- old/Mojolicious-7.67/META.yml 2018-02-20 00:10:28.000000000 +0100 +++ new/Mojolicious-7.69/META.yml 2018-02-24 22:58:27.000000000 +0100 @@ -31,5 +31,5 @@ homepage: http://mojolicious.org license: http://www.opensource.org/licenses/artistic-license-2.0 repository: https://github.com/kraih/mojo.git -version: '7.67' +version: '7.69' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojo/Message/Request.pm new/Mojolicious-7.69/lib/Mojo/Message/Request.pm --- old/Mojolicious-7.67/lib/Mojo/Message/Request.pm 2018-02-19 00:56:36.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojo/Message/Request.pm 2018-02-22 19:58:55.000000000 +0100 @@ -54,8 +54,11 @@ # We have a (hopefully) full request-line return !$self->error({message => 'Bad request start-line'}) unless $1 =~ /^(\S+)\s+(\S+)\s+HTTP\/(\d\.\d)$/; - my $url = $self->method($1)->version($3)->url; - return !!($1 eq 'CONNECT' ? $url->host_port($2) : $url->parse($2)); + my $url = $self->method($1)->version($3)->url; + my $target = $2; + return !!$url->host_port($target) if $1 eq 'CONNECT'; + return !!$url->parse($target)->fragment(undef) if $target =~ /^[^:\/?#]+:/; + return !!$url->path_query($target); } sub fix_headers { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojo/URL.pm new/Mojolicious-7.69/lib/Mojo/URL.pm --- old/Mojolicious-7.67/lib/Mojo/URL.pm 2018-02-19 00:56:40.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojo/URL.pm 2018-02-22 20:49:32.000000000 +0100 @@ -87,7 +87,13 @@ } sub path_query { - my $self = shift; + my ($self, $pq) = @_; + + if (defined $pq) { + return $self unless $pq =~ /^([^?#]*)(?:\?([^#]*))?/; + return defined $2 ? $self->path($1)->query($2) : $self->path($1); + } + my $query = $self->query->to_string; return $self->path->to_string . (length $query ? "?$query" : ''); } @@ -399,6 +405,7 @@ =head2 path_query my $path_query = $url->path_query; + $url = $url->path_query('/foo/bar?a=1&b=2'); Normalized version of L</"path"> and L</"query">. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojolicious/Controller.pm new/Mojolicious-7.69/lib/Mojolicious/Controller.pm --- old/Mojolicious-7.67/lib/Mojolicious/Controller.pm 2018-02-19 00:56:47.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojolicious/Controller.pm 2018-02-24 18:40:34.000000000 +0100 @@ -772,10 +772,7 @@ request header, C<format> stash value or C<format> C<GET>/C<POST> parameter, defaults to L<Mojolicious::Renderer/"default_format"> or rendering an empty C<204> response. Each representation can be handled with a callback or a hash -reference containing arguments to be passed to L</"render">. Since browsers -often don't really know what they actually want, unspecific C<Accept> request -headers with more than one MIME type will be ignored, unless the -C<X-Requested-With> header is set to the value C<XMLHttpRequest>. +reference containing arguments to be passed to L</"render">. # Everything else than "json" and "xml" gets a 204 response $c->respond_to( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojolicious/Renderer.pm new/Mojolicious-7.69/lib/Mojolicious/Renderer.pm --- old/Mojolicious-7.67/lib/Mojolicious/Renderer.pm 2018-02-19 00:56:47.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojolicious/Renderer.pm 2018-02-24 18:37:24.000000000 +0100 @@ -26,8 +26,8 @@ my ($self, $c) = (shift, shift); # List representations - my $req = $c->req; - my @exts = @{$c->app->types->detect($req->headers->accept, $req->is_xhr)}; + my $req = $c->req; + my @exts = @{$c->app->types->detect($req->headers->accept)}; if (!@exts && (my $format = $c->stash->{format} || $req->param('format'))) { push @exts, $format; } @@ -332,10 +332,7 @@ Select best possible representation for L<Mojolicious::Controller> object from C<Accept> request header, C<format> stash value or C<format> C<GET>/C<POST> parameter, defaults to returning the first extension if no preference could be -detected. Since browsers often don't really know what they actually want, -unspecific C<Accept> request headers with more than one MIME type will be -ignored, unless the C<X-Requested-With> header is set to the value -C<XMLHttpRequest>. +detected. =head2 add_handler diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojolicious/Types.pm new/Mojolicious-7.69/lib/Mojolicious/Types.pm --- old/Mojolicious-7.67/lib/Mojolicious/Types.pm 2018-02-19 00:56:50.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojolicious/Types.pm 2018-02-24 18:42:49.000000000 +0100 @@ -33,7 +33,7 @@ }; sub detect { - my ($self, $accept, $prioritize) = @_; + my ($self, $accept) = @_; # Extract and prioritize MIME types my %types; @@ -41,7 +41,6 @@ and $types{lc $1} = $2 // 1 for split ',', $accept // ''; my @detected = sort { $types{$b} <=> $types{$a} } sort keys %types; - return [] if !$prioritize && @detected > 1; # Detect extensions from MIME types my %reverse; @@ -50,6 +49,7 @@ my @types = @{$mapping->{$ext}}; push @{$reverse{$_}}, $ext for map { s/\;.*$//; lc $_ } @types; } + return [map { @{$reverse{$_} // []} } @detected]; } @@ -127,11 +127,9 @@ =head2 detect - my $exts = $types->detect('application/json;q=9'); - my $exts = $types->detect('text/html, application/json;q=9', 1); + my $exts = $types->detect('text/html, application/json;q=9'); -Detect file extensions from C<Accept> header value, prioritization of -unspecific values that contain more than one MIME type is disabled by default. +Detect file extensions from C<Accept> header value. # List detected extensions prioritized say for @{$types->detect('application/json, text/xml;q=0.1', 1)}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/lib/Mojolicious.pm new/Mojolicious-7.69/lib/Mojolicious.pm --- old/Mojolicious-7.67/lib/Mojolicious.pm 2018-02-19 00:56:30.000000000 +0100 +++ new/Mojolicious-7.69/lib/Mojolicious.pm 2018-02-23 19:44:33.000000000 +0100 @@ -65,7 +65,7 @@ has validator => sub { Mojolicious::Validator->new }; our $CODENAME = 'Doughnut'; -our $VERSION = '7.67'; +our $VERSION = '7.69'; sub AUTOLOAD { my $self = shift; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/t/mojo/request.t new/Mojolicious-7.69/t/mojo/request.t --- old/Mojolicious-7.67/t/mojo/request.t 2018-02-19 00:42:58.000000000 +0100 +++ new/Mojolicious-7.69/t/mojo/request.t 2018-02-22 20:03:59.000000000 +0100 @@ -308,7 +308,7 @@ is $req->content->progress, 0, 'right progress'; $req->parse('GET /foo/bar/baz.html?fo'); is $req->content->progress, 0, 'right progress'; - $req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); + $req->parse("o=13 HTTP/1.0\x0d\x0aContent"); $req->parse('-Type: text/'); is $req->content->progress, 0, 'right progress'; $req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a\x0d\x0aHell"); @@ -326,7 +326,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; - is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; + is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; } @@ -433,14 +433,14 @@ my $body = ''; $req->content->on(read => sub { $body .= pop }); $req->parse('GET /foo/bar/baz.html?fo'); -$req->parse("o=13#23 HTTP/1.0\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0aContent"); $req->parse('-Type: text/'); $req->parse("plain\x0aContent-Length: 27\x0a\x0aH"); $req->parse("ello World!\n1234\nlalalala\n"); ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; is $req->body, "Hello World!\n1234\nlalalala\n", 'right content'; @@ -449,23 +449,23 @@ # Parse full HTTP 1.0 request (no scheme and empty elements in path) $req = Mojo::Message::Request->new; $req->parse('GET //foo/bar//baz.html?fo'); -$req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0d\x0aContent"); $req->parse('-Type: text/'); $req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a\x0d\x0aHell"); $req->parse("o World!\n1234\nlalalala\n"); ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url->host, 'foo', 'no host'; -is $req->url->path, '/bar//baz.html', 'right path'; -is $req->url, '//foo/bar//baz.html?foo=13#23', 'right URL'; +is $req->url->host, undef, 'no host'; +is $req->url->path, '//foo/bar//baz.html', 'right path'; +is $req->url, '//foo/bar//baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; # Parse full HTTP 1.0 request (behind reverse proxy) $req = Mojo::Message::Request->new; $req->parse('GET /foo/bar/baz.html?fo'); -$req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0d\x0aContent"); $req->parse('-Type: text/'); $req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a"); $req->parse("Host: mojolicious.org\x0d\x0a"); @@ -474,8 +474,8 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; -is $req->url->to_abs, 'http://mojolicious.org/foo/bar/baz.html?foo=13#23', +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; +is $req->url->to_abs, 'http://mojolicious.org/foo/bar/baz.html?foo=13', 'right absolute URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; @@ -485,7 +485,7 @@ $finished = undef; $req->on(finish => sub { $finished = shift->is_finished }); $req->parse('GET /foo/bar/baz.html?fo'); -$req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0d\x0aContent"); $req->parse('-Type: text/'); $req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a\x0d\x0aHell"); $req->parse("o World!\n123"); @@ -495,14 +495,14 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; # Parse full HTTP 1.0 request with UTF-8 form input $req = Mojo::Message::Request->new; $req->parse('GET /foo/bar/baz.html?fo'); -$req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0d\x0aContent"); $req->parse('-Type: application/'); $req->parse("x-www-form-urlencoded\x0d\x0aContent-Length: 14"); $req->parse("\x0d\x0a\x0d\x0a"); @@ -510,7 +510,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'application/x-www-form-urlencoded', 'right "Content-Type" value'; is $req->headers->content_length, 14, 'right "Content-Length" value'; @@ -538,7 +538,7 @@ # Parse HTTP 1.1 chunked request $req = Mojo::Message::Request->new; is $req->content->progress, 0, 'right progress'; -$req->parse("POST /foo/bar/baz.html?foo=13#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13 HTTP/1.1\x0d\x0a"); is $req->content->progress, 0, 'right progress'; $req->parse("Content-Type: text/plain\x0d\x0a"); $req->parse("Transfer-Encoding: chunked\x0d\x0a\x0d\x0a"); @@ -556,7 +556,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_length, 13, 'right "Content-Length" value'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->content->asset->size, 13, 'right size'; @@ -572,8 +572,8 @@ } ); $req->content->unsubscribe('read')->on(read => sub { $buffer .= pop }); -$req->on(finish => sub { $finish .= shift->url->fragment }); -$req->parse("POST /foo/bar/baz.html?foo=13#23 HTTP/1.1\x0d\x0a"); +$req->on(finish => sub { $finish .= shift->url->query }); +$req->parse("POST /foo/bar/baz.html?foo=13 HTTP/1.1\x0d\x0a"); is $progress, '', 'no progress'; $req->parse("Content-Type: text/plain\x0d\x0a"); is $progress, '', 'no progress'; @@ -585,26 +585,26 @@ $req->parse("abcdefghi\x0d\x0a"); is $finish, '', 'not finished yet'; $req->parse("0\x0d\x0a\x0d\x0a"); -is $finish, '23', 'finished'; +is $finish, 'foo=13', 'finished'; is $progress, '/foo/bar/baz.html', 'made progress'; ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_length, 13, 'right "Content-Length" value'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $buffer, 'abcdabcdefghi', 'right content'; # Parse HTTP 1.1 "application/x-www-form-urlencoded" $req = Mojo::Message::Request->new; -$req->parse("POST /foo/bar/baz.html?foo=13#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13 HTTP/1.1\x0d\x0a"); $req->parse("Content-Length: 25\x0d\x0a"); $req->parse("Content-Type: application/x-www-form-urlencoded\x0d\x0a"); $req->parse("\x0d\x0afoo=bar&+tset=23+&foo=bar"); ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'application/x-www-form-urlencoded', 'right "Content-Type" value'; is $req->content->asset->size, 25, 'right size'; @@ -624,7 +624,7 @@ # Parse HTTP 1.1 chunked request with trailing headers $req = Mojo::Message::Request->new; -$req->parse("POST /foo/bar/baz.html?foo=13&bar=23#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13&bar=23 HTTP/1.1\x0d\x0a"); $req->parse("Content-Type: text/plain\x0d\x0a"); $req->parse("Transfer-Encoding: whatever\x0d\x0a"); $req->parse("Trailer: X-Trailer1; X-Trailer2\x0d\x0a\x0d\x0a"); @@ -638,7 +638,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13&bar=23#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13&bar=23', 'right URL'; is $req->query_params, 'foo=13&bar=23', 'right parameters'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->header('X-Trailer1'), 'test', 'right "X-Trailer1" value'; @@ -649,7 +649,7 @@ # Parse HTTP 1.1 chunked request with trailing headers (different variation) $req = Mojo::Message::Request->new; -$req->parse("POST /foo/bar/baz.html?foo=13&bar=23#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13&bar=23 HTTP/1.1\x0d\x0a"); $req->parse("Content-Type: text/plain\x0d\x0aTransfer-Enc"); $req->parse("oding: chunked\x0d\x0a"); $req->parse("Trailer: X-Trailer\x0d\x0a\x0d\x0a"); @@ -661,7 +661,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13&bar=23#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13&bar=23', 'right URL'; is $req->query_params, 'foo=13&bar=23', 'right parameters'; ok !defined $req->headers->transfer_encoding, 'no "Transfer-Encoding" value'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; @@ -672,7 +672,7 @@ # Parse HTTP 1.1 chunked request with trailing headers (different variation) $req = Mojo::Message::Request->new; -$req->parse("POST /foo/bar/baz.html?foo=13&bar=23#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13&bar=23 HTTP/1.1\x0d\x0a"); $req->parse("Content-Type: text/plain\x0d\x0a"); $req->parse("Transfer-Encoding: chunked\x0d\x0a"); $req->parse("Trailer: X-Trailer1; X-Trailer2\x0d\x0a\x0d\x0a"); @@ -684,7 +684,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13&bar=23#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13&bar=23', 'right URL'; is $req->query_params, 'foo=13&bar=23', 'right parameters'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->header('X-Trailer1'), 'test', 'right "X-Trailer1" value'; @@ -695,7 +695,7 @@ # Parse HTTP 1.1 chunked request with trailing headers (no Trailer header) $req = Mojo::Message::Request->new; -$req->parse("POST /foo/bar/baz.html?foo=13&bar=23#23 HTTP/1.1\x0d\x0a"); +$req->parse("POST /foo/bar/baz.html?foo=13&bar=23 HTTP/1.1\x0d\x0a"); $req->parse("Content-Type: text/plain\x0d\x0a"); $req->parse("Transfer-Encoding: chunked\x0d\x0a\x0d\x0a"); $req->parse("4\x0d\x0a"); @@ -706,7 +706,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'POST', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13&bar=23#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13&bar=23', 'right URL'; is $req->query_params, 'foo=13&bar=23', 'right parameters'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->header('X-Trailer1'), 'test', 'right "X-Trailer1" value'; @@ -718,7 +718,7 @@ # Parse HTTP 1.1 multipart request $req = Mojo::Message::Request->new; is $req->content->progress, 0, 'right progress'; -$req->parse("GET /foo/bar/baz.html?foo13#23 HTTP/1.1\x0d\x0a"); +$req->parse("GET /foo/bar/baz.html?foo13 HTTP/1.1\x0d\x0a"); is $req->content->progress, 0, 'right progress'; $req->parse("Content-Length: 416\x0d\x0a"); $req->parse('Content-Type: multipart/form-data; bo'); @@ -743,11 +743,11 @@ is $req->content->progress, 416, 'right progress'; ok $req->is_finished, 'request is finished'; ok $req->content->is_multipart, 'multipart content'; -is $req->body, '', 'no content'; -is $req->method, 'GET', 'right method'; -is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo13#23', 'right URL'; -is $req->query_params, 'foo13', 'right parameters'; +is $req->body, '', 'no content'; +is $req->method, 'GET', 'right method'; +is $req->version, '1.1', 'right version'; +is $req->url, '/foo/bar/baz.html?foo13', 'right URL'; +is $req->query_params, 'foo13', 'right parameters'; is $req->headers->content_type, 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'right "Content-Type" value'; @@ -788,7 +788,7 @@ ); } ); -$req->parse("GET /foo/bar/baz.html?foo13#23 HTTP/1.1\x0d\x0a"); +$req->parse("GET /foo/bar/baz.html?foo13 HTTP/1.1\x0d\x0a"); $req->parse("Content-Length: 562\x0d\x0a"); $req->parse('Content-Type: multipart/form-data; bo'); $req->parse("undary=----------0xKhTmLbOuNdArY\x0d\x0a\x0d\x0a"); @@ -812,11 +812,11 @@ $req->parse("Bye!\x0d\x0a------------0xKhTmLbOuNdArY--"); ok $req->is_finished, 'request is finished'; ok $req->content->is_multipart, 'multipart content'; -is $req->body, '', 'no content'; -is $req->method, 'GET', 'right method'; -is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo13#23', 'right URL'; -is $req->query_params, 'foo13', 'right parameters'; +is $req->body, '', 'no content'; +is $req->method, 'GET', 'right method'; +is $req->version, '1.1', 'right version'; +is $req->url, '/foo/bar/baz.html?foo13', 'right URL'; +is $req->query_params, 'foo13', 'right parameters'; is $req->headers->content_type, 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'right "Content-Type" value'; @@ -869,7 +869,7 @@ ); } ); -$req->parse("GET /foo/bar/baz.html?foo13#23 HTTP/1.1\x0d\x0a"); +$req->parse("GET /foo/bar/baz.html?foo13 HTTP/1.1\x0d\x0a"); $req->parse("Content-Length: 418\x0d\x0a"); $req->parse('Content-Type: multipart/form-data; bo'); $req->parse("undary=----------0xKhTmLbOuNdArY\x0d\x0a\x0d\x0a"); @@ -894,10 +894,10 @@ $req->parse("\x0d\x0a------------0xKhTmLbOuNdArY--"); ok $req->is_finished, 'request is finished'; ok $req->content->is_multipart, 'multipart content'; -is $req->method, 'GET', 'right method'; -is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo13#23', 'right URL'; -is $req->query_params, 'foo13', 'right parameters'; +is $req->method, 'GET', 'right method'; +is $req->version, '1.1', 'right version'; +is $req->url, '/foo/bar/baz.html?foo13', 'right URL'; +is $req->query_params, 'foo13', 'right parameters'; is $req->headers->content_type, 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'right "Content-Type" value'; @@ -918,7 +918,7 @@ # Parse HTTP 1.1 multipart request (without upgrade) $req = Mojo::Message::Request->new; $req->content->auto_upgrade(0); -$req->parse("GET /foo/bar/baz.html?foo13#23 HTTP/1.1\x0d\x0a"); +$req->parse("GET /foo/bar/baz.html?foo13 HTTP/1.1\x0d\x0a"); $req->parse("Content-Length: 418\x0d\x0a"); $req->parse('Content-Type: multipart/form-data; bo'); $req->parse("undary=----------0xKhTmLbOuNdArY\x0d\x0a\x0d\x0a"); @@ -938,10 +938,10 @@ $req->parse("\x0d\x0a------------0xKhTmLbOuNdArY--"); ok $req->is_finished, 'request is finished'; ok !$req->content->is_multipart, 'no multipart content'; -is $req->method, 'GET', 'right method'; -is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo13#23', 'right URL'; -is $req->query_params, 'foo13', 'right parameters'; +is $req->method, 'GET', 'right method'; +is $req->version, '1.1', 'right version'; +is $req->url, '/foo/bar/baz.html?foo13', 'right URL'; +is $req->query_params, 'foo13', 'right parameters'; is $req->headers->content_type, 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'right "Content-Type" value'; @@ -952,7 +952,7 @@ # Parse HTTP 1.1 multipart request with "0" filename $req = Mojo::Message::Request->new; -$req->parse("GET /foo/bar/baz.html?foo13#23 HTTP/1.1\x0d\x0a"); +$req->parse("GET /foo/bar/baz.html?foo13 HTTP/1.1\x0d\x0a"); $req->parse("Content-Length: 410\x0d\x0a"); $req->parse('Content-Type: multipart/form-data; bo'); $req->parse("undary=----------0xKhTmLbOuNdArY\x0d\x0a\x0d\x0a"); @@ -972,10 +972,10 @@ $req->parse("\x0d\x0a------------0xKhTmLbOuNdArY--"); ok $req->is_finished, 'request is finished'; ok $req->content->is_multipart, 'no multipart content'; -is $req->method, 'GET', 'right method'; -is $req->version, '1.1', 'right version'; -is $req->url, '/foo/bar/baz.html?foo13#23', 'right URL'; -is $req->query_params, 'foo13', 'right parameters'; +is $req->method, 'GET', 'right method'; +is $req->version, '1.1', 'right version'; +is $req->url, '/foo/bar/baz.html?foo13', 'right URL'; +is $req->query_params, 'foo13', 'right parameters'; is $req->headers->content_type, 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'right "Content-Type" value'; @@ -994,7 +994,7 @@ # Parse full HTTP 1.1 proxy request with basic authentication $req = Mojo::Message::Request->new; -$req->parse("GET http://127.0.0.1/foo/bar HTTP/1.1\x0d\x0a"); +$req->parse("GET http://127.0.0.1/foo/bar#baz HTTP/1.1\x0d\x0a"); $req->parse("Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\x0d\x0a"); $req->parse("Host: 127.0.0.1\x0d\x0a"); $req->parse("Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\x0d\x0a"); @@ -1652,7 +1652,7 @@ is $counter, 1, 'right count'; ok !$req->content->is_parsing_body, 'is not parsing body'; ok !$req->is_finished, 'request is not finished'; -$req->parse("o=13#23 HTTP/1.0\x0d\x0aContent"); +$req->parse("o=13 HTTP/1.0\x0d\x0aContent"); is $counter, 2, 'right count'; ok !$req->content->is_parsing_body, 'is not parsing body'; ok !$req->is_finished, 'request is not finished'; @@ -1683,7 +1683,7 @@ ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.0', 'right version'; -is $req->url, '/foo/bar/baz.html?foo=13#23', 'right URL'; +is $req->url, '/foo/bar/baz.html?foo=13', 'right URL'; is $req->headers->content_type, 'text/plain', 'right "Content-Type" value'; is $req->headers->content_length, 27, 'right "Content-Length" value'; my $cookies = $req->cookies; @@ -2097,12 +2097,13 @@ # Parse lots of special characters in URL $req = Mojo::Message::Request->new; -$req->parse("GET /#09azAZ!\$%&'()*+,-./:;=?@[\\]^_`{|}~\xC3\x9F "); +$req->parse("GET /09azAZ!\$%&'()*+,-./:;=?@[\\]^_`{|}~\xC3\x9F#abc "); $req->parse("HTTP/1.1\x0d\x0a\x0d\x0a"); ok $req->is_finished, 'request is finished'; is $req->method, 'GET', 'right method'; is $req->version, '1.1', 'right version'; -is $req->url, "/#09azAZ!\$%25&\'()*+,-./:;=?@%5B%5C%5D%5E_%60%7B%7C%7D~%C3%9F", +is $req->url, + "/09azAZ!\$%&'()*+,-./:;=?@%5B%5C%5D%5E_%60%7B%7C%7D~%C3%83%C2%9F", 'right URL'; # Abstract methods diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/t/mojolicious/restful_lite_app.t new/Mojolicious-7.69/t/mojolicious/restful_lite_app.t --- old/Mojolicious-7.67/t/mojolicious/restful_lite_app.t 2018-02-19 00:43:16.000000000 +0100 +++ new/Mojolicious-7.69/t/mojolicious/restful_lite_app.t 2018-02-24 18:32:59.000000000 +0100 @@ -477,21 +477,9 @@ ->status_is(200)->content_type_is('application/xml') ->text_is(just => 'works'); -# Internet Explorer 8 -my $ie - = 'image/jpeg, application/x-ms-application, image/gif, application/xaml+xml' - . ', image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash' - . ', application/msword, */*'; -$t->get_ok('/rest.html' => {Accept => $ie})->status_is(200) - ->content_type_is('text/html;charset=UTF-8')->text_is('html > body', 'works'); - -# Internet Explorer 8 with query -$t->get_ok('/rest?format=html' => {Accept => $ie})->status_is(200) - ->content_type_is('text/html;charset=UTF-8')->text_is('html > body', 'works'); - -# Chrome 11 -my $chrome = 'application/xml,application/xhtml+xml,text/html;q=0.9' - . ',text/plain;q=0.8,image/png,*/*;q=0.5'; +# Chrome 64 +my $chrome = 'text/html,application/xhtml+xml,application/xml;q=0.9' + . ',image/webp,image/apng,*/*;q=0.8'; $t->get_ok('/rest.html' => {Accept => $chrome})->status_is(200) ->content_type_is('text/html;charset=UTF-8')->text_is('html > body', 'works'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.67/t/mojolicious/types.t new/Mojolicious-7.69/t/mojolicious/types.t --- old/Mojolicious-7.67/t/mojolicious/types.t 2018-02-19 00:43:07.000000000 +0100 +++ new/Mojolicious-7.69/t/mojolicious/types.t 2018-02-24 18:36:25.000000000 +0100 @@ -46,11 +46,6 @@ is_deeply $t->detect('TEXT/XML'), ['xml'], 'right formats'; is_deeply $t->detect('text/html;q=0.9'), ['htm', 'html'], 'right formats'; is_deeply $t->detect('TEXT/HTML;Q=0.9'), ['htm', 'html'], 'right formats'; -is_deeply $t->detect('text/html,*/*'), [], 'no formats'; -is_deeply $t->detect('text/html;q=0.9,*/*'), [], 'no formats'; -is_deeply $t->detect('text/html,*/*;q=0.9'), [], 'no formats'; -is_deeply $t->detect('text/html;q=0.8,*/*;q=0.9'), [], 'no formats'; -is_deeply $t->detect('TEXT/HTML;Q=0.8,*/*;Q=0.9'), [], 'no formats'; # Alternatives $t->type(json => ['application/json', 'text/x-json']); @@ -69,19 +64,19 @@ is $t->type('html'), 'text/html;charset=UTF-8', 'right type'; # Prioritize -is_deeply $t->detect('text/plain', 1), ['txt'], 'right formats'; -is_deeply $t->detect('text/plain,text/html', 1), ['htm', 'html', 'txt'], +is_deeply $t->detect('text/plain'), ['txt'], 'right formats'; +is_deeply $t->detect('text/plain,text/html'), ['htm', 'html', 'txt'], 'right formats'; -is_deeply $t->detect('TEXT/HTML; q=0.8 ', 1), ['htm', 'html'], 'right formats'; -is_deeply $t->detect('TEXT/HTML ; q = 0.8 ', 1), ['htm', 'html'], +is_deeply $t->detect('TEXT/HTML; q=0.8 '), ['htm', 'html'], 'right formats'; +is_deeply $t->detect('TEXT/HTML ; q = 0.8 '), ['htm', 'html'], 'right formats'; -is_deeply $t->detect('TEXT/HTML;Q=0.8,text/plain;Q=0.9', 1), +is_deeply $t->detect('TEXT/HTML;Q=0.8,text/plain;Q=0.9'), ['txt', 'htm', 'html'], 'right formats'; -is_deeply $t->detect(' TEXT/HTML , text/plain;Q=0.9', 1), - ['htm', 'html', 'txt'], 'right formats'; -is_deeply $t->detect('text/plain;q=0.5, text/xml, application/xml;q=0.1', 1), +is_deeply $t->detect(' TEXT/HTML , text/plain;Q=0.9'), ['htm', 'html', 'txt'], + 'right formats'; +is_deeply $t->detect('text/plain;q=0.5, text/xml, application/xml;q=0.1'), ['xml', 'txt', 'xml'], 'right formats'; -is_deeply $t->detect('application/json, text/javascript, */*; q=0.01', 1), +is_deeply $t->detect('application/json, text/javascript, */*; q=0.01'), ['json'], 'right formats'; done_testing();
