From f3301cb76fab787ec286b38a780a39fc8143c74d Mon Sep 17 00:00:00 2001 From: Rawley Fowler Date: Wed, 20 Sep 2023 08:18:42 -0600 Subject: [PATCH] Add absolute check to file_path and asset_path --- lib/Mojolicious/Controller.pm | 8 +++++--- t/mojolicious/static_prefix_lite_app.t | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/Mojolicious/Controller.pm b/lib/Mojolicious/Controller.pm index 473e362e18..c5427fbb1a 100644 --- a/lib/Mojolicious/Controller.pm +++ b/lib/Mojolicious/Controller.pm @@ -11,6 +11,8 @@ use Mojo::Util; use Mojolicious::Routes::Match; use Scalar::Util (); +my $ABSOLUTE = qr!^(?:[^:/?#]+:|//|#)!; + has [qw(app tx)] => undef, weak => 1; has match => sub { Mojolicious::Routes::Match->new(root => shift->app->routes) }; @@ -239,7 +241,7 @@ sub url_for { # Absolute URL return $target if Scalar::Util::blessed $target && $target->isa('Mojo::URL'); - return Mojo::URL->new($target) if $target =~ m!^(?:[^:/?#]+:|//|#)!; + return Mojo::URL->new($target) if $target =~ $ABSOLUTE; # Base my $url = Mojo::URL->new; @@ -274,12 +276,12 @@ sub url_for { sub url_for_asset { my ($self, $asset) = @_; - return $self->url_for($self->app->static->asset_path($asset)); + return $self->url_for($asset =~ $ABSOLUTE ? $asset : $self->app->static->asset_path($asset)); } sub url_for_file { my ($self, $file) = @_; - return $self->url_for($self->app->static->file_path($file)); + return $self->url_for($file =~ $ABSOLUTE ? $file : $self->app->static->file_path($file)); } sub write { diff --git a/t/mojolicious/static_prefix_lite_app.t b/t/mojolicious/static_prefix_lite_app.t index 6e47ea0821..24ed0af63c 100644 --- a/t/mojolicious/static_prefix_lite_app.t +++ b/t/mojolicious/static_prefix_lite_app.t @@ -77,6 +77,10 @@ subtest 'File' => sub { my $c = $t->app->build_controller; is $c->url_for_file('/unknown.css')->path, '/static/unknown.css', 'right file path'; is $c->url_for_file('/foo/bar.css')->path, '/static/foo/bar.css', 'right file path'; + is $c->url_for_file('https://somesite.com/file.css')->to_string, 'https://somesite.com/file.css', + 'right absolute file path?'; + is $c->url_for_asset('https://somesite.com/file.css')->to_string, 'https://somesite.com/file.css', + 'right absolute asset path?'; }; done_testing();