File Coverage

blib/lib/Plack/Middleware/ExtractUriLanguage.pm
Criterion Covered Total %
statement 53 53 100.0
branch 11 12 91.6
condition 10 14 71.4
subroutine 10 10 100.0
pod 2 2 100.0
total 86 91 94.5


line stmt bran cond sub pod time code
1             #
2             # This file is part of Plack-Middleware-ExtractUriLanguage
3             #
4             # This software is Copyright (c) 2013 by BURNERSK.
5             #
6             # This is free software, licensed under:
7             #
8             # The Artistic License 2.0 (GPL Compatible)
9             #
10             package Plack::Middleware::ExtractUriLanguage;
11 4     4   214234 use strict;
  4         11  
  4         162  
12 4     4   20 use warnings FATAL => 'all';
  4         7  
  4         158  
13 4     4   22 use utf8;
  4         13  
  4         30  
14              
15             BEGIN {
16 4     4   345 our $VERSION = '0.004'; # VERSION
17             }
18              
19 4     4   3926 use parent 'Plack::Middleware';
  4         1141  
  4         18  
20 4         24 use Plack::Util::Accessor qw(
21             ExtractUriLanguageOrig
22             ExtractUriLanguageTag
23             ExtractUriLanguageList
24 4     4   77788 );
  4         10  
25 4     4   3110 use Plack::Middleware::ExtractUriLanguage::Type ':all';
  4         12  
  4         2378  
26              
27             ############################################################################
28             # Called once.
29             sub prepare_app {
30 6     6 1 2999 my ($self) = @_;
31              
32             # Precompose language tag regex.
33 6 100       28 if ( my $list = $self->ExtractUriLanguageList ) {
34 2 100 66     224 if ( defined $list && ref($list) ne 'ARRAY' ) {
    50          
35 1         6 my ( $package, $filename, $line ) = caller(6);
36 1         120 die sprintf "ExtractUriLanguageList is not an array reference at %s line %s.\n", $filename, $line;
37             }
38             elsif ( defined $list ) {
39 1         3 my $list_qm = join q{|}, map { quotemeta } @{$list};
  2         10  
  1         2  
40 1         62 $self->{extracturilanguage_list_qr} = [
41             qr{^/($list_qm)/?$},
42             qr{^/($list_qm)/(.*)$},
43             ];
44             }
45             }
46 5 100       265 if ( !$self->{extracturilanguage_list_qr} ) {
47 4         35 $self->{extracturilanguage_list_qr} = [
48             qr{^/([[:alpha:]]{2}(?:\-[[:alpha:]]{2})?)/?$},
49             qr{^/([[:alpha:]]{2}(?:\-[[:alpha:]]{2})?)/(.*)$},
50             ];
51             }
52              
53 5         15 return;
54             }
55              
56             ############################################################################
57             # Called on every reqeust.
58             sub call {
59 17     17 1 200808 my ( $self, $env ) = @_;
60 17         29 my $language_tag;
61 17   66     76 my $orig_name = $self->ExtractUriLanguageOrig || $DEFAULT_PATH_INFO_ORIG_FIELD;
62 17   66     352 my $tag_name = $self->ExtractUriLanguageTag || $DEFAULT_LANGUAGE_TAG_FIELD;
63 17   100     158 my $list = $self->ExtractUriLanguageList || undef;
64 17         165 my $path_info = $env->{$PATH_INFO_FIELD}; # is "/en-us/some-site" when "http://example.com/en-us/some-site".
65              
66 17         28 my ( $qr1, $qr2 ) = @{ $self->{extracturilanguage_list_qr} };
  17         42  
67 17 100 66     248 if ( $path_info =~ $qr1 || $path_info =~ $qr2 ) {
68 8         42 my ( $tag, $uri ) = ( $1, $2 );
69             {
70 4     4   40 no warnings 'uninitialized';
  4         5  
  4         592  
  8         13  
71 8         30 $uri = "/$uri";
72             }
73 8         13 $language_tag = $tag;
74 8         18 $path_info = $uri;
75             }
76              
77             # Manipulate environment only when a language tag was identified.
78 17 100       61 if ($language_tag) {
79 8         27 $env->{$tag_name} = $language_tag; # The language tag wich was found.
80 8         22 $env->{$orig_name} = $env->{$PATH_INFO_FIELD}; # The original PATH_INFO.
81 8         18 $env->{$PATH_INFO_FIELD} = $path_info; # The new manupulated PATH_INFO.
82             }
83              
84             # Dispatch request to application.
85 17         75 return $self->app->($env);
86             }
87              
88             ############################################################################
89             1;
90             __END__