Hello-

I've noticed a problem when i try to POST large
TEXTAREA fields with ENCTYPE=multipart/form-data and
read it with Apache::Request.

It seems like when the data is between roughly
5K-10Kbytes, i get extra garbage at the end. When it's
greater than 10K, it gets chopped between ~5K-10K
bytes. Sounds like some 5K buffer somewhere getting
mangled. (Note, file uploads work fine, and I don't
have these problems with TEXTAREAs without the
ENCTYPE....)

I have my test code below for illustration. Also,
CGI.pm works fine-- parseFormCGI instead of
parseFormApache below. (BTW, I'm running mod_perl 1.25
w/ Apache 1.3.20 and perl 5.6.1 on linux 2.4.2-2.)

Has anyone encountered this before? Any help is greatly
appreciated.

TIA,
peter
[EMAIL PROTECTED]



------------------------------------------- form:

<FORM ACTION=/test METHOD="POST" ENCTYPE="multipart/form-data">
<INPUT TYPE=SUBMIT VALUE=GO!><BR>
<TEXTAREA NAME=FOO COLS=120 ROWS=30>
0.........1.........2.........3.........4.........5.........6.........7.........8.........9.........
0.........1.........2.........3.........4.........5.........6.........7.........8.........9.........
   [...repeat ~100 times...]
0.........1.........2.........3.........4.........5.........6.........7.........8.........9.........
</TEXTAREA>
</FORM>

------------------------------------------- handler:

package Test::TestMod;

use Apache ();
use Apache::Request ();
use CGI ();
use strict;

sub handler {

    my $r = shift;
    my $form = &parseFormApache($r);

    $r->print("Content-type: text/html\n\n");

    $r->print("<table>\n");
    $r->print("<tr><th colspan=2 align=left>ARGS</th></tr>\n");
    foreach my $key (sort keys %$form) {
        my $count = 0;
        $$form{$key} =~ s/\n/'line'.++$count.':'/ge;
        $r->print("<tr><th 
align=right>$key</th><td><pre>$$form{$key}</pre></td></tr>\n");
    }
    $r->print("</table>\n");

    return 200;

}

sub parseFormApache {

    my ($r) = @_;
    my $apr = Apache::Request->new($r);

    my $form;
    my @params = $apr->param;

    foreach my $param (@params) {
        $$form{$param} = join("\0", $apr->param($param));
    }

    return $form;

}

sub parseFormCGI {

    my ($r) = @_;
    my $cgi = new CGI;

    my $form;
    my @params = $cgi->param;

    foreach my $param (@params) {
        $$form{$param} = join("\0", $cgi->param($param));
    }

    return $form;
}

1;






Reply via email to