Cindy Wang (CindyLinz) > HTTP-Body-MultiPart-Extend > HTTP::Body::MultiPart::Extend

Download:
HTTP-Body-MultiPart-Extend-0.01.tar.gz

Dependencies

Annotate this POD

View/Report Bugs
Module Version: 0.01   Source  

NAME ^

HTTP::Body::MultiPart::Extend - Extend HTTP::Body::MultiPart's handler to do something you want

SYNOPSIS ^

    use HTTP::Body::MultiPart::Extend qw(extend no_extend patch_new);

    # Overwrite HTTP::Body::MultiPart::handler
    use HTTP::Body;
    use HTTP::Body::MultiPart::Extend qw(extend);
    
    extend( sub {
        my($self, $part) = @_;

        my $headers = $part->{headers}; # A hash ref to this part's header fields
        my $size = $part->{size}; # The current size this time
        my $done = $part->{done}; # If this part is done (the final call for this part)
        # Please don't modify these fields listed above.

        my $data = substr($part->{data}, 0, length($part->{data}), '');
            # Each time, the comming data will be appended here.
            # You can choose whether to take it out, or leave it here (and occupy memory steadily).
        ...
        $self->SUPER::handler(@_); # You can call the original one like this when need
    } );
    $body = HTTP::Body->new( $content_type, $content_length );
    # Then use HTTP::Body in a normal way.
    # See the document of HTTP::Body

    # You can overwrite different subs alternatively.
    use HTTP::Body;
    use HTTP::Body::MultiPart::Extend qw(extend no_extend);

    extend(\&A);
    my $body_a = HTTP::Body->new(...);
    # Overwrite by sub A

    extend(\&B);
    my $body_b = HTTP::Body->new(...);
    # Then overwrite by sub B

    no_extend;
    my $body = HTTP::Body->new(...);
    # Switch back to the original one.

    # You can use $body_a, $body_b, and $body here.
    # They will work with handlers A, B, and the original one respectively


    # Beside extend and no_extend, you can use patch_new with a no-side-effect style
    use HTTP::Body::MultiPart::Extend qw(patch_new);
    my $body = patch_new( sub { ... }, ... other args for HTTP::Body->new ... );
    # It will call HTTP::Body->new(...) for you

    # Note that if the request is not multipart/form-data, it's no effect by this module

DESCRIPTION ^

With this module, you can switch HTTP::Body::MultiPart::handler to your version. Then you can decide how to deal with the user uploads, such as tracking uploading progress, droping malform or too large files in time, etc.

FUNCTIONS ^

extend

The only argument of extend should be a CODE ref. All the following HTTP::Body->new will use the given sub as the HTTP::Body::MultiPart handler if the request is multipart/form-data, until the next extend or no_extend.

no_extend

After this call, all the following HTTP::Body->new will switch back to use the original handler.

patch_new

This function will call HTTP::Body->new, and additionally change the HTTP::Body::MultiPart handler to yours.

This function provides a no-side-effect way to extend.

The first argument should be a CODE ref, and the following arguments will be passed to HTTP::Body->new.

EXPORT ^

This module will not export anything by default. You could export them by yourself, or use the fully qualified name directory.

ORIGINAL HANDLER ^

If you don't known how to design your own handler. Take a look on the original one. It might inspire you some.

The code below is HTTP::Body::MultiPart::handler, taken from package HTTP::Body version 1.07.

    sub handler {
        my ( $self, $part ) = @_;

        unless ( exists $part->{name} ) {

            my $disposition = $part->{headers}->{'Content-Disposition'};
            my ($name)      = $disposition =~ / name="?([^\";]+)"?/;
            my ($filename)  = $disposition =~ / filename="?([^\"]*)"?/;
            # Need to match empty filenames above, so this part is flagged as an upload type

            $part->{name} = $name;

            if ( defined $filename ) {
                $part->{filename} = $filename;

                if ( $filename ne "" ) {
                    my $fh = File::Temp->new( UNLINK => 0, DIR => $self->tmpdir );

                    $part->{fh}       = $fh;
                    $part->{tempname} = $fh->filename;
                }
            }
        }

        if ( $part->{fh} && ( my $length = length( $part->{data} ) ) ) {
            $part->{fh}->write( substr( $part->{data}, 0, $length, '' ), $length );
        }

        if ( $part->{done} ) {

            if ( exists $part->{filename} ) {
                if ( $part->{filename} ne "" ) {
                    $part->{fh}->close if defined $part->{fh};

                    delete @{$part}{qw[ data done fh ]};

                    $self->upload( $part->{name}, $part );
                }
            }
            else {
                $self->param( $part->{name}, $part->{data} );
            }
        }
    }

SEE ALSO ^

HTTP::Body, HTTP::Body::MultiPart

AUTHOR ^

Cindy Wang (CindyLinz)

BUGS ^

Please report any bugs or feature requests to bug-http-body-multipart-extend at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=HTTP-Body-MultiPart-Extend. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT ^

You can find documentation for this module with the perldoc command.

    perldoc HTTP::Body::MultiPart::Extend

You can also look for information at:

LICENSE AND COPYRIGHT ^

Copyright 2010 Cindy Wang (CindyLinz).

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.

syntax highlighting: