| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# $Id: WebUtils.pm,v 1.9 2003/07/10 09:43:20 matt Exp $ |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
# Original Code and comments from Steve Willer. |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
package AxKit::XSP::WebUtils; |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
$VERSION = "1.6"; |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
# taglib stuff |
|
10
|
1
|
|
|
1
|
|
8494
|
use AxKit 1.4; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
use Apache; |
|
12
|
|
|
|
|
|
|
use Apache::Constants qw(OK); |
|
13
|
|
|
|
|
|
|
use Apache::Util; |
|
14
|
|
|
|
|
|
|
use Apache::Request; |
|
15
|
|
|
|
|
|
|
use Apache::URI; |
|
16
|
|
|
|
|
|
|
use Apache::AxKit::Language::XSP::TaglibHelper; |
|
17
|
|
|
|
|
|
|
sub parse_char { Apache::AxKit::Language::XSP::TaglibHelper::parse_char(@_); } |
|
18
|
|
|
|
|
|
|
sub parse_start { Apache::AxKit::Language::XSP::TaglibHelper::parse_start(@_); } |
|
19
|
|
|
|
|
|
|
sub parse_end { Apache::AxKit::Language::XSP::TaglibHelper::parse_end(@_); } |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
$NS = 'http://axkit.org/NS/xsp/webutils/v1'; |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
@EXPORT_TAGLIB = ( |
|
24
|
|
|
|
|
|
|
'env_param($name)', |
|
25
|
|
|
|
|
|
|
'path_info()', |
|
26
|
|
|
|
|
|
|
'query_string()', |
|
27
|
|
|
|
|
|
|
'request_uri()', |
|
28
|
|
|
|
|
|
|
'request_host()', |
|
29
|
|
|
|
|
|
|
'server_root()', |
|
30
|
|
|
|
|
|
|
'redirect($uri;$host,$secure,$use_refresh)', |
|
31
|
|
|
|
|
|
|
'url_encode($string)', |
|
32
|
|
|
|
|
|
|
'url_decode($string)', |
|
33
|
|
|
|
|
|
|
'header($name;$value)', |
|
34
|
|
|
|
|
|
|
'return_code($code)', |
|
35
|
|
|
|
|
|
|
'username()', |
|
36
|
|
|
|
|
|
|
'password()', |
|
37
|
|
|
|
|
|
|
'request_parsed_uri(;$omit)', |
|
38
|
|
|
|
|
|
|
'request_prev_parsed_uri(;$omit)', |
|
39
|
|
|
|
|
|
|
'request_prev_uri()', |
|
40
|
|
|
|
|
|
|
'request_prev_query_string()', |
|
41
|
|
|
|
|
|
|
'request_prev_param($name)', |
|
42
|
|
|
|
|
|
|
'match_useragent($name)', |
|
43
|
|
|
|
|
|
|
'is_https()', |
|
44
|
|
|
|
|
|
|
'is_initial_req()', |
|
45
|
|
|
|
|
|
|
'variant_list():as_xml=true', |
|
46
|
|
|
|
|
|
|
'error_notes()', |
|
47
|
|
|
|
|
|
|
'server_admin()', |
|
48
|
|
|
|
|
|
|
); |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
@ISA = qw(Apache::AxKit::Language::XSP); |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
use strict; |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
sub env_param ($) { |
|
55
|
|
|
|
|
|
|
my ($name) = @_; |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
return $ENV{$name}; |
|
58
|
|
|
|
|
|
|
} |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
sub path_info () { |
|
61
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
62
|
|
|
|
|
|
|
return $Request->path_info; |
|
63
|
|
|
|
|
|
|
} |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub query_string () { |
|
66
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
67
|
|
|
|
|
|
|
return $Request->query_string; |
|
68
|
|
|
|
|
|
|
} |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
sub request_uri () { |
|
71
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
72
|
|
|
|
|
|
|
return $Request->uri; |
|
73
|
|
|
|
|
|
|
} |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
sub server_root () { |
|
76
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
77
|
|
|
|
|
|
|
return $Request->document_root; |
|
78
|
|
|
|
|
|
|
} |
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
sub request_host () { |
|
81
|
|
|
|
|
|
|
my $hostname = Apache->header_in('Via'); |
|
82
|
|
|
|
|
|
|
$hostname =~ s/^[0-9.]+ //g; |
|
83
|
|
|
|
|
|
|
$hostname =~ s/ .*//g; |
|
84
|
|
|
|
|
|
|
$hostname ||= $ENV{HTTP_HOST}; |
|
85
|
|
|
|
|
|
|
$hostname ||= Apache->header_in('Host'); |
|
86
|
|
|
|
|
|
|
return $hostname; |
|
87
|
|
|
|
|
|
|
} |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
sub redirect ($;$$$) { |
|
90
|
|
|
|
|
|
|
my ($uri, $host, $secure, $use_refresh) = @_; |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
if (lc($secure) eq 'yes') { $secure = 1 } |
|
93
|
|
|
|
|
|
|
elsif (lc($secure) eq 'no') { $secure = 0 } |
|
94
|
|
|
|
|
|
|
if (lc($use_refresh) eq 'yes') { $use_refresh = 1 } |
|
95
|
|
|
|
|
|
|
elsif (lc($use_refresh) eq 'no') { $use_refresh = 0 } |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
my $myhost = $host; |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
if ($uri !~ m|^https?://|oi) { |
|
102
|
|
|
|
|
|
|
if ($uri !~ m#^/#) { |
|
103
|
|
|
|
|
|
|
$uri = "./$uri" if $uri =~ /^\./; |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
# relative path, so let's resolve the path ourselves |
|
106
|
|
|
|
|
|
|
my $base = $Request->uri; |
|
107
|
|
|
|
|
|
|
$base =~ s{[^/]*$}{}; |
|
108
|
|
|
|
|
|
|
$uri = "$base$uri"; |
|
109
|
|
|
|
|
|
|
$uri =~ s{//+}{/}g; |
|
110
|
|
|
|
|
|
|
$uri =~ s{/.(/|$)}{/}g; # embedded ./ |
|
111
|
|
|
|
|
|
|
1 while ($uri =~ s{[^/]+/\.\.(/|$)}{}g); # embedded ../ |
|
112
|
|
|
|
|
|
|
$uri =~ s{^(/\.\.)+(/|$)}{/}g; # ../ off of "root" |
|
113
|
|
|
|
|
|
|
} |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
if (not defined $host) { |
|
116
|
|
|
|
|
|
|
$myhost = $Request->header_in("Host"); |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
# if we're going through a proxy, the virtual host is rewritten; yuck |
|
119
|
|
|
|
|
|
|
if ($myhost !~ /[a-zA-Z]/) { |
|
120
|
|
|
|
|
|
|
my $Server = $Request->server; |
|
121
|
|
|
|
|
|
|
$myhost = $Server->server_hostname; |
|
122
|
|
|
|
|
|
|
my $port = $Server->port; |
|
123
|
|
|
|
|
|
|
$myhost .= ":$port" if $port != 80; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
|
|
|
|
|
|
} |
|
126
|
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
my $scheme = 'http'; |
|
128
|
|
|
|
|
|
|
$scheme = 'https' if $secure; # Hmm, might break if $port was set above... |
|
129
|
|
|
|
|
|
|
if ($use_refresh) { |
|
130
|
|
|
|
|
|
|
$Request->header_out("Refresh" => "0; url=${scheme}://${myhost}${uri}"); |
|
131
|
|
|
|
|
|
|
$Request->content_type("text/html"); |
|
132
|
|
|
|
|
|
|
$Request->status(200); |
|
133
|
|
|
|
|
|
|
} |
|
134
|
|
|
|
|
|
|
else { |
|
135
|
|
|
|
|
|
|
$Request->header_out("Location" => "${scheme}://${myhost}${uri}"); |
|
136
|
|
|
|
|
|
|
$Request->status(302); |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
} |
|
139
|
|
|
|
|
|
|
else { |
|
140
|
|
|
|
|
|
|
if ($use_refresh) { |
|
141
|
|
|
|
|
|
|
$Request->header_out("Refresh" => "0; url=$uri"); |
|
142
|
|
|
|
|
|
|
$Request->content_type("text/html"); |
|
143
|
|
|
|
|
|
|
$Request->status(200); |
|
144
|
|
|
|
|
|
|
} |
|
145
|
|
|
|
|
|
|
else { |
|
146
|
|
|
|
|
|
|
$Request->header_out("Location" => $uri); |
|
147
|
|
|
|
|
|
|
$Request->status(302); |
|
148
|
|
|
|
|
|
|
} |
|
149
|
|
|
|
|
|
|
} |
|
150
|
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
$Request->send_http_header; |
|
152
|
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
Apache::exit(); |
|
154
|
|
|
|
|
|
|
} |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
sub header ($;$) { |
|
157
|
|
|
|
|
|
|
my $name = shift; |
|
158
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
if (@_) { |
|
161
|
|
|
|
|
|
|
return $r->header_out($name, $_[0]); |
|
162
|
|
|
|
|
|
|
} |
|
163
|
|
|
|
|
|
|
else { |
|
164
|
|
|
|
|
|
|
return $r->header_in($name); |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
sub url_encode ($) { |
|
169
|
|
|
|
|
|
|
return Apache::Util::escape_uri(shift); |
|
170
|
|
|
|
|
|
|
} |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
sub url_decode ($) { |
|
173
|
|
|
|
|
|
|
return Apache::Util::unescape_uri(shift); |
|
174
|
|
|
|
|
|
|
} |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
sub return_code ($) { |
|
177
|
|
|
|
|
|
|
my $code = shift; |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
my $Request = AxKit::Apache->request; |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
$Request->status($code); |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
$Request->send_http_header; |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
Apache::exit(); |
|
186
|
|
|
|
|
|
|
} |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
sub username () { |
|
189
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
return $r->connection->user; |
|
192
|
|
|
|
|
|
|
} |
|
193
|
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
sub password () { |
|
195
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
my ($res, $pwd) = $r->get_basic_auth_pw; |
|
198
|
|
|
|
|
|
|
if ($res == OK) { |
|
199
|
|
|
|
|
|
|
return $pwd; |
|
200
|
|
|
|
|
|
|
} |
|
201
|
|
|
|
|
|
|
return; |
|
202
|
|
|
|
|
|
|
} |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
sub request_parsed_uri ($) { |
|
205
|
|
|
|
|
|
|
my $omit = shift; |
|
206
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
207
|
|
|
|
|
|
|
my $uri = Apache::URI->parse($r); |
|
208
|
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
if ($omit eq 'path') { |
|
210
|
|
|
|
|
|
|
$uri->path(undef); |
|
211
|
|
|
|
|
|
|
$uri->query(undef); # we don't want a query without a path |
|
212
|
|
|
|
|
|
|
} |
|
213
|
|
|
|
|
|
|
elsif ($omit eq 'path_info' or $omit eq 'query') { |
|
214
|
|
|
|
|
|
|
$uri->$omit(undef); |
|
215
|
|
|
|
|
|
|
} |
|
216
|
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
return $uri->unparse; |
|
218
|
|
|
|
|
|
|
} |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
sub request_prev_parsed_uri ($) { |
|
221
|
|
|
|
|
|
|
my $omit = shift; |
|
222
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
223
|
|
|
|
|
|
|
my $uri = Apache::URI->parse($r->prev||$r); |
|
224
|
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
if ($omit eq 'path') { |
|
226
|
|
|
|
|
|
|
$uri->path(undef); |
|
227
|
|
|
|
|
|
|
$uri->query(undef); # we don't want a query without a path |
|
228
|
|
|
|
|
|
|
} |
|
229
|
|
|
|
|
|
|
elsif ($omit eq 'path_info' or $omit eq 'query') { |
|
230
|
|
|
|
|
|
|
$uri->$omit(undef); |
|
231
|
|
|
|
|
|
|
} |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
return $uri->unparse; |
|
234
|
|
|
|
|
|
|
} |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
sub request_prev_uri () { |
|
237
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
238
|
|
|
|
|
|
|
return ($r->prev||$r)->uri; |
|
239
|
|
|
|
|
|
|
} |
|
240
|
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
sub request_prev_query_string () { |
|
242
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
243
|
|
|
|
|
|
|
return ($r->prev||$r)->query_string; |
|
244
|
|
|
|
|
|
|
} |
|
245
|
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
sub request_prev_param ($) { |
|
247
|
|
|
|
|
|
|
my $name = shift; |
|
248
|
|
|
|
|
|
|
my $apr = Apache::Request->instance((AxKit::Apache->request->prev||AxKit::Apache->request)); |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
return $apr->param($name); |
|
251
|
|
|
|
|
|
|
} |
|
252
|
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
sub match_useragent ($) { |
|
254
|
|
|
|
|
|
|
my $name = shift; |
|
255
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
256
|
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
return $r->header_in('User-Agent') =~ $name; |
|
258
|
|
|
|
|
|
|
} |
|
259
|
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
sub is_https () { |
|
261
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
262
|
|
|
|
|
|
|
return 1 if $r->subprocess_env('https'); |
|
263
|
|
|
|
|
|
|
} |
|
264
|
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
sub is_initial_req () { |
|
266
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
267
|
|
|
|
|
|
|
return $r->is_initial_req; |
|
268
|
|
|
|
|
|
|
} |
|
269
|
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
sub variant_list () { |
|
271
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
272
|
|
|
|
|
|
|
my $variant_list = ($r->prev||$r)->notes('variant-list'); |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
$variant_list =~ s/([^:>])\n/$1<\/li>\n/g; # tidy up single li-tags because |
|
275
|
|
|
|
|
|
|
# mod_negotiation's list is not |
|
276
|
|
|
|
|
|
|
# well-balanced up to Apache 1.3.28 |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
return $variant_list; |
|
279
|
|
|
|
|
|
|
} |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
sub error_notes () { |
|
282
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
283
|
|
|
|
|
|
|
return ($r->prev||$r)->notes('error-notes'); |
|
284
|
|
|
|
|
|
|
} |
|
285
|
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
sub server_admin () { |
|
287
|
|
|
|
|
|
|
my $r = AxKit::Apache->request; |
|
288
|
|
|
|
|
|
|
return $r->server->server_admin; |
|
289
|
|
|
|
|
|
|
} |
|
290
|
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
1; |
|
293
|
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
__END__ |