← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 16:10:05 2022
Reported on Wed Dec 14 16:12:57 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/URL.pm
StatementsExecuted 13665563 statements in 19.6s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3158361164.33s10.7sMojo::URL::::cloneMojo::URL::clone (recurses: max depth 1, inclusive time 1.02s)
240151213.37s24.8sMojo::URL::::_stringMojo::URL::_string
240151112.03s12.0sMojo::URL::::path_queryMojo::URL::path_query
339853211.68s3.54sMojo::URL::::host_portMojo::URL::host_port
478625511.68s6.48sMojo::URL::::pathMojo::URL::path
45939421.62s9.79sMojo::URL::::to_absMojo::URL::to_abs
136585111.62s10.1sMojo::URL::::parseMojo::URL::parse
383578211.23s5.57sMojo::URL::::_encodeMojo::URL::_encode
4524462371.20s11.8sMojo::URL::::newMojo::URL::new
240151111.01s1.34sMojo::URL::::ihostMojo::URL::ihost
28773421995ms1.30sMojo::URL::::queryMojo::URL::query
71212741841ms1.29sMojo::URL::::CORE:matchMojo::URL::CORE:match (opcode)
24015111661ms889msMojo::URL::::protocolMojo::URL::protocol
304690196632ms25.8sMojo::URL::::__ANON__[:3]Mojo::URL::__ANON__[:3]
23935911485ms25.2sMojo::URL::::to_stringMojo::URL::to_string
5714111151ms830msMojo::URL::::_decodeMojo::URL::_decode
4600044131ms169msMojo::URL::::is_absMojo::URL::is_abs
1994042167.3ms67.3msMojo::URL::::CORE:substMojo::URL::CORE:subst (opcode)
11117.3ms156msMojo::URL::::BEGIN@2Mojo::URL::BEGIN@2
1112.44ms2.90msMojo::URL::::BEGIN@5Mojo::URL::BEGIN@5
1112.11ms2.45msMojo::URL::::BEGIN@6Mojo::URL::BEGIN@6
792211.74ms64.9msMojo::URL::::to_unsafe_stringMojo::URL::to_unsafe_string
11113µs38µsMojo::URL::::BEGIN@3Mojo::URL::BEGIN@3
11111µs157µsMojo::URL::::BEGIN@7Mojo::URL::BEGIN@7
0000s0sMojo::URL::::__ANON__[:9]Mojo::URL::__ANON__[:9]
0000s0sMojo::URL::::passwordMojo::URL::password
0000s0sMojo::URL::::usernameMojo::URL::username
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Mojo::URL;
22527µs2156ms
# spent 156ms (17.3+139) within Mojo::URL::BEGIN@2 which was called: # once (17.3ms+139ms) by JSON::Schema::Modern::BEGIN@23 at line 2
use Mojo::Base -base;
# spent 156ms making 1 call to Mojo::URL::BEGIN@2 # spent 232µs making 1 call to Mojo::Base::import
3304692770ms23936125.2s
# spent 25.8s (632ms+25.2) within Mojo::URL::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/URL.pm:3] which was called 304690 times, avg 85µs/call: # 91595 times (222ms+9.81s) by JSON::Schema::Modern::_eval_subschema at line 548 of JSON/Schema/Modern.pm, avg 110µs/call # 91595 times (202ms+7.98s) by JSON::Schema::Modern::_eval_subschema at line 549 of JSON/Schema/Modern.pm, avg 89µs/call # 47668 times (115ms+6.53s) by Data::Perl::Role::Collection::Hash::get at line 24 of Data/Perl/Role/Collection/Hash.pm, avg 139µs/call # 33963 times (43.1ms+0s) by Mojo::URL::to_abs at line 127, avg 1µs/call # 31362 times (30.0ms+0s) by Mojo::URL::clone at line 16, avg 956ns/call # 4217 times (8.65ms+429ms) by JSON::Schema::Modern::Utilities::E at line 218 of JSON/Schema/Modern/Utilities.pm, avg 104µs/call # 4071 times (10.3ms+443ms) by Mojo::URL::CORE:match at line 56, avg 111µs/call # 46 times (140µs+2.84ms) by JSON::Schema::Modern::Document::BUILD at line 168 of JSON/Schema/Modern/Document.pm, avg 65µs/call # 39 times (70µs+4.40ms) by Data::Perl::Role::Collection::Hash::set at line 33 of Data/Perl/Role/Collection/Hash.pm, avg 115µs/call # 39 times (70µs+3.79ms) by Data::Perl::Role::Collection::Hash::set at line 35 of Data/Perl/Role/Collection/Hash.pm, avg 99µs/call # 30 times (83µs+3.27ms) by JSON::Schema::Modern::Document::BUILD at line 149 of JSON/Schema/Modern/Document.pm, avg 112µs/call # 14 times (29µs+1.19ms) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_id at line 67 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 87µs/call # 12 times (17µs+766µs) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:676] at line 659 of JSON/Schema/Modern.pm, avg 65µs/call # 9 times (27µs+1.06ms) by JSON::Schema::Modern::add_schema at line 187 of JSON/Schema/Modern.pm, avg 121µs/call # 8 times (17µs+944µs) by JSON::Schema::Modern::_get_or_load_resource at line 814 of JSON/Schema/Modern.pm, avg 120µs/call # 8 times (14µs+534µs) by JSON::Schema::Modern::Document::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Document.pm:135] at line 122 of JSON/Schema/Modern/Document.pm, avg 68µs/call # 6 times (9µs+483µs) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:676] at line 655 of JSON/Schema/Modern.pm, avg 82µs/call # 6 times (9µs+0s) by JSON::Schema::Modern::add_schema at line 152 of JSON/Schema/Modern.pm, avg 2µs/call # 2 times (3µs+93µs) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:676] at line 652 of JSON/Schema/Modern.pm, avg 48µs/call # spent 38µs (13+25) within Mojo::URL::BEGIN@3 which was called: # once (13µs+25µs) by JSON::Schema::Modern::BEGIN@23 at line 3
use overload bool => sub {1}, '""' => sub { shift->to_string }, fallback => 1;
# spent 25.2s making 239359 calls to Mojo::URL::to_string, avg 105µs/call # spent 38µs making 1 call to Mojo::URL::BEGIN@3 # spent 25µs making 1 call to overload::import
4
52651µs22.90ms
# spent 2.90ms (2.44+458µs) within Mojo::URL::BEGIN@5 which was called: # once (2.44ms+458µs) by JSON::Schema::Modern::BEGIN@23 at line 5
use Mojo::Parameters;
# spent 2.90ms making 1 call to Mojo::URL::BEGIN@5 # spent 4µs making 1 call to Mojo::Base::import
62550µs22.45ms
# spent 2.45ms (2.11+340µs) within Mojo::URL::BEGIN@6 which was called: # once (2.11ms+340µs) by JSON::Schema::Modern::BEGIN@23 at line 6
use Mojo::Path;
# spent 2.45ms making 1 call to Mojo::URL::BEGIN@6 # spent 3µs making 1 call to Mojo::Base::import
722.13ms2303µs
# spent 157µs (11+146) within Mojo::URL::BEGIN@7 which was called: # once (11µs+146µs) by JSON::Schema::Modern::BEGIN@23 at line 7
use Mojo::Util qw(decode encode punycode_decode punycode_encode url_escape url_unescape);
# spent 157µs making 1 call to Mojo::URL::BEGIN@7 # spent 146µs making 1 call to Exporter::import
8
915µs144µshas base => sub { Mojo::URL->new };
# spent 44µs making 1 call to Mojo::URL::has
1012µs143µshas [qw(fragment host port scheme userinfo)];
# spent 43µs making 1 call to Mojo::URL::has
11
12
# spent 10.7s (4.33+6.38) within Mojo::URL::clone which was called 315836 times, avg 34µs/call: # 126625 times (1.79s+2.89s) by JSON::Schema::Modern::Utilities::canonical_uri at line 192 of JSON/Schema/Modern/Utilities.pm, avg 37µs/call # 45939 times (451ms+600ms) by Mojo::URL::to_abs at line 123, avg 23µs/call # 39123 times (569ms+1.61s) by JSON::Schema::Modern::_fetch_from_uri at line 856 of JSON/Schema/Modern.pm, avg 56µs/call # 39123 times (605ms+888ms) by JSON::Schema::Modern::_fetch_from_uri at line 869 of JSON/Schema/Modern.pm, avg 38µs/call # 31362 times (375ms+-375ms) by Mojo::URL::clone at line 16, avg 0s/call # 25862 times (425ms+599ms) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_id at line 90 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 40µs/call # 7758 times (114ms+171ms) by JSON::Schema::Modern::_fetch_from_uri at line 889 of JSON/Schema/Modern.pm, avg 37µs/call # 15 times (159µs+104µs) by JSON::Schema::Modern::Document::BUILD at line 145 of JSON/Schema/Modern/Document.pm, avg 18µs/call # 14 times (229µs+326µs) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_id at line 81 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 40µs/call # 14 times (76µs+63µs) by JSON::Schema::Modern::Document::traverse at line 178 of JSON/Schema/Modern/Document.pm, avg 10µs/call # once (20µs+20µs) by JSON::Schema::Modern::Document::OpenAPI::traverse at line 115 of JSON/Schema/Modern/Document/OpenAPI.pm
sub clone {
1331583671.3ms my $self = shift;
14315836249ms3158361.07s my $clone = $self->new;
# spent 1.07s making 315836 calls to Mojo::URL::new, avg 3µs/call
15315836853ms @$clone{keys %$self} = values %$self;
163158361.66s11893225.31s $clone->{$_} && ($clone->{$_} = $clone->{$_}->clone) for qw(base path query);
# spent 2.52s making 247494 calls to Mojo::Parameters::clone, avg 10µs/call # spent 2.37s making 315805 calls to Mojo::Path::clone, avg 8µs/call # spent 220ms making 315805 calls to Mojo::Path::__ANON__[Mojo/Path.pm:3], avg 696ns/call # spent 170ms making 247494 calls to Mojo::Parameters::__ANON__[Mojo/Parameters.pm:3], avg 685ns/call # spent 30.0ms making 31362 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 956ns/call # spent 1.02s making 31362 calls to Mojo::URL::clone, avg 33µs/call, recursion: max depth 1, sum of overlapping time 1.02s
17315836528ms return $clone;
18}
19
20
# spent 3.54s (1.68+1.86) within Mojo::URL::host_port which was called 339853 times, avg 10µs/call: # 240151 times (1.06s+1.48s) by Mojo::URL::_string at line 169, avg 11µs/call # 99702 times (625ms+384ms) by Mojo::URL::parse at line 63, avg 10µs/call
sub host_port {
2133985398.4ms my ($self, $host_port) = @_;
22
2333985362.6ms if (defined $host_port) {
2499702138ms9970230.4ms $self->port($1) if $host_port =~ s/:(\d+)$//;
# spent 30.4ms making 99702 calls to Mojo::URL::CORE:subst, avg 304ns/call
259970281.7ms99702210ms my $host = url_unescape $host_port;
# spent 210ms making 99702 calls to Mojo::Util::url_unescape, avg 2µs/call
2699702383ms199404143ms return $host =~ /[^\x00-\x7f]/ ? $self->ihost($host) : $self->host($host);
# spent 99.7ms making 99702 calls to Mojo::URL::host, avg 1000ns/call # spent 43.7ms making 99702 calls to Mojo::URL::CORE:match, avg 438ns/call
27 }
28
29240151222ms2401511.34s return undef unless defined(my $host = $self->ihost);
# spent 1.34s making 240151 calls to Mojo::URL::ihost, avg 6µs/call
30237920518ms237920140ms return $host unless defined(my $port = $self->port);
# spent 140ms making 237920 calls to Mojo::URL::port, avg 588ns/call
31 return "$host:$port";
32}
33
34
# spent 1.34s (1.01+335ms) within Mojo::URL::ihost which was called 240151 times, avg 6µs/call: # 240151 times (1.01s+335ms) by Mojo::URL::host_port at line 29, avg 6µs/call
sub ihost {
3524015139.3ms my $self = shift;
36
37 # Decode
3824015143.2ms return $self->host(join '.', map { /^xn--(.+)$/ ? punycode_decode $1 : $_ } split(/\./, shift, -1)) if @_;
39
40 # Check if host needs to be encoded
41240151264ms240151182ms return undef unless defined(my $host = $self->host);
# spent 182ms making 240151 calls to Mojo::URL::host, avg 759ns/call
42237920759ms237920153ms return $host unless $host =~ /[^\x00-\x7f]/;
# spent 153ms making 237920 calls to Mojo::URL::CORE:match, avg 641ns/call
43
44 # Encode
45 return join '.', map { /[^\x00-\x7f]/ ? ('xn--' . punycode_encode $_) : $_ } split(/\./, $host, -1);
46}
47
4846000131ms4600037.6ms
# spent 169ms (131+37.6) within Mojo::URL::is_abs which was called 46000 times, avg 4µs/call: # 45939 times (131ms+37.6ms) by Mojo::URL::to_abs at line 124, avg 4µs/call # 46 times (122µs+26µs) by JSON::Schema::Modern::Utilities::assert_uri at line 330 of JSON/Schema/Modern/Utilities.pm, avg 3µs/call # 14 times (36µs+8µs) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_id at line 69 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 3µs/call # once (4µs+0s) by Type::Tiny::__ANON__[(eval 425)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 425)[Sub/Quote.pm:3]
sub is_abs { !!shift->scheme }
# spent 37.6ms making 46000 calls to Mojo::URL::scheme, avg 818ns/call
49
504524461.11s58903110.6s
# spent 11.8s (1.20+10.6) within Mojo::URL::new which was called 452446 times, avg 26µs/call: # 315836 times (684ms+383ms) by Mojo::URL::clone at line 14, avg 3µs/call # 89213 times (308ms+4.57s) by JSON::Schema::Modern::_fetch_from_uri at line 865 of JSON/Schema/Modern.pm, avg 55µs/call # 39121 times (174ms+4.34s) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_ref at line 209 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 115µs/call # 2586 times (11.6ms+354ms) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_dynamicRef at line 231 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 141µs/call # 2586 times (8.65ms+351ms) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_dynamicRef at line 243 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 139µs/call # 757 times (2.34ms+177ms) by JSON::Schema::Modern::traverse at line 258 of JSON/Schema/Modern.pm, avg 237µs/call # 746 times (3.42ms+82.4ms) by JSON::Schema::Modern::Utilities::assert_uri_reference at line 313 of JSON/Schema/Modern/Utilities.pm, avg 115µs/call # 743 times (3.18ms+249ms) by JSON::Schema::Modern::traverse at line 235 of JSON/Schema/Modern.pm, avg 340µs/call # 743 times (2.80ms+82.8ms) by JSON::Schema::Modern::traverse at line 250 of JSON/Schema/Modern.pm, avg 115µs/call # 46 times (163µs+1.81ms) by JSON::Schema::Modern::Utilities::assert_uri at line 328 of JSON/Schema/Modern/Utilities.pm, avg 43µs/call # 15 times (67µs+955µs) by JSON::Schema::Modern::Document::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Document.pm:45] at line 45 of JSON/Schema/Modern/Document.pm, avg 68µs/call # 15 times (28µs+13µs) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_anchor at line 171 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 3µs/call # 14 times (40µs+588µs) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_id at line 51 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 45µs/call # 9 times (49µs+594µs) by JSON::Schema::Modern::add_schema at line 140 of JSON/Schema/Modern.pm, avg 71µs/call # 8 times (54µs+7µs) by JSON::Schema::Modern::Document::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Document.pm:38] at line 38 of JSON/Schema/Modern/Document.pm, avg 8µs/call # once (10µs+233µs) by JSON::Schema::Modern::Document::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Document.pm:39] at line 39 of JSON/Schema/Modern/Document.pm # once (3µs+67µs) by JSON::Schema::Modern::evaluate at line 303 of JSON/Schema/Modern.pm # once (2µs+67µs) by JSON::Schema::Modern::evaluate at line 323 of JSON/Schema/Modern.pm # once (7µs+55µs) by Type::Tiny::__ANON__[(eval 425)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 425)[Sub/Quote.pm:3] # once (2µs+31µs) by JSON::Schema::Modern::_fetch_from_uri at line 852 of JSON/Schema/Modern.pm # once (3µs+26µs) by JSON::Schema::Modern::Document::OpenAPI::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Document/OpenAPI.pm:56] at line 56 of JSON/Schema/Modern/Document/OpenAPI.pm # once (3µs+15µs) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_schema at line 132 of JSON/Schema/Modern/Vocabulary/Core.pm # once (1µs+0s) by JSON::Schema::Modern::evaluate at line 306 of JSON/Schema/Modern.pm
sub new { @_ > 1 ? shift->SUPER::new->parse(@_) : shift->SUPER::new }
# spent 10.1s making 136585 calls to Mojo::URL::parse, avg 74µs/call # spent 546ms making 452446 calls to Mojo::Base::new, avg 1µs/call
51
52
# spent 10.1s (1.62+8.43) within Mojo::URL::parse which was called 136585 times, avg 74µs/call: # 136585 times (1.62s+8.43s) by Mojo::URL::new at line 50, avg 74µs/call
sub parse {
5313658548.8ms my ($self, $url) = @_;
54
55 # Official regex from RFC 3986
56136585558ms1406561.31s $url =~ m!^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?!;
# spent 853ms making 136585 calls to Mojo::URL::CORE:match, avg 6µs/call # spent 453ms making 4071 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 111µs/call
57136585160ms99702152ms $self->scheme($2) if defined $2;
# spent 152ms making 99702 calls to Mojo::URL::scheme, avg 2µs/call
58136585181ms1365855.31s $self->path($5) if defined $5;
# spent 5.31s making 136585 calls to Mojo::URL::path, avg 39µs/call
5913658550.1ms $self->query($7) if defined $7;
60136585190ms1714231.08s $self->fragment(_decode(url_unescape $9)) if defined $9;
# spent 830ms making 57141 calls to Mojo::URL::_decode, avg 15µs/call # spent 179ms making 57141 calls to Mojo::Util::url_unescape, avg 3µs/call # spent 65.5ms making 57141 calls to Mojo::URL::fragment, avg 1µs/call
61136585100ms if (defined(my $auth = $4)) {
6299702152ms9970237.0ms $self->userinfo(_decode(url_unescape $1)) if $auth =~ s/^([^\@]+)\@//;
# spent 37.0ms making 99702 calls to Mojo::URL::CORE:subst, avg 371ns/call
639970273.3ms997021.01s $self->host_port($auth);
# spent 1.01s making 99702 calls to Mojo::URL::host_port, avg 10µs/call
64 }
65
66136585197ms return $self;
67}
68
69sub password { (shift->userinfo // '') =~ /:(.*)$/ ? $1 : undef }
70
71
# spent 6.48s (1.68+4.80) within Mojo::URL::path which was called 478625 times, avg 14µs/call: # 240151 times (694ms+129ms) by Mojo::URL::path_query at line 93, avg 3µs/call # 136585 times (693ms+4.62s) by Mojo::URL::parse at line 58, avg 39µs/call # 36204 times (111ms+18.8ms) by Mojo::URL::to_abs at line 147, avg 4µs/call # 33963 times (94.3ms+17.5ms) by Mojo::URL::to_abs at line 135, avg 3µs/call # 31722 times (86.9ms+15.9ms) by Mojo::URL::to_abs at line 140, avg 3µs/call
sub path {
7247862575.7ms my $self = shift;
73
74 # Old path
75478625547ms478625626ms $self->{path} ||= Mojo::Path->new;
# spent 445ms making 136617 calls to Mojo::Path::new, avg 3µs/call # spent 181ms making 342008 calls to Mojo::Path::__ANON__[Mojo/Path.pm:3], avg 531ns/call
76478625508ms return $self->{path} unless @_;
77
78 # New path
79170548250ms1365854.17s $self->{path} = ref $_[0] ? $_[0] : $self->{path}->merge($_[0]);
# spent 4.17s making 136585 calls to Mojo::Path::merge, avg 31µs/call
80
81170548211ms return $self;
82}
83
84
# spent 12.0s (2.03+9.92) within Mojo::URL::path_query which was called 240151 times, avg 50µs/call: # 240151 times (2.03s+9.92s) by Mojo::URL::_string at line 177, avg 50µs/call
sub path_query {
8524015156.9ms my ($self, $pq) = @_;
86
8724015137.2ms if (defined $pq) {
88 return $self unless $pq =~ /^([^?#]*)(?:\?([^#]*))?/;
89 return defined $2 ? $self->path($1)->query($2) : $self->path($1);
90 }
91
92240151403ms4803022.86s my $query = $self->query->to_string;
# spent 1.80s making 240151 calls to Mojo::Parameters::to_string, avg 8µs/call # spent 1.06s making 240151 calls to Mojo::URL::query, avg 4µs/call
93240151924ms4803027.06s return $self->path->to_string . (length $query ? "?$query" : '');
# spent 6.24s making 240151 calls to Mojo::Path::to_string, avg 26µs/call # spent 823ms making 240151 calls to Mojo::URL::path, avg 3µs/call
94}
95
96240151599ms240151228ms
# spent 889ms (661+228) within Mojo::URL::protocol which was called 240151 times, avg 4µs/call: # 240151 times (661ms+228ms) by Mojo::URL::_string at line 166, avg 4µs/call
sub protocol { lc(shift->scheme // '') }
# spent 228ms making 240151 calls to Mojo::URL::scheme, avg 950ns/call
97
98
# spent 1.30s (995ms+308ms) within Mojo::URL::query which was called 287734 times, avg 5µs/call: # 240151 times (824ms+232ms) by Mojo::URL::path_query at line 92, avg 4µs/call # 47583 times (170ms+75.4ms) by Mojo::URL::to_abs at line 143, avg 5µs/call
sub query {
9928773448.4ms my $self = shift;
100
101 # Old parameters
102287734409ms287734308ms my $q = $self->{query} ||= Mojo::Parameters->new;
# spent 158ms making 46627 calls to Mojo::Parameters::new, avg 3µs/call # spent 149ms making 241107 calls to Mojo::Parameters::__ANON__[Mojo/Parameters.pm:3], avg 620ns/call
103287734385ms return $q unless @_;
104
105 # Replace with list
1061586123.8ms if (@_ > 1) { $q->pairs([])->parse(@_) }
107
108 # Merge with hash
109 elsif (ref $_[0] eq 'HASH') { $q->merge(%{$_[0]}) }
110
111 # Append array
112 elsif (ref $_[0] eq 'ARRAY') { $q->append(@{$_[0]}) }
113
114 # New parameters
1151586110.5ms else { $self->{query} = ref $_[0] ? $_[0] : $q->parse($_[0]) }
116
1171586120.8ms return $self;
118}
119
120
# spent 9.79s (1.62+8.17) within Mojo::URL::to_abs which was called 45939 times, avg 213µs/call: # 39121 times (1.46s+7.67s) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_ref at line 209 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 233µs/call # 4217 times (21.5ms+140ms) by JSON::Schema::Modern::Utilities::E at line 213 of JSON/Schema/Modern/Utilities.pm, avg 38µs/call # 2586 times (143ms+353ms) by JSON::Schema::Modern::Vocabulary::Core::_eval_keyword_dynamicRef at line 231 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 192µs/call # 15 times (742µs+2.31ms) by JSON::Schema::Modern::Vocabulary::Core::_traverse_keyword_anchor at line 171 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 203µs/call
sub to_abs {
1214593912.6ms my $self = shift;
122
1234593947.7ms459391.05s my $abs = $self->clone;
# spent 1.05s making 45939 calls to Mojo::URL::clone, avg 23µs/call
1244593978.2ms45939169ms return $abs if $abs->is_abs;
# spent 169ms making 45939 calls to Mojo::URL::is_abs, avg 4µs/call
125
126 # Scheme
1273396365.9ms3396343.1ms my $base = shift || $abs->base;
# spent 43.1ms making 33963 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 1µs/call
1283396398.5ms101889149ms $abs->base($base)->scheme($base->scheme);
# spent 85.9ms making 33963 calls to Mojo::URL::base, avg 3µs/call # spent 63.3ms making 67926 calls to Mojo::URL::scheme, avg 932ns/call
129
130 # Authority
1313396336.7ms3396320.5ms return $abs if $abs->host;
# spent 20.5ms making 33963 calls to Mojo::URL::host, avg 603ns/call
13233963141ms203778172ms $abs->userinfo($base->userinfo)->host($base->host)->port($base->port);
# spent 67.6ms making 67926 calls to Mojo::URL::host, avg 996ns/call # spent 52.8ms making 67926 calls to Mojo::URL::userinfo, avg 777ns/call # spent 52.0ms making 67926 calls to Mojo::URL::port, avg 765ns/call
133
134 # Absolute path
1353396336.8ms33963112ms my $path = $abs->path;
# spent 112ms making 33963 calls to Mojo::URL::path, avg 3µs/call
1363396336.2ms33963126ms return $abs if $path->leading_slash;
# spent 126ms making 33963 calls to Mojo::Path::leading_slash, avg 4µs/call
137
138 # Inherit path
1393396377.3ms3396393.6ms if (!@{$path->parts}) {
# spent 93.6ms making 33963 calls to Mojo::Path::parts, avg 3µs/call
1401586153.2ms63444825ms $abs->path($base->path->clone->canonicalize);
# spent 618ms making 15861 calls to Mojo::Path::canonicalize, avg 39µs/call # spent 104ms making 15861 calls to Mojo::Path::clone, avg 7µs/call # spent 103ms making 31722 calls to Mojo::URL::path, avg 3µs/call
141
142 # Query
1431586172.3ms79305534ms $abs->query($base->query->clone) unless length $abs->query->to_string;
# spent 246ms making 47583 calls to Mojo::URL::query, avg 5µs/call # spent 151ms making 15861 calls to Mojo::Parameters::clone, avg 10µs/call # spent 138ms making 15861 calls to Mojo::Parameters::to_string, avg 9µs/call
144 }
145
146 # Merge paths
1471810281.0ms905104.87s else { $abs->path($base->path->clone->merge($path)->canonicalize) }
# spent 4.40s making 18102 calls to Mojo::Path::merge, avg 243µs/call # spent 217ms making 18102 calls to Mojo::Path::canonicalize, avg 12µs/call # spent 130ms making 36204 calls to Mojo::URL::path, avg 4µs/call # spent 120ms making 18102 calls to Mojo::Path::clone, avg 7µs/call
148
14933963110ms return $abs;
150}
151
152239359479ms23935924.7s
# spent 25.2s (485ms+24.7) within Mojo::URL::to_string which was called 239359 times, avg 105µs/call: # 239359 times (485ms+24.7s) by Mojo::URL::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/URL.pm:3] at line 3, avg 105µs/call
sub to_string { shift->_string(0) }
# spent 24.7s making 239359 calls to Mojo::URL::_string, avg 103µs/call
1537921.69ms79263.2ms
# spent 64.9ms (1.74+63.2) within Mojo::URL::to_unsafe_string which was called 792 times, avg 82µs/call: # 746 times (1.62ms+59.4ms) by JSON::Schema::Modern::Utilities::assert_uri_reference at line 313 of JSON/Schema/Modern/Utilities.pm, avg 82µs/call # 46 times (118µs+3.76ms) by JSON::Schema::Modern::Utilities::assert_uri at line 330 of JSON/Schema/Modern/Utilities.pm, avg 84µs/call
sub to_unsafe_string { shift->_string(1) }
# spent 63.2ms making 792 calls to Mojo::URL::_string, avg 80µs/call
154
155sub username { (shift->userinfo // '') =~ /^([^:]+)/ ? $1 : undef }
156
15757141169ms57141679ms
# spent 830ms (151+679) within Mojo::URL::_decode which was called 57141 times, avg 15µs/call: # 57141 times (151ms+679ms) by Mojo::URL::parse at line 60, avg 15µs/call
sub _decode { decode('UTF-8', $_[0]) // $_[0] }
# spent 679ms making 57141 calls to Mojo::Util::decode, avg 12µs/call
158
159383578962ms7671564.35s
# spent 5.57s (1.23+4.35) within Mojo::URL::_encode which was called 383578 times, avg 15µs/call: # 237920 times (806ms+2.85s) by Mojo::URL::_string at line 170, avg 15µs/call # 145658 times (421ms+1.50s) by Mojo::URL::_string at line 182, avg 13µs/call
sub _encode { url_escape encode('UTF-8', $_[0]), $_[1] }
# spent 2.37s making 383578 calls to Mojo::Util::url_escape, avg 6µs/call # spent 1.98s making 383578 calls to Mojo::Util::encode, avg 5µs/call
160
161
# spent 24.8s (3.37+21.4) within Mojo::URL::_string which was called 240151 times, avg 103µs/call: # 239359 times (3.36s+21.4s) by Mojo::URL::to_string at line 152, avg 103µs/call # 792 times (9.82ms+53.4ms) by Mojo::URL::to_unsafe_string at line 153, avg 80µs/call
sub _string {
16224015178.8ms my ($self, $unsafe) = @_;
163
164 # Scheme
16524015160.7ms my $url = '';
166240151343ms240151889ms if (my $proto = $self->protocol) { $url .= "$proto:" }
# spent 889ms making 240151 calls to Mojo::URL::protocol, avg 4µs/call
167
168 # Authority
169240151199ms2401512.54s my $auth = $self->host_port;
# spent 2.54s making 240151 calls to Mojo::URL::host_port, avg 11µs/call
170240151306ms2379203.65s $auth = _encode($auth, '^A-Za-z0-9\-._~!$&\'()*+,;=:\[\]') if defined $auth;
# spent 3.65s making 237920 calls to Mojo::URL::_encode, avg 15µs/call
17124015138.5ms792500µs if ($unsafe && defined(my $info = $self->userinfo)) {
# spent 500µs making 792 calls to Mojo::URL::userinfo, avg 631ns/call
172 $auth = _encode($info, '^A-Za-z0-9\-._~!$&\'()*+,;=:') . '@' . $auth;
173 }
17424015199.0ms $url .= "//$auth" if defined $auth;
175
176 # Path and query
177240151247ms24015112.0s my $path = $self->path_query;
# spent 12.0s making 240151 calls to Mojo::URL::path_query, avg 50µs/call
178240151652ms237920245ms $url .= !$auth || !length $path || $path =~ m!^[/?]! ? $path : "/$path";
# spent 245ms making 237920 calls to Mojo::URL::CORE:match, avg 1µs/call
179
180 # Fragment
181240151401ms240151211ms return $url unless defined(my $fragment = $self->fragment);
# spent 211ms making 240151 calls to Mojo::URL::fragment, avg 878ns/call
182145658427ms1456581.92s return $url . '#' . _encode($fragment, '^A-Za-z0-9\-._~!$&\'()*+,;=:@/?');
# spent 1.92s making 145658 calls to Mojo::URL::_encode, avg 13µs/call
183}
184
18514µs1;
186
187=encoding utf8
188
189=head1 NAME
190
191Mojo::URL - Uniform Resource Locator
192
193=head1 SYNOPSIS
194
195 use Mojo::URL;
196
197 # Parse
198 my $url = Mojo::URL->new('http://sri:foo@example.com:3000/foo?foo=bar#23');
199 say $url->scheme;
200 say $url->userinfo;
201 say $url->host;
202 say $url->port;
203 say $url->path;
204 say $url->query;
205 say $url->fragment;
206
207 # Build
208 my $url = Mojo::URL->new;
209 $url->scheme('http');
210 $url->host('example.com');
211 $url->port(3000);
212 $url->path('/foo/bar');
213 $url->query(foo => 'bar');
214 $url->fragment(23);
215 say "$url";
216
217=head1 DESCRIPTION
218
219L<Mojo::URL> implements a subset of L<RFC 3986|https://tools.ietf.org/html/rfc3986>, L<RFC
2203987|https://tools.ietf.org/html/rfc3987> and the L<URL Living Standard|https://url.spec.whatwg.org> for Uniform
221Resource Locators with support for IDNA and IRIs.
222
223=head1 ATTRIBUTES
224
225L<Mojo::URL> implements the following attributes.
226
227=head2 base
228
229 my $base = $url->base;
230 $url = $url->base(Mojo::URL->new);
231
232Base of this URL, defaults to a L<Mojo::URL> object.
233
234 "http://example.com/a/b?c"
235 Mojo::URL->new("/a/b?c")->base(Mojo::URL->new("http://example.com"))->to_abs;
236
237=head2 fragment
238
239 my $fragment = $url->fragment;
240 $url = $url->fragment('♥mojolicious♥');
241
242Fragment part of this URL.
243
244 # "yada"
245 Mojo::URL->new('http://example.com/foo?bar=baz#yada')->fragment;
246
247=head2 host
248
249 my $host = $url->host;
250 $url = $url->host('127.0.0.1');
251
252Host part of this URL.
253
254 # "example.com"
255 Mojo::URL->new('http://sri:t3st@example.com:8080/foo')->host;
256
257=head2 port
258
259 my $port = $url->port;
260 $url = $url->port(8080);
261
262Port part of this URL.
263
264 # "8080"
265 Mojo::URL->new('http://sri:t3st@example.com:8080/foo')->port;
266
267=head2 scheme
268
269 my $scheme = $url->scheme;
270 $url = $url->scheme('http');
271
272Scheme part of this URL.
273
274 # "http"
275 Mojo::URL->new('http://example.com/foo')->scheme;
276
277=head2 userinfo
278
279 my $info = $url->userinfo;
280 $url = $url->userinfo('root:♥');
281
282Userinfo part of this URL.
283
284 # "sri:t3st"
285 Mojo::URL->new('https://sri:t3st@example.com/foo')->userinfo;
286
287=head1 METHODS
288
289L<Mojo::URL> inherits all methods from L<Mojo::Base> and implements the following new ones.
290
291=head2 clone
292
293 my $url2 = $url->clone;
294
295Return a new L<Mojo::URL> object cloned from this URL.
296
297=head2 host_port
298
299 my $host_port = $url->host_port;
300 $url = $url->host_port('example.com:8080');
301
302Normalized version of L</"host"> and L</"port">.
303
304 # "xn--n3h.net:8080"
305 Mojo::URL->new('http://☃.net:8080/test')->host_port;
306
307 # "example.com"
308 Mojo::URL->new('http://example.com/test')->host_port;
309
310=head2 ihost
311
312 my $ihost = $url->ihost;
313 $url = $url->ihost('xn--bcher-kva.ch');
314
315Host part of this URL in punycode format.
316
317 # "xn--n3h.net"
318 Mojo::URL->new('http://☃.net')->ihost;
319
320 # "example.com"
321 Mojo::URL->new('http://example.com')->ihost;
322
323=head2 is_abs
324
325 my $bool = $url->is_abs;
326
327Check if URL is absolute.
328
329 # True
330 Mojo::URL->new('http://example.com')->is_abs;
331 Mojo::URL->new('http://example.com/test/index.html')->is_abs;
332
333 # False
334 Mojo::URL->new('test/index.html')->is_abs;
335 Mojo::URL->new('/test/index.html')->is_abs;
336 Mojo::URL->new('//example.com/test/index.html')->is_abs;
337
338=head2 new
339
340 my $url = Mojo::URL->new;
341 my $url = Mojo::URL->new('http://127.0.0.1:3000/foo?f=b&baz=2#foo');
342
343Construct a new L<Mojo::URL> object and L</"parse"> URL if necessary.
344
345=head2 parse
346
347 $url = $url->parse('http://127.0.0.1:3000/foo/bar?fo=o&baz=23#foo');
348
349Parse relative or absolute URL.
350
351 # "/test/123"
352 $url->parse('/test/123?foo=bar')->path;
353
354 # "example.com"
355 $url->parse('http://example.com/test/123?foo=bar')->host;
356
357 # "sri@example.com"
358 $url->parse('mailto:sri@example.com')->path;
359
360=head2 password
361
362 my $password = $url->password;
363
364Password part of L</"userinfo">.
365
366 # "s3cret"
367 Mojo::URL->new('http://isabel:s3cret@mojolicious.org')->password;
368
369 # "s:3:c:r:e:t"
370 Mojo::URL->new('http://isabel:s:3:c:r:e:t@mojolicious.org')->password;
371
372=head2 path
373
374 my $path = $url->path;
375 $url = $url->path('foo/bar');
376 $url = $url->path('/foo/bar');
377 $url = $url->path(Mojo::Path->new);
378
379Path part of this URL, relative paths will be merged with L<Mojo::Path/"merge">, defaults to a L<Mojo::Path> object.
380
381 # "test"
382 Mojo::URL->new('http://example.com/test/Mojo')->path->parts->[0];
383
384 # "/test/DOM/HTML"
385 Mojo::URL->new('http://example.com/test/Mojo')->path->merge('DOM/HTML');
386
387 # "http://example.com/DOM/HTML"
388 Mojo::URL->new('http://example.com/test/Mojo')->path('/DOM/HTML');
389
390 # "http://example.com/test/DOM/HTML"
391 Mojo::URL->new('http://example.com/test/Mojo')->path('DOM/HTML');
392
393 # "http://example.com/test/Mojo/DOM/HTML"
394 Mojo::URL->new('http://example.com/test/Mojo/')->path('DOM/HTML');
395
396=head2 path_query
397
398 my $path_query = $url->path_query;
399 $url = $url->path_query('/foo/bar?a=1&b=2');
400
401Normalized version of L</"path"> and L</"query">.
402
403 # "/test?a=1&b=2"
404 Mojo::URL->new('http://example.com/test?a=1&b=2')->path_query;
405
406 # "/"
407 Mojo::URL->new('http://example.com/')->path_query;
408
409=head2 protocol
410
411 my $proto = $url->protocol;
412
413Normalized version of L</"scheme">.
414
415 # "http"
416 Mojo::URL->new('HtTp://example.com')->protocol;
417
418=head2 query
419
420 my $query = $url->query;
421 $url = $url->query({merge => 'to'});
422 $url = $url->query([append => 'with']);
423 $url = $url->query(replace => 'with');
424 $url = $url->query('a=1&b=2');
425 $url = $url->query(Mojo::Parameters->new);
426
427Query part of this URL, key/value pairs in an array reference will be appended with L<Mojo::Parameters/"append">, and
428key/value pairs in a hash reference merged with L<Mojo::Parameters/"merge">, defaults to a L<Mojo::Parameters> object.
429
430 # "2"
431 Mojo::URL->new('http://example.com?a=1&b=2')->query->param('b');
432
433 # "a=2&b=2&c=3"
434 Mojo::URL->new('http://example.com?a=1&b=2')->query->merge(a => 2, c => 3);
435
436 # "http://example.com?a=2&c=3"
437 Mojo::URL->new('http://example.com?a=1&b=2')->query(a => 2, c => 3);
438
439 # "http://example.com?a=2&a=3"
440 Mojo::URL->new('http://example.com?a=1&b=2')->query(a => [2, 3]);
441
442 # "http://example.com?a=2&b=2&c=3"
443 Mojo::URL->new('http://example.com?a=1&b=2')->query({a => 2, c => 3});
444
445 # "http://example.com?b=2"
446 Mojo::URL->new('http://example.com?a=1&b=2')->query({a => undef});
447
448 # "http://example.com?a=1&b=2&a=2&c=3"
449 Mojo::URL->new('http://example.com?a=1&b=2')->query([a => 2, c => 3]);
450
451=head2 to_abs
452
453 my $abs = $url->to_abs;
454 my $abs = $url->to_abs(Mojo::URL->new('http://example.com/foo'));
455
456Return a new L<Mojo::URL> object cloned from this relative URL and turn it into an absolute one using L</"base"> or
457provided base URL.
458
459 # "http://example.com/foo/baz.xml?test=123"
460 Mojo::URL->new('baz.xml?test=123')
461 ->to_abs(Mojo::URL->new('http://example.com/foo/bar.html'));
462
463 # "http://example.com/baz.xml?test=123"
464 Mojo::URL->new('/baz.xml?test=123')
465 ->to_abs(Mojo::URL->new('http://example.com/foo/bar.html'));
466
467 # "http://example.com/foo/baz.xml?test=123"
468 Mojo::URL->new('//example.com/foo/baz.xml?test=123')
469 ->to_abs(Mojo::URL->new('http://example.com/foo/bar.html'));
470
471=head2 to_string
472
473 my $str = $url->to_string;
474
475Turn URL into a string. Note that L</"userinfo"> will not be included for security reasons.
476
477 # "http://mojolicious.org"
478 Mojo::URL->new->scheme('http')->host('mojolicious.org')->to_string;
479
480 # "http://mojolicious.org"
481 Mojo::URL->new('http://daniel:s3cret@mojolicious.org')->to_string;
482
483=head2 to_unsafe_string
484
485 my $str = $url->to_unsafe_string;
486
487Same as L</"to_string">, but includes L</"userinfo">.
488
489 # "http://daniel:s3cret@mojolicious.org"
490 Mojo::URL->new('http://daniel:s3cret@mojolicious.org')->to_unsafe_string;
491
492=head2 username
493
494 my $username = $url->username;
495
496Username part of L</"userinfo">.
497
498 # "isabel"
499 Mojo::URL->new('http://isabel:s3cret@mojolicious.org')->username;
500
501=head1 OPERATORS
502
503L<Mojo::URL> overloads the following operators.
504
505=head2 bool
506
507 my $bool = !!$url;
508
509Always true.
510
511=head2 stringify
512
513 my $str = "$url";
514
515Alias for L</"to_string">.
516
517=head1 SEE ALSO
518
519L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
520
521=cut
 
# spent 1.29s (841ms+453ms) within Mojo::URL::CORE:match which was called 712127 times, avg 2µs/call: # 237920 times (245ms+0s) by Mojo::URL::_string at line 178, avg 1µs/call # 237920 times (153ms+0s) by Mojo::URL::ihost at line 42, avg 641ns/call # 136585 times (399ms+453ms) by Mojo::URL::parse at line 56, avg 6µs/call # 99702 times (43.7ms+0s) by Mojo::URL::host_port at line 26, avg 438ns/call
sub Mojo::URL::CORE:match; # opcode
# spent 67.3ms within Mojo::URL::CORE:subst which was called 199404 times, avg 338ns/call: # 99702 times (37.0ms+0s) by Mojo::URL::parse at line 62, avg 371ns/call # 99702 times (30.4ms+0s) by Mojo::URL::host_port at line 24, avg 304ns/call
sub Mojo::URL::CORE:subst; # opcode