File Coverage

blib/lib/Plack/Middleware/RequestId.pm
Criterion Covered Total %
statement 38 38 100.0
branch 12 12 100.0
condition 5 6 83.3
subroutine 9 9 100.0
pod 2 2 100.0
total 66 67 98.5


line stmt bran cond sub pod time code
1             package Plack::Middleware::RequestId;
2 2     2   13241 use strict;
  2         2  
  2         46  
3 2     2   6 use warnings;
  2         2  
  2         41  
4              
5 2     2   391 use parent 'Plack::Middleware';
  2         245  
  2         10  
6 2     2   10414 use Plack::Util;
  2         2  
  2         37  
7 2         8 use Plack::Util::Accessor qw/
8             psgi_env_key
9             http_header
10             req_http_header
11             id_generator
12             force_generate_id
13             env_key
14             no_http_header
15 2     2   7 /;
  2         2  
16              
17             our $VERSION = '0.06';
18              
19             our $request_id;
20              
21             sub prepare_app {
22 8     8 1 11157 my ($self) = @_;
23              
24 8 100       16 unless ($self->psgi_env_key) {
25 7         62 $self->psgi_env_key('psgix.request_id');
26             }
27              
28 8 100       37 unless ($self->http_header) {
29 6         20 $self->http_header('X-Request-Id');
30             }
31              
32 8         29 my $req_http_header = 'HTTP_'. uc $self->http_header;
33 8         39 $req_http_header =~ s/-/_/g;
34 8         14 $self->req_http_header($req_http_header);
35              
36 8 100       30 unless ($self->id_generator) {
37 4         418 require Data::UUID;
38 4         595 Data::UUID->import;
39 4         694 $self->{_uuid_obj} = Data::UUID->new;
40             $self->id_generator(sub {
41 3     3   251 substr $self->{_uuid_obj}->create_hex, 2, 32;
42 4         24 });
43             }
44             }
45              
46             sub call {
47 8     8 1 14133 my($self, $env) = @_;
48              
49             $request_id
50             = $env->{$self->psgi_env_key}
51             = (!$self->force_generate_id && $env->{$self->req_http_header})
52 8 100 100     17 ? $env->{$self->req_http_header}
53             : $self->id_generator->($env);
54              
55 8 100       146 if ($self->env_key) {
56 1         4 $ENV{$self->env_key} = $request_id;
57             }
58              
59 8         39 my $res = $self->app->($env);
60              
61             $self->response_cb($res, sub {
62 8     8   74 my $res = shift;
63 8 100 66     21 if ($res && !$self->no_http_header) {
64             Plack::Util::header_push(
65             $res->[1],
66             $self->http_header,
67 7         37 $env->{$self->psgi_env_key},
68             );
69             }
70 8         289 });
71             }
72              
73             1;
74              
75             __END__