| 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__ |