Remote file size (Content-Length) in LWP::Protocol::ftp

Remote file size (Content-Length) in LWP::Protocol::ftp

am 16.02.2006 10:41:19 von katze

Hi there,

(libwww-perl-5.803)

Following is my code fragment:

....
my $src = "ftp://...";
my $ua = LWP::UserAgent->new ();
my $res = $ua->head ($src);
my $size = $res->headers->content_length;
....

I want to know the remote file size before retrieval. It fails in some
cases with Internal Server Error. Of course, I know that the
Content-Length may be unknown on server and may be omitted.

In LWP::Protocol::ftp, remote file size (Content-Length) is given by
parsing a message from the FTP server.

ftp.pm
232 my $mess = $ftp->message;
233 LWP::Debug::debug($mess);
234 if ($mess =~ /\((\d+)\s+bytes\)/) {
235 $response->header('Content-Length', "$1");
236 }

Some servers return the following message:

LWP::Protocol::ftp::request: Opening BINARY mode data connection for XXX
(78473 bytes).

It's good!

But others (e.g. Pure-FTPd):

LWP::Protocol::ftp::request: Accepted data connection
30880.0 kbytes to download

It's bad :(

Why not use determinant methods, e.g. Net::FTP size method?
--
Visita Inferiora Terrae Rectificando Invenies Occultum Lapidem
SATOU Kazuhito, Ph.D.
Protein Function Team email: katze@gsc.riken.jp
Protein Research Group phone: +81-45-503-9212
RIKEN Genomic Sciences Center fax : +81-45-503-9210
1-7-22 Suehiro, Tsurumi, Yokohama, Kanagawa 230-0045, Japan

Re: Remote file size (Content-Length) in LWP::Protocol::ftp

am 07.03.2006 14:24:20 von gisle

SATOU Kazuhito writes:

> Following is my code fragment:
>
> ...
> my $src = "ftp://...";
> my $ua = LWP::UserAgent->new ();
> my $res = $ua->head ($src);
> my $size = $res->headers->content_length;
> ...
>
> I want to know the remote file size before retrieval. It fails in some
> cases with Internal Server Error.

I would assume the 'Internal Server Error' comes from something else.
At this point you should only have a $size that is undef.

> Of course, I know that the Content-Length may be unknown on server
> and may be omitted.
>
> In LWP::Protocol::ftp, remote file size (Content-Length) is given by
> parsing a message from the FTP server.
>
> ftp.pm
> 232 my $mess = $ftp->message;
> 233 LWP::Debug::debug($mess);
> 234 if ($mess =~ /\((\d+)\s+bytes\)/) {
> 235 $response->header('Content-Length', "$1");
> 236 }
>
> Some servers return the following message:
>
> LWP::Protocol::ftp::request: Opening BINARY mode data connection for XXX
> (78473 bytes).
>
> It's good!
>
> But others (e.g. Pure-FTPd):
>
> LWP::Protocol::ftp::request: Accepted data connection
> 30880.0 kbytes to download
>
> It's bad :(
>
> Why not use determinant methods, e.g. Net::FTP size method?

Seems like a good idea if the RE didn't work out. Patches would be
welcomed.

Regards,
Gisle