Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/URL.pm |
Statements | Executed 13665563 statements in 19.6s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
315836 | 11 | 6 | 4.33s | 10.7s | clone (recurses: max depth 1, inclusive time 1.02s) | Mojo::URL::
240151 | 2 | 1 | 3.37s | 24.8s | _string | Mojo::URL::
240151 | 1 | 1 | 2.03s | 12.0s | path_query | Mojo::URL::
339853 | 2 | 1 | 1.68s | 3.54s | host_port | Mojo::URL::
478625 | 5 | 1 | 1.68s | 6.48s | path | Mojo::URL::
45939 | 4 | 2 | 1.62s | 9.79s | to_abs | Mojo::URL::
136585 | 1 | 1 | 1.62s | 10.1s | parse | Mojo::URL::
383578 | 2 | 1 | 1.23s | 5.57s | _encode | Mojo::URL::
452446 | 23 | 7 | 1.20s | 11.8s | new | Mojo::URL::
240151 | 1 | 1 | 1.01s | 1.34s | ihost | Mojo::URL::
287734 | 2 | 1 | 995ms | 1.30s | query | Mojo::URL::
712127 | 4 | 1 | 841ms | 1.29s | CORE:match (opcode) | Mojo::URL::
240151 | 1 | 1 | 661ms | 889ms | protocol | Mojo::URL::
304690 | 19 | 6 | 632ms | 25.8s | __ANON__[:3] | Mojo::URL::
239359 | 1 | 1 | 485ms | 25.2s | to_string | Mojo::URL::
57141 | 1 | 1 | 151ms | 830ms | _decode | Mojo::URL::
46000 | 4 | 4 | 131ms | 169ms | is_abs | Mojo::URL::
199404 | 2 | 1 | 67.3ms | 67.3ms | CORE:subst (opcode) | Mojo::URL::
1 | 1 | 1 | 17.3ms | 156ms | BEGIN@2 | Mojo::URL::
1 | 1 | 1 | 2.44ms | 2.90ms | BEGIN@5 | Mojo::URL::
1 | 1 | 1 | 2.11ms | 2.45ms | BEGIN@6 | Mojo::URL::
792 | 2 | 1 | 1.74ms | 64.9ms | to_unsafe_string | Mojo::URL::
1 | 1 | 1 | 13µs | 38µs | BEGIN@3 | Mojo::URL::
1 | 1 | 1 | 11µs | 157µs | BEGIN@7 | Mojo::URL::
0 | 0 | 0 | 0s | 0s | __ANON__[:9] | Mojo::URL::
0 | 0 | 0 | 0s | 0s | password | Mojo::URL::
0 | 0 | 0 | 0s | 0s | username | Mojo::URL::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Mojo::URL; | ||||
2 | 2 | 527µs | 2 | 156ms | # 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 # spent 156ms making 1 call to Mojo::URL::BEGIN@2
# spent 232µs making 1 call to Mojo::Base::import |
3 | 304692 | 770ms | 239361 | 25.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 # 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 | |||||
5 | 2 | 651µs | 2 | 2.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 # spent 2.90ms making 1 call to Mojo::URL::BEGIN@5
# spent 4µs making 1 call to Mojo::Base::import |
6 | 2 | 550µs | 2 | 2.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 # spent 2.45ms making 1 call to Mojo::URL::BEGIN@6
# spent 3µs making 1 call to Mojo::Base::import |
7 | 2 | 2.13ms | 2 | 303µ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 # spent 157µs making 1 call to Mojo::URL::BEGIN@7
# spent 146µs making 1 call to Exporter::import |
8 | |||||
9 | 1 | 5µs | 1 | 44µs | has base => sub { Mojo::URL->new }; # spent 44µs making 1 call to Mojo::URL::has |
10 | 1 | 2µs | 1 | 43µs | has [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 | ||||
13 | 315836 | 71.3ms | my $self = shift; | ||
14 | 315836 | 249ms | 315836 | 1.07s | my $clone = $self->new; # spent 1.07s making 315836 calls to Mojo::URL::new, avg 3µs/call |
15 | 315836 | 853ms | @$clone{keys %$self} = values %$self; | ||
16 | 315836 | 1.66s | 1189322 | 5.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 |
17 | 315836 | 528ms | return $clone; | ||
18 | } | ||||
19 | |||||
20 | sub host_port { | ||||
21 | 339853 | 98.4ms | my ($self, $host_port) = @_; | ||
22 | |||||
23 | 339853 | 62.6ms | if (defined $host_port) { | ||
24 | 99702 | 138ms | 99702 | 30.4ms | $self->port($1) if $host_port =~ s/:(\d+)$//; # spent 30.4ms making 99702 calls to Mojo::URL::CORE:subst, avg 304ns/call |
25 | 99702 | 81.7ms | 99702 | 210ms | my $host = url_unescape $host_port; # spent 210ms making 99702 calls to Mojo::Util::url_unescape, avg 2µs/call |
26 | 99702 | 383ms | 199404 | 143ms | 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 | |||||
29 | 240151 | 222ms | 240151 | 1.34s | return undef unless defined(my $host = $self->ihost); # spent 1.34s making 240151 calls to Mojo::URL::ihost, avg 6µs/call |
30 | 237920 | 518ms | 237920 | 140ms | 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 | ||||
35 | 240151 | 39.3ms | my $self = shift; | ||
36 | |||||
37 | # Decode | ||||
38 | 240151 | 43.2ms | return $self->host(join '.', map { /^xn--(.+)$/ ? punycode_decode $1 : $_ } split(/\./, shift, -1)) if @_; | ||
39 | |||||
40 | # Check if host needs to be encoded | ||||
41 | 240151 | 264ms | 240151 | 182ms | return undef unless defined(my $host = $self->host); # spent 182ms making 240151 calls to Mojo::URL::host, avg 759ns/call |
42 | 237920 | 759ms | 237920 | 153ms | 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 | |||||
48 | 46000 | 131ms | 46000 | 37.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] # spent 37.6ms making 46000 calls to Mojo::URL::scheme, avg 818ns/call |
49 | |||||
50 | 452446 | 1.11s | 589031 | 10.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 # 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 | ||||
53 | 136585 | 48.8ms | my ($self, $url) = @_; | ||
54 | |||||
55 | # Official regex from RFC 3986 | ||||
56 | 136585 | 558ms | 140656 | 1.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 |
57 | 136585 | 160ms | 99702 | 152ms | $self->scheme($2) if defined $2; # spent 152ms making 99702 calls to Mojo::URL::scheme, avg 2µs/call |
58 | 136585 | 181ms | 136585 | 5.31s | $self->path($5) if defined $5; # spent 5.31s making 136585 calls to Mojo::URL::path, avg 39µs/call |
59 | 136585 | 50.1ms | $self->query($7) if defined $7; | ||
60 | 136585 | 190ms | 171423 | 1.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 |
61 | 136585 | 100ms | if (defined(my $auth = $4)) { | ||
62 | 99702 | 152ms | 99702 | 37.0ms | $self->userinfo(_decode(url_unescape $1)) if $auth =~ s/^([^\@]+)\@//; # spent 37.0ms making 99702 calls to Mojo::URL::CORE:subst, avg 371ns/call |
63 | 99702 | 73.3ms | 99702 | 1.01s | $self->host_port($auth); # spent 1.01s making 99702 calls to Mojo::URL::host_port, avg 10µs/call |
64 | } | ||||
65 | |||||
66 | 136585 | 197ms | return $self; | ||
67 | } | ||||
68 | |||||
69 | sub 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 | ||||
72 | 478625 | 75.7ms | my $self = shift; | ||
73 | |||||
74 | # Old path | ||||
75 | 478625 | 547ms | 478625 | 626ms | $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 |
76 | 478625 | 508ms | return $self->{path} unless @_; | ||
77 | |||||
78 | # New path | ||||
79 | 170548 | 250ms | 136585 | 4.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 | |||||
81 | 170548 | 211ms | 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 | ||||
85 | 240151 | 56.9ms | my ($self, $pq) = @_; | ||
86 | |||||
87 | 240151 | 37.2ms | if (defined $pq) { | ||
88 | return $self unless $pq =~ /^([^?#]*)(?:\?([^#]*))?/; | ||||
89 | return defined $2 ? $self->path($1)->query($2) : $self->path($1); | ||||
90 | } | ||||
91 | |||||
92 | 240151 | 403ms | 480302 | 2.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 |
93 | 240151 | 924ms | 480302 | 7.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 | |||||
96 | 240151 | 599ms | 240151 | 228ms | # 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 # spent 228ms making 240151 calls to Mojo::URL::scheme, avg 950ns/call |
97 | |||||
98 | sub query { | ||||
99 | 287734 | 48.4ms | my $self = shift; | ||
100 | |||||
101 | # Old parameters | ||||
102 | 287734 | 409ms | 287734 | 308ms | 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 |
103 | 287734 | 385ms | return $q unless @_; | ||
104 | |||||
105 | # Replace with list | ||||
106 | 15861 | 23.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 | ||||
115 | 15861 | 10.5ms | else { $self->{query} = ref $_[0] ? $_[0] : $q->parse($_[0]) } | ||
116 | |||||
117 | 15861 | 20.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 | ||||
121 | 45939 | 12.6ms | my $self = shift; | ||
122 | |||||
123 | 45939 | 47.7ms | 45939 | 1.05s | my $abs = $self->clone; # spent 1.05s making 45939 calls to Mojo::URL::clone, avg 23µs/call |
124 | 45939 | 78.2ms | 45939 | 169ms | return $abs if $abs->is_abs; # spent 169ms making 45939 calls to Mojo::URL::is_abs, avg 4µs/call |
125 | |||||
126 | # Scheme | ||||
127 | 33963 | 65.9ms | 33963 | 43.1ms | my $base = shift || $abs->base; # spent 43.1ms making 33963 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 1µs/call |
128 | 33963 | 98.5ms | 101889 | 149ms | $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 | ||||
131 | 33963 | 36.7ms | 33963 | 20.5ms | return $abs if $abs->host; # spent 20.5ms making 33963 calls to Mojo::URL::host, avg 603ns/call |
132 | 33963 | 141ms | 203778 | 172ms | $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 | ||||
135 | 33963 | 36.8ms | 33963 | 112ms | my $path = $abs->path; # spent 112ms making 33963 calls to Mojo::URL::path, avg 3µs/call |
136 | 33963 | 36.2ms | 33963 | 126ms | return $abs if $path->leading_slash; # spent 126ms making 33963 calls to Mojo::Path::leading_slash, avg 4µs/call |
137 | |||||
138 | # Inherit path | ||||
139 | 33963 | 77.3ms | 33963 | 93.6ms | if (!@{$path->parts}) { # spent 93.6ms making 33963 calls to Mojo::Path::parts, avg 3µs/call |
140 | 15861 | 53.2ms | 63444 | 825ms | $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 | ||||
143 | 15861 | 72.3ms | 79305 | 534ms | $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 | ||||
147 | 18102 | 81.0ms | 90510 | 4.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 | |||||
149 | 33963 | 110ms | return $abs; | ||
150 | } | ||||
151 | |||||
152 | 239359 | 479ms | 239359 | 24.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 # spent 24.7s making 239359 calls to Mojo::URL::_string, avg 103µs/call |
153 | 792 | 1.69ms | 792 | 63.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 # spent 63.2ms making 792 calls to Mojo::URL::_string, avg 80µs/call |
154 | |||||
155 | sub username { (shift->userinfo // '') =~ /^([^:]+)/ ? $1 : undef } | ||||
156 | |||||
157 | 57141 | 169ms | 57141 | 679ms | # 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 # spent 679ms making 57141 calls to Mojo::Util::decode, avg 12µs/call |
158 | |||||
159 | 383578 | 962ms | 767156 | 4.35s | 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 | sub _string { | ||||
162 | 240151 | 78.8ms | my ($self, $unsafe) = @_; | ||
163 | |||||
164 | # Scheme | ||||
165 | 240151 | 60.7ms | my $url = ''; | ||
166 | 240151 | 343ms | 240151 | 889ms | if (my $proto = $self->protocol) { $url .= "$proto:" } # spent 889ms making 240151 calls to Mojo::URL::protocol, avg 4µs/call |
167 | |||||
168 | # Authority | ||||
169 | 240151 | 199ms | 240151 | 2.54s | my $auth = $self->host_port; # spent 2.54s making 240151 calls to Mojo::URL::host_port, avg 11µs/call |
170 | 240151 | 306ms | 237920 | 3.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 |
171 | 240151 | 38.5ms | 792 | 500µ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 | } | ||||
174 | 240151 | 99.0ms | $url .= "//$auth" if defined $auth; | ||
175 | |||||
176 | # Path and query | ||||
177 | 240151 | 247ms | 240151 | 12.0s | my $path = $self->path_query; # spent 12.0s making 240151 calls to Mojo::URL::path_query, avg 50µs/call |
178 | 240151 | 652ms | 237920 | 245ms | $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 | ||||
181 | 240151 | 401ms | 240151 | 211ms | return $url unless defined(my $fragment = $self->fragment); # spent 211ms making 240151 calls to Mojo::URL::fragment, avg 878ns/call |
182 | 145658 | 427ms | 145658 | 1.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 | |||||
185 | 1 | 4µs | 1; | ||
186 | |||||
187 | =encoding utf8 | ||||
188 | |||||
189 | =head1 NAME | ||||
190 | |||||
191 | Mojo::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 | |||||
219 | L<Mojo::URL> implements a subset of L<RFC 3986|https://tools.ietf.org/html/rfc3986>, L<RFC | ||||
220 | 3987|https://tools.ietf.org/html/rfc3987> and the L<URL Living Standard|https://url.spec.whatwg.org> for Uniform | ||||
221 | Resource Locators with support for IDNA and IRIs. | ||||
222 | |||||
223 | =head1 ATTRIBUTES | ||||
224 | |||||
225 | L<Mojo::URL> implements the following attributes. | ||||
226 | |||||
227 | =head2 base | ||||
228 | |||||
229 | my $base = $url->base; | ||||
230 | $url = $url->base(Mojo::URL->new); | ||||
231 | |||||
232 | Base 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 | |||||
242 | Fragment 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 | |||||
252 | Host 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 | |||||
262 | Port 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 | |||||
272 | Scheme 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 | |||||
282 | Userinfo part of this URL. | ||||
283 | |||||
284 | # "sri:t3st" | ||||
285 | Mojo::URL->new('https://sri:t3st@example.com/foo')->userinfo; | ||||
286 | |||||
287 | =head1 METHODS | ||||
288 | |||||
289 | L<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 | |||||
295 | Return 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 | |||||
302 | Normalized 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 | |||||
315 | Host 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 | |||||
327 | Check 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 | |||||
343 | Construct 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 | |||||
349 | Parse 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 | |||||
364 | Password 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 | |||||
379 | Path 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 | |||||
401 | Normalized 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 | |||||
413 | Normalized 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 | |||||
427 | Query part of this URL, key/value pairs in an array reference will be appended with L<Mojo::Parameters/"append">, and | ||||
428 | key/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 | |||||
456 | Return a new L<Mojo::URL> object cloned from this relative URL and turn it into an absolute one using L</"base"> or | ||||
457 | provided 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 | |||||
475 | Turn 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 | |||||
487 | Same 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 | |||||
496 | Username part of L</"userinfo">. | ||||
497 | |||||
498 | # "isabel" | ||||
499 | Mojo::URL->new('http://isabel:s3cret@mojolicious.org')->username; | ||||
500 | |||||
501 | =head1 OPERATORS | ||||
502 | |||||
503 | L<Mojo::URL> overloads the following operators. | ||||
504 | |||||
505 | =head2 bool | ||||
506 | |||||
507 | my $bool = !!$url; | ||||
508 | |||||
509 | Always true. | ||||
510 | |||||
511 | =head2 stringify | ||||
512 | |||||
513 | my $str = "$url"; | ||||
514 | |||||
515 | Alias for L</"to_string">. | ||||
516 | |||||
517 | =head1 SEE ALSO | ||||
518 | |||||
519 | L<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:subst; # opcode |