File Coverage

blib/lib/Apache2/Mogile/Dispatch.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             # $Id: $
2              
3             package Apache2::Mogile::Dispatch;
4              
5 1     1   24948 use strict;
  1         3  
  1         41  
6 1     1   5 use warnings;
  1         2  
  1         29  
7              
8 1     1   1048 use English;
  1         5115  
  1         6  
9              
10 1     1   944 use APR::Table ();
  0            
  0            
11             use APR::SockAddr ();
12             use Apache2::RequestRec ();
13             use Apache2::RequestUtil ();
14             use Apache2::Connection ();
15             use Apache2::Filter ();
16             use Apache2::RequestRec ();
17             use Apache2::Module;
18             use Apache2::CmdParms ();
19             use Apache2::Directive ();
20             use Apache2::Log ();
21             use Apache2::URI ();
22             use Apache2::Const -compile => qw(DECLINED OK DONE NOT_FOUND);
23              
24             use MogileFS;
25              
26             our $VERSION = '0.2';
27              
28             sub handler {
29             my ($r) = @_;
30             my $cf = get_config($r);
31             my $host_info = get_direction($r, $cf);
32             if ($host_info && $host_info->{'reproxy'}) {
33             $r->err_headers_out->add('X-REPROXY-URL', $host_info->{'reproxy'} );
34             return Apache2::Const::DONE;
35             }
36             if (exists $host_info->{'mogile'} && $host_info->{'mogile'} eq '0') {
37             if ($cf->{'MogReproxyToken'}) {
38             $r->err_headers_out->add('X-REPROXY-SERVICE' => $cf->{'MogReproxyToken'});
39             } else {
40             my $good_path = get_working_path(@{ $cf->{'MogStaticServers'} || '' });
41             if (! $good_path) {
42             return Apache2::Const::NOT_FOUND;
43             }
44             $r->err_headers_out->add('X-REPROXY-URL', $good_path );
45             }
46             return Apache2::Const::DONE;
47             }
48             if ($host_info && $host_info->{'mogile'}) {
49             my $filekey = uri2key($r, $cf, $host_info);
50             my $mogfs = get_mogile_object([ @{$cf->{'MogTrackers'}} ], $cf->{'MogDomain'});
51             my @paths;
52             eval {
53             @paths = $mogfs->get_paths($filekey, 1);
54             };
55             if ($EVAL_ERROR) {
56             return Apache2::Const::NOT_FOUND;
57             }
58             my $working_path = get_working_path(@paths);
59             if (! $working_path) {
60             return Apache2::Const::NOT_FOUND;
61             }
62             if (usessi($r, $cf, $host_info)) {
63             $r->err_headers_out->add('X-REPROXY-URL', $working_path );
64             return Apache2::Const::DONE;
65             }
66             my $ua = LWP::UserAgent->new;
67             my $response = $ua->get($working_path);
68             if ($response->is_success) {
69             $r->print($response->content);
70             }
71             return Apache2::Const::DONE;
72             }
73             return Apache2::Const::DONE;
74             }
75              
76             sub get_mogile_object {
77             my ($hosts, $domain) = @_;
78             my $mog = MogileFS->new(
79             hosts => $hosts,
80             domain => $domain,
81             );
82             return $mog;
83             }
84              
85             sub get_working_path {
86             my (@uris) = @_;
87             my $ua = LWP::UserAgent->new;
88             for my $uri (@uris) {
89             my $response = $ua->head($uri);
90             if ($response->is_success) { return $uri; }
91             }
92             return 0;
93             }
94              
95             # XXX To be subclassed
96             sub mogile_key {
97             my ($r) = @_;
98             return $r->uri;
99             }
100              
101             # XXX To be subclassed
102             sub get_direction {
103             return ( 'mogile' => 1 );
104             }
105              
106             # XXX To be subclassed
107             sub get_config {
108             return {
109             'MogTrackers' => [ 'localhost:11211'],
110             'MogStaticServers' => ['localhost:80'],
111             'MogDomain' => 'localhost',
112             'MogReproxyToken' => 'legacy_web',
113             };
114             }
115              
116             # XXX To be subclassed
117             sub reproxy_request {
118             return 1;
119             }
120              
121             1;
122             __END__