Newsgroup: it.comp.lang.perl
Titolo: GET di file attravesro http



Ciao a tutti,

Sto vanamente cercando di realizzare uno script prende in input il
nome di un host e il percorso ad un file (es.: http_get 
www.redhat.com

/errata/images/pippo.jpg) e recupera il file salvandolo in locale.

il codice e' allegato, non e' del tutto corretto ma ci sto lavorando,
il problema sono i tag di risposta del server web successivi al comando
GET ... infatti quello che ottengo e' ...

HTTP/1.1 200 OK

Date: Sun, 04 Jul 1999 14:51:14 GMT

Server: Apache/1.3.6 (Unix)  (Red Hat/Linux)

Last-Modified: Mon, 01 Feb 1999 13:51:24 GMT

ETag: "1814-653-36b5b15c"

Accept-Ranges: bytes

Content-Length: 1619

Connection: close

Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

dove la prima parte va eliminata, come posso far per eliminarla.

La soluzione potrebbe anche essere stupida lo so, ma aiutatemi sto
lavorando da questa mattina alle 5 e dopo 12 ore comincio a dare di matto.

Grazie

Luca

---------------------- CODICE ------------------------------

#!/usr/bin/perl -w


# http get


# get a file from a server web


use IO::Socket;


unless (@ARGV > 1) {die "usage $0 host document"}


$host = shift (@ARGV);


$document = shift (@ARGV);


$EOL="\015\012";


$BLANK = $EOL x 2;


 


$remote = IO::Socket::INET->new( Proto    => "tcp",


     PeerAddr => $host,


     PeerPort => "http(80)"


        );


unless ($remote) { die "cannot connect to http daemon on $host"
}


$remote -> autoflush(1);


print $remote "GET $document HTTP/1.0" . $BLANK;


open WR, '>out.html';


while ( <$remote> ) {


    print WR $_;


}


close WR;


close $remote;



 /errata/images/pippo.jpg) e recupera il file salvandolo in locale.
Perche' reinventare la ruota? Usa il modulo LWP::Simple.
Lo trovi in libwww su CPAN.
Ha un metodo get che fa esattamente quello che vuoi tu.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

Hai ragione, ma il modulo LWP non e' obsoleto?
... scusa un'altra cosa, se faccio ftp tramite telnet mi succede una strana
cosa ... cosi anche se lo faccio da script mi accetta tutti i comandi ma non
mi fa ne il list ne il retr .... ne sai qualcosa?
Ciao
Luca

mi fa ne il list ne il retr .... ne sai qualcosa?
LIST e RETR presuppongono l'apertura di un "data connection" su una porta
diversa dalla 21, quella cui accedi con il client telnet, quindi o usi
un client FTP oppure scrivi un programmino che gestisca la cosa.
	Michele.
-- 
Michele Beltrame
mi...@io.com
http://www.io.com/~mick/

 un client FTP oppure scrivi un programmino che gestisca la cosa.
La cosa non la sapevo proprio .... quindi scusa io ho provato ad aprire da
script perl un socket sulla 21, ho fatto male?! ... pero' dal rfc959 non mi
sembrava aver visto una cosa del genere ... mi sa che e' meglio che me lo
riguardo un pochino ....
Comunque per quanto riguarda libwww vi ringrazio ... anche se ho ottenuto una
soluzione ottima a mano ...
Grazie ancora
Luca

 un client FTP oppure scrivi un programmino che gestisca la cosa.
hai ragione, ho trovato la specifica di comunicazione sul rfc, ora mi ci metto
ad implementare qualche cosa di carino che mi permetta di gestire la
comunicazione con il server ftp.
Grazie & Ciao
Luca

 comunicazione con il server ftp.
E usare Net::FTP?
Se hai voglia di smanettare con i socket e' un conto, ma altrimenti ti
conviene usare un modulo.


 conviene usare un modulo.
... Si sono uno smanettone .... No e' che vorrei fare una cosa che sia il piu'
portaile possibile -> con quello che mette a disposizione il per di base.
Grazie
Luca

PErchè non usi LWP e HTTP::REquest?
Ciao
Andrea

 script perl un socket sulla 21, ho fatto male?!
No, perņ sulla 21 passano i comandi, sulla 20 (mi pare) i dati.
Un list passa Ok sulla 21 e la list sulla 20.
Valerio
--
-------------------------------------------------------
 
http://www.livenet.it
Hosting - Housing - Accesso ad Internet
                      0815625909
         03395452296 03394733180
-------------------------------------------------------

 /errata/images/pippo.jpg) e recupera il file salvandolo in locale.
Ciao Luca e ciao a tutti!
anch'io avevo questo problema e ho voluto evitare di usare
i moduli LWP e via dicendo, per una questione di portabilità
(usiamo anche quello sfigato di perl per netware, oltre che
os/2, win32, linux e as).
Per eliminare gli header http, all'inizio ho provato con
vari pattern matching, con risultati non molto affidabili,
ma poi ho pensato di fare così:
- faccio una richiesta HEAD dell'url
- faccio la stessa richiesta come GET
- differenza GET-HEAD { splice(@aDoc,0,@aHead) }
- ottieni il tuo file pulito
Quindi va bene anche per copiare file binari.
L'overhead della richiesta head è poco significativo
nelle nostre condizioni e penso anche in assoluto.
Il tutto è correntemente installato e funzionante
su tutti i sistemi.
L'unico accorgimento è stato di inserire un
binmode(REMOTE) per evitare problemi con Win32.
Ditemi cosa ve ne sembra.
Ciao!