—package
HTTP::Engine::Middleware::UploadTemp;
has
'keepalive'
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 1,
);
has
'lazy'
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
'cleanup'
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
'tmpdir'
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
'base_dir'
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
);
has
'template'
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
);
{
my
$TMPDIR
;
sub
_make_tempdir {
return
$TMPDIR
if
$TMPDIR
;
my
$self
=
shift
;
my
%option
= (
CLEANUP
=> (
$self
->cleanup &&
$self
->keepalive),
TMPDIR
=>
$self
->tmpdir,
);
$option
{DIR} =
$self
->base_dir
if
$self
->base_dir;
if
(
$self
->template) {
$TMPDIR
= tempdir(
$self
->template,
%option
);
}
else
{
$TMPDIR
= tempdir(
%option
);
}
return
$TMPDIR
;
}
my
$HAS_UPLOAD_TMP
= 0;
before_handle {
return
$_
[2]
if
$HAS_UPLOAD_TMP
;
my
(
undef
,
$self
,
$req
) =
@_
;
if
(
$self
->lazy) {
$req
->request_builder->upload_tmp(
bless
{
context
=>
$self
},
'HTTP::Engine::Middleware::UploadTemp::LazyObject'
);
}
else
{
$req
->request_builder->upload_tmp(
$self
->_make_tempdir );
}
$HAS_UPLOAD_TMP
= 1;
return
$req
;
};
after_handle {
return
$_
[3]
if
$_
[1]->keepalive;
my
(
undef
,
$self
,
$req
,
$res
) =
@_
;
$req
->request_builder->upload_tmp(
undef
);
$HAS_UPLOAD_TMP
= 0;
return
$res
unless
$TMPDIR
;
delete
$req
->{http_body}
if
exists
$req
->{http_body};
# HTTP::Body object is delete first
rmtree
$TMPDIR
;
undef
$TMPDIR
;
return
$res
;
};
}
{
package
HTTP::Engine::Middleware::UploadTemp::LazyObject;
'bool'
=>
sub
{ 1 },
q{""}
=>
sub
{
$_
[0]->{tempdir} =
exists
$_
[0]->{tempdir} ?
$_
[0]->{tempdir} :
$_
[0]->{context}->_make_tempdir
};
sub
tempdir {
$_
[0]->{tempdir} }
}
__MIDDLEWARE__
__END__
=head1 NAME
HTTP::Engine::Middleware::UploadTemp - Deprecated. Please use $req->builder_options->{upload_tmp}
=head1 SYNOPSIS
please use L<HTTP::Engine::Request>'s builder_options.
=head2 example
sub your_handler {
my $req = shift;
$req->builder_options->{upload_tmp} = File::Temp->newdir;
my $file = $req->upload('file');
...
}
any options for File::Temp
sub your_handler {
my $req = shift;
$req->builder_options->{upload_tmp} = File::Temp->newdir(
'FOO_XXXX',
DIR => '/tmp',
);
my $file = $req->upload('file');
...
}
see L<File::Temp>
=head2 like lazy option
sub your_handler {
my $req = shift;
$req->builder_options->{upload_tmp} = sub { File::Temp->newdir };
my $file = $req->upload('file');
...
}
=head2 like keepalive option
my $cache;
sub your_handler {
my $req = shift;
$cache ||= File::Temp->newdir;
$req->builder_options->{upload_tmp} = $cache;
my $file = $req->upload('file');
...
}
=head2 OLD SYNOPSIS
my $mw = HTTP::Engine::Middleware->new;
$mw->install( 'HTTP::Engine::Middleware::UploadTemp' => {
keepalive => 0, # generate temporary directory to 1 request only
cleanup => 1, # CLEANUP option for File::Temp::tempdir
tmpdir => 1, # TMPDIR option for File::Temp::tempdir
base_dir => '/tmp', # DIR option for File::Temp::tempdir
template => 'FOO_XXXX', # template option for File::Temp::tempdir
lazy => 1, # lazy generate for temporary directory
});
HTTP::Engine->new(
interface => {
module => 'YourFavoriteInterfaceHere',
request_handler => $mw->handler( \&handler ),
}
)->run();
=head1 DESCRIPTION
This middleware add the management of temporary directory for upload files.
Another reason is that L<HTTP::Body::MultiPart> does not clean up to temporary files.
=head1 AUTHOR
Kazuhiro Osawa
=head1 SEE ALSO
L<HTTP::Engine::Request>, L<File::Temp>
=cut