line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Apache::Image; |
2
|
1
|
|
|
1
|
|
25617
|
use warnings; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
32
|
|
3
|
1
|
|
|
1
|
|
5
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
32
|
|
4
|
1
|
|
|
1
|
|
441
|
use Apache2::RequestRec (); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
use Apache2::RequestIO (); |
6
|
|
|
|
|
|
|
use Apache2::Const -compile => qw(OK NOT_FOUND HTTP_MOVED_TEMPORARILY); |
7
|
|
|
|
|
|
|
use Apache2::TrapSubRequest; |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
# XXX - Bug with getting uri/path_info |
10
|
|
|
|
|
|
|
# If /z/image exists it works |
11
|
|
|
|
|
|
|
# If /z/image does not, it is all broken |
12
|
|
|
|
|
|
|
# If /z/image/thubnail exists it drops the first part of path info ! |
13
|
|
|
|
|
|
|
# all bad |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
# XXX We should use Image::Thumbnail !!! |
16
|
|
|
|
|
|
|
use Image::Magick; |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
use Carp; |
19
|
|
|
|
|
|
|
use version; our $VERSION = qv('0.0.4'); |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
# TODO Can this be made to be Apaceh 1.3 (mod_perl 1) ? If not document the reason |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
sub handler { |
24
|
|
|
|
|
|
|
my $r = shift; |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# URI (original) & Configuration |
27
|
|
|
|
|
|
|
my $uri=$r->path_info; |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
# Get the size from config |
30
|
|
|
|
|
|
|
my $MaxSize=$r->dir_config("ImageMaxSize") || 50; |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# Force this size? Or only resize if larger? |
33
|
|
|
|
|
|
|
my $Force=$r->dir_config("ImageForce") || 0; |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
# Get our image from Apache |
36
|
|
|
|
|
|
|
my $image; |
37
|
|
|
|
|
|
|
my $subr = $r->lookup_uri($uri); |
38
|
|
|
|
|
|
|
# XXX Do other things like POST data etc. |
39
|
|
|
|
|
|
|
$subr->args($r->args); |
40
|
|
|
|
|
|
|
$subr->run_trapped(\$image); |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
# XXX Check not found or other error |
43
|
|
|
|
|
|
|
# XXX Check the Pragma and Expiry times for caching and setting local expiry times |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
# Check mime type is image (else return based on mime type) |
46
|
|
|
|
|
|
|
if ($subr->content_type !~ m|^image/([^\s]+)|) { |
47
|
|
|
|
|
|
|
# print STDERR "Not a valid type for $rest " . $subr->content_type . "\n"; |
48
|
|
|
|
|
|
|
# XXX Get this from configuration |
49
|
|
|
|
|
|
|
$r->internal_redirect("/z/resource/thumbnail/unknown.jpg"); |
50
|
|
|
|
|
|
|
# TODO Support mime type mapping to files (can we use Apache for this?) |
51
|
|
|
|
|
|
|
# TODO Future - Support creation of Thumbnails from other sources |
52
|
|
|
|
|
|
|
return Apache2::Const::OK; |
53
|
|
|
|
|
|
|
} |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
# XXX Caching - Write entries to a directory and use internal redirect |
56
|
|
|
|
|
|
|
# to get them - only problem may be that a tif wants to be a jpg |
57
|
|
|
|
|
|
|
# thumbnail |
58
|
|
|
|
|
|
|
# $r->internal_redirect("/unknown.jpg"); |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
# Process the image into a thumbnail and output |
61
|
|
|
|
|
|
|
my $im = Image::Magick->new; |
62
|
|
|
|
|
|
|
$im->BlobToImage($image); |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
# Resize if Force or Too big ! |
65
|
|
|
|
|
|
|
if ($Force || ($im->Get('width') > $MaxSize) || ($im->Get('height') > $MaxSize)) { |
66
|
|
|
|
|
|
|
$im->Scale(geometry => $MaxSize . 'x' . $MaxSize); |
67
|
|
|
|
|
|
|
} |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
# XXX Is it always ? |
70
|
|
|
|
|
|
|
$r->content_type('image/jpg'); |
71
|
|
|
|
|
|
|
$r->rflush(); |
72
|
|
|
|
|
|
|
print $im->ImageToBlob(); |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
# XXX Save to cache (files to redirect to) (internal Apache caching) |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
return Apache2::Const::OK; |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
1; # Magic true value required at end of module |
81
|
|
|
|
|
|
|
__END__ |