tags:

views:

378

answers:

1

Hi all,

I have problems using the perl cgi hook.

It seems that after I pressed the "send" button my perl script is not called instandly but after the file is uploaded completely.

That might be because of a server setting.

Was anyone faced with this problem before?

Update:

The reason was the pre installed: Apache Security Module

Thanks for your time.


Perl Source Code

#!/usr/bin/perl -w

use CGI::Carp 'fatalsToBrowser';
use CGI qw(:cgi);
use IO::File;
use strict;

my $hook_file = "test.txt";

my $hook_handle = new IO::File;
$hook_handle->open(">> $hook_file") or die("Failed to open $hook_file: $!");

my $hook_query = CGI->new(\&hook, $hook_handle);

#start upload:
my $query = new CGI;

sub hook{
    my ($current_filename, $buffer, $bytes_read, $hook_handle) = @_;

    $hook_handle->print( join(" ",times()) . " -> " . $bytes_read ."\n" );
}



print "Content-type: text/html\n\n";


1;

To monitor the upload progress I am using tail:

touch test.txt
tail -f test.txt

Using a simple HTML POST form I start to upload a file of 5.5 MB.

The output is always similar:

system time / user time / cpu time   ->   bytes transfered

0.03 0 0 0 -> 4037
...
...
...
0.11 0.01 0 0 -> 5520894

Saying it uploaded 5.5 MB in 0.1 seconds.


Server configuration

There are tons of differences between the configurations:

use Config qw(myconfig config_sh config_vars);

print myconfig();

print config_sh();

Some differences: (please tell me if sth else could be interessting)

The first value is of the working server.

The second values is of the bugging dreamhost server.

// dreamhost uses an older version of perl:
PERL_API_VERSION='10' -> '8'
api_versionstring='5.10.0' -> '5.8.0'

// dreamhost uses ByteLoader 
extensions='B ...'
extensions='B ByteLoader ...'

// dreamhost uses an older gcc version
gccversion='4.3.3' -> '4.1.2 20061115 (prerelease) (Debian 4.1.1-21)'

// dreamhost uses an older libc version
gnulibc_version='2.9' -> '2.3.6'

// the dreamhost server is using fast stdio
usefaststdio='undef' -> 'define'

CGI (updated)

because of Sinans advice I updated my CGI version (however it did not solve my problem)

// dreamhost cgi version
print $query->version (); -> 3.48
+1  A: 

I had some difficulty with printing to a filehandle that is passed to the hook, presumably because of buffering issues. I decided to use append_file from File::Slurp and passing the name of the log file.

I also decided to wrap the script in a run sub just in case you are running this as a registry script under mod_perl. Finally, I do not know where the times() function came from, so I used time instead. Here is the script:

#!/usr/bin/perl

use strict; use warnings;

use CGI;
use File::Slurp;

run();

sub run {
    my $logfile = 'E:/srv/deploy/app/up.log';

    my $cgi = CGI->new(\&hook, $logfile);

    print $cgi->header('text/html'),
          $cgi->start_html,
          $cgi->p('Upload done'),
          $cgi->end_html;
    return;
}

sub hook {
    my ($filename, $buffer, $bytes_read, $logfile) = @_;
    append_file $logfile, \ sprintf("%d: %d\n", time, $bytes_read);
}

Output:

1258030571: 4051
1258030571: 8102
1258030571: 12153
...
1258030574: 5959021
1258030574: 5963072
1258030574: 5963469

CGI version: 3.37 apache version: 2.2.4 (Windows) perl version: 5.10.1 (ActiveState)

Sinan Ünür
Thanks Sinan!However it doesn't work for me.`1258031962: 4039` -> `1258031962: 5059492`It "freezes" until the download is done and than starts to pass all byte changes at once.
Ghommey
Sinan Ünür
I am now using CGI-Version 3.48. And having still the same problem. Do you have any other ideas?
Ghommey
@Ghommey I am stumped too. I will update if I think of anything.
Sinan Ünür
Thank you for your help Sinan! I finally found out that the apache security module was the reason for my issue.
Ghommey
@Ghommey Thanks. I am glad your problem was solved. It's always the last place you look ;-)
Sinan Ünür