Filename | /usr/local/share/perl/5.18.2/HTTP/Headers/ActionPack.pm |
Statements | Executed 900025 statements in 6.71s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
100001 | 1 | 1 | 4.44s | 4.44s | new | HTTP::Headers::ActionPack::
100001 | 1 | 1 | 2.05s | 42.7s | create_header | HTTP::Headers::ActionPack::
1 | 1 | 1 | 9µs | 41µs | BEGIN@13 | HTTP::Headers::ActionPack::
1 | 1 | 1 | 8µs | 23µs | BEGIN@15 | HTTP::Headers::ActionPack::
1 | 1 | 1 | 7µs | 10µs | BEGIN@11 | HTTP::Headers::ActionPack::
1 | 1 | 1 | 7µs | 27µs | BEGIN@14 | HTTP::Headers::ActionPack::
1 | 1 | 1 | 6µs | 6µs | BEGIN@2 | HTTP::Headers::ActionPack::
1 | 1 | 1 | 6µs | 15µs | BEGIN@10 | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | _inflate_generic_request | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | _inflate_http_headers | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | classes | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | create | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | get_content_negotiator | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | has_mapping | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | inflate | HTTP::Headers::ActionPack::
0 | 0 | 0 | 0s | 0s | mappings | HTTP::Headers::ActionPack::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package HTTP::Headers::ActionPack; | ||||
2 | # spent 6µs within HTTP::Headers::ActionPack::BEGIN@2 which was called:
# once (6µs+0s) by PONAPI::Server::BEGIN@11 at line 4 | ||||
3 | 1 | 4µs | $HTTP::Headers::ActionPack::AUTHORITY = 'cpan:STEVAN'; | ||
4 | 1 | 24µs | 1 | 6µs | } # spent 6µs making 1 call to HTTP::Headers::ActionPack::BEGIN@2 |
5 | { | ||||
6 | 2 | 900ns | $HTTP::Headers::ActionPack::VERSION = '0.09'; | ||
7 | } | ||||
8 | # ABSTRACT: HTTP Action, Adventure and Excitement | ||||
9 | |||||
10 | 2 | 22µs | 2 | 25µs | # spent 15µs (6+10) within HTTP::Headers::ActionPack::BEGIN@10 which was called:
# once (6µs+10µs) by PONAPI::Server::BEGIN@11 at line 10 # spent 15µs making 1 call to HTTP::Headers::ActionPack::BEGIN@10
# spent 10µs making 1 call to strict::import |
11 | 2 | 22µs | 2 | 13µs | # spent 10µs (7+3) within HTTP::Headers::ActionPack::BEGIN@11 which was called:
# once (7µs+3µs) by PONAPI::Server::BEGIN@11 at line 11 # spent 10µs making 1 call to HTTP::Headers::ActionPack::BEGIN@11
# spent 3µs making 1 call to warnings::import |
12 | |||||
13 | 2 | 23µs | 2 | 72µs | # spent 41µs (9+31) within HTTP::Headers::ActionPack::BEGIN@13 which was called:
# once (9µs+31µs) by PONAPI::Server::BEGIN@11 at line 13 # spent 41µs making 1 call to HTTP::Headers::ActionPack::BEGIN@13
# spent 31µs making 1 call to Exporter::import |
14 | 2 | 22µs | 2 | 48µs | # spent 27µs (7+20) within HTTP::Headers::ActionPack::BEGIN@14 which was called:
# once (7µs+20µs) by PONAPI::Server::BEGIN@11 at line 14 # spent 27µs making 1 call to HTTP::Headers::ActionPack::BEGIN@14
# spent 20µs making 1 call to Exporter::import |
15 | 2 | 470µs | 2 | 37µs | # spent 23µs (8+14) within HTTP::Headers::ActionPack::BEGIN@15 which was called:
# once (8µs+14µs) by PONAPI::Server::BEGIN@11 at line 15 # spent 23µs making 1 call to HTTP::Headers::ActionPack::BEGIN@15
# spent 14µs making 1 call to Module::Runtime::import |
16 | |||||
17 | 1 | 2µs | my @DEFAULT_CLASSES = qw[ | ||
18 | HTTP::Headers::ActionPack::AcceptCharset | ||||
19 | HTTP::Headers::ActionPack::AcceptLanguage | ||||
20 | HTTP::Headers::ActionPack::AuthenticationInfo | ||||
21 | HTTP::Headers::ActionPack::Authorization | ||||
22 | HTTP::Headers::ActionPack::Authorization::Basic | ||||
23 | HTTP::Headers::ActionPack::Authorization::Digest | ||||
24 | HTTP::Headers::ActionPack::DateHeader | ||||
25 | HTTP::Headers::ActionPack::LinkHeader | ||||
26 | HTTP::Headers::ActionPack::LinkList | ||||
27 | HTTP::Headers::ActionPack::MediaType | ||||
28 | HTTP::Headers::ActionPack::MediaTypeList | ||||
29 | HTTP::Headers::ActionPack::PriorityList | ||||
30 | HTTP::Headers::ActionPack::WWWAuthenticate | ||||
31 | ]; | ||||
32 | |||||
33 | 1 | 7µs | my %DEFAULT_MAPPINGS = ( | ||
34 | 'link' => 'HTTP::Headers::ActionPack::LinkList', | ||||
35 | 'content-type' => 'HTTP::Headers::ActionPack::MediaType', | ||||
36 | 'accept' => 'HTTP::Headers::ActionPack::MediaTypeList', | ||||
37 | 'accept-charset' => 'HTTP::Headers::ActionPack::AcceptCharset', | ||||
38 | 'accept-encoding' => 'HTTP::Headers::ActionPack::PriorityList', | ||||
39 | 'accept-language' => 'HTTP::Headers::ActionPack::AcceptLanguage', | ||||
40 | 'date' => 'HTTP::Headers::ActionPack::DateHeader', | ||||
41 | 'client-date' => 'HTTP::Headers::ActionPack::DateHeader', # added by LWP | ||||
42 | 'expires' => 'HTTP::Headers::ActionPack::DateHeader', | ||||
43 | 'last-modified' => 'HTTP::Headers::ActionPack::DateHeader', | ||||
44 | 'if-unmodified-since' => 'HTTP::Headers::ActionPack::DateHeader', | ||||
45 | 'if-modified-since' => 'HTTP::Headers::ActionPack::DateHeader', | ||||
46 | 'www-authenticate' => 'HTTP::Headers::ActionPack::WWWAuthenticate', | ||||
47 | 'authentication-info' => 'HTTP::Headers::ActionPack::AuthenticationInfo', | ||||
48 | 'authorization' => 'HTTP::Headers::ActionPack::Authorization', | ||||
49 | ); | ||||
50 | |||||
51 | # spent 4.44s within HTTP::Headers::ActionPack::new which was called 100001 times, avg 44µs/call:
# 100001 times (4.44s+0s) by PONAPI::Server::_ponapi_check_headers at line 219 of lib/PONAPI/Server.pm, avg 44µs/call | ||||
52 | 100001 | 64.3ms | my $class = shift; | ||
53 | 100001 | 112ms | my %additional = @_; | ||
54 | 100001 | 1.75s | my %mappings = ( %DEFAULT_MAPPINGS, %additional ); | ||
55 | 100001 | 1.86s | my %classes = map { $_ => undef } ( @DEFAULT_CLASSES, values %additional ); | ||
56 | |||||
57 | 100001 | 1.05s | bless { | ||
58 | mappings => \%mappings, | ||||
59 | classes => \%classes | ||||
60 | } => $class; | ||||
61 | } | ||||
62 | |||||
63 | sub mappings { (shift)->{'mappings'} } | ||||
64 | sub classes { keys %{ (shift)->{'classes'} } } | ||||
65 | |||||
66 | sub has_mapping { | ||||
67 | my ($self, $header_name) = @_; | ||||
68 | exists $self->{'mappings'}->{ lc $header_name } ? 1 : 0 | ||||
69 | } | ||||
70 | |||||
71 | sub get_content_negotiator { | ||||
72 | use_module('HTTP::Headers::ActionPack::ContentNegotiation')->new( shift ); | ||||
73 | } | ||||
74 | |||||
75 | sub create { | ||||
76 | my ($self, $class_name, $args) = @_; | ||||
77 | |||||
78 | my $class = exists $self->{'classes'}->{ $class_name } | ||||
79 | ? $class_name | ||||
80 | : exists $self->{'classes'}->{ __PACKAGE__ . '::' . $class_name } | ||||
81 | ? __PACKAGE__ . '::' . $class_name | ||||
82 | : undef; | ||||
83 | |||||
84 | (defined $class) | ||||
85 | || confess "Could not find class '$class_name' (or 'HTTP::Headers::ActionPack::$class_name')"; | ||||
86 | |||||
87 | ref $args | ||||
88 | ? use_module( $class )->new( @$args ) | ||||
89 | : use_module( $class )->new_from_string( $args ); | ||||
90 | } | ||||
91 | |||||
92 | # spent 42.7s (2.05+40.7) within HTTP::Headers::ActionPack::create_header which was called 100001 times, avg 427µs/call:
# 100001 times (2.05s+40.7s) by PONAPI::Server::_ponapi_check_headers at line 222 of lib/PONAPI/Server.pm, avg 427µs/call | ||||
93 | 100001 | 95.6ms | my ($self, $header_name, $header_value) = @_; | ||
94 | |||||
95 | 100001 | 151ms | my $class = $self->{'mappings'}->{ lc $header_name }; | ||
96 | |||||
97 | 100001 | 49.9ms | (defined $class) | ||
98 | || confess "Could not find mapping for '$header_name'"; | ||||
99 | |||||
100 | 100001 | 1.57s | 200002 | 40.7s | ref $header_value # spent 33.2s making 100001 calls to HTTP::Headers::ActionPack::PriorityList::new_from_string, avg 332µs/call
# spent 7.49s making 100001 calls to Module::Runtime::use_module, avg 75µs/call |
101 | ? use_module( $class )->new( @$header_value ) | ||||
102 | : use_module( $class )->new_from_string( $header_value ); | ||||
103 | } | ||||
104 | |||||
105 | sub inflate { | ||||
106 | my $self = shift; | ||||
107 | return $self->_inflate_http_headers( @_ ) | ||||
108 | if $_[0]->isa('HTTP::Headers'); | ||||
109 | return $self->_inflate_generic_request( @_ ) | ||||
110 | if $_[0]->isa('HTTP::Request') | ||||
111 | || $_[0]->isa('Plack::Request') | ||||
112 | || $_[0]->isa('Web::Request'); | ||||
113 | confess "I don't know how to inflate '$_[0]'"; | ||||
114 | } | ||||
115 | |||||
116 | sub _inflate_http_headers { | ||||
117 | my ($self, $http_headers) = @_; | ||||
118 | foreach my $header ( keys %{ $self->{'mappings'} } ) { | ||||
119 | if ( my $old = $http_headers->header( $header ) ) { | ||||
120 | $http_headers->header( $header => $self->create_header( $header, $old ) ) | ||||
121 | unless blessed $old && $old->isa('HTTP::Headers::ActionPack::Core::Base'); | ||||
122 | } | ||||
123 | } | ||||
124 | return $http_headers; | ||||
125 | } | ||||
126 | |||||
127 | sub _inflate_generic_request { | ||||
128 | my ($self, $request) = @_; | ||||
129 | $self->_inflate_http_headers( $request->headers ); | ||||
130 | return $request; | ||||
131 | } | ||||
132 | |||||
133 | 1 | 5µs | 1; | ||
134 | |||||
135 | __END__ |