HTTP::Engine::Middleware::UploadTemp - Deprecated. Please use $req->builder_options->{upload_tmp}


HTTP-Engine-Middleware documentation Contained in the HTTP-Engine-Middleware distribution.

Index


Code Index:

NAME

Top

HTTP::Engine::Middleware::UploadTemp - Deprecated. Please use $req->builder_options->{upload_tmp}

SYNOPSIS

Top

please use HTTP::Engine::Request's builder_options.

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 File::Temp

like lazy option

  sub your_handler {
      my $req = shift;
      $req->builder_options->{upload_tmp} = sub { File::Temp->newdir };
      my $file = $req->upload('file');
      ...
  }

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');
      ...
  }




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();

DESCRIPTION

Top

This middleware add the management of temporary directory for upload files.

Another reason is that HTTP::Body::MultiPart does not clean up to temporary files.

AUTHOR

Top

Kazuhiro Osawa

SEE ALSO

Top

HTTP::Engine::Request, File::Temp


HTTP-Engine-Middleware documentation Contained in the HTTP-Engine-Middleware distribution.

package HTTP::Engine::Middleware::UploadTemp;
use HTTP::Engine::Middleware;

use File::Temp 'tempdir';
use File::Path 'rmtree';

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;
    use overload 
        'bool' => sub { 1 },
        q{""} => sub {
            $_[0]->{tempdir} = exists $_[0]->{tempdir} ? $_[0]->{tempdir} : $_[0]->{context}->_make_tempdir
        };
    sub tempdir { $_[0]->{tempdir} }
}

__MIDDLEWARE__


__END__