| 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 | Mojo::URL::clone (recurses: max depth 1, inclusive time 1.02s) |
| 240151 | 2 | 1 | 3.37s | 24.8s | Mojo::URL::_string |
| 240151 | 1 | 1 | 2.03s | 12.0s | Mojo::URL::path_query |
| 339853 | 2 | 1 | 1.68s | 3.54s | Mojo::URL::host_port |
| 478625 | 5 | 1 | 1.68s | 6.48s | Mojo::URL::path |
| 45939 | 4 | 2 | 1.62s | 9.79s | Mojo::URL::to_abs |
| 136585 | 1 | 1 | 1.62s | 10.1s | Mojo::URL::parse |
| 383578 | 2 | 1 | 1.23s | 5.57s | Mojo::URL::_encode |
| 452446 | 23 | 7 | 1.20s | 11.8s | Mojo::URL::new |
| 240151 | 1 | 1 | 1.01s | 1.34s | Mojo::URL::ihost |
| 287734 | 2 | 1 | 995ms | 1.30s | Mojo::URL::query |
| 712127 | 4 | 1 | 841ms | 1.29s | Mojo::URL::CORE:match (opcode) |
| 240151 | 1 | 1 | 661ms | 889ms | Mojo::URL::protocol |
| 304690 | 19 | 6 | 632ms | 25.8s | Mojo::URL::__ANON__[:3] |
| 239359 | 1 | 1 | 485ms | 25.2s | Mojo::URL::to_string |
| 57141 | 1 | 1 | 151ms | 830ms | Mojo::URL::_decode |
| 46000 | 4 | 4 | 131ms | 169ms | Mojo::URL::is_abs |
| 199404 | 2 | 1 | 67.3ms | 67.3ms | Mojo::URL::CORE:subst (opcode) |
| 1 | 1 | 1 | 17.3ms | 156ms | Mojo::URL::BEGIN@2 |
| 1 | 1 | 1 | 2.44ms | 2.90ms | Mojo::URL::BEGIN@5 |
| 1 | 1 | 1 | 2.11ms | 2.45ms | Mojo::URL::BEGIN@6 |
| 792 | 2 | 1 | 1.74ms | 64.9ms | Mojo::URL::to_unsafe_string |
| 1 | 1 | 1 | 13µs | 38µs | Mojo::URL::BEGIN@3 |
| 1 | 1 | 1 | 11µs | 157µs | Mojo::URL::BEGIN@7 |
| 0 | 0 | 0 | 0s | 0s | Mojo::URL::__ANON__[:9] |
| 0 | 0 | 0 | 0s | 0s | Mojo::URL::password |
| 0 | 0 | 0 | 0s | 0s | Mojo::URL::username |
| 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 |