#!/usr/local/bin/perl -w
# Client Getpage
# Intrare: Index (cuprinsul)
# Ie]ire: Toate capitolele (legaturi relative din Index)
# Exemplu de utilizare:
# getpage www.mcp.com /onlineBooks/CGI/toc.html
# getpage -1 www.perl.com /CPAN/src/latest.tar.gz
# Nota: -1 inseamna ca va salva doar pagina primita ca argument.
use IO::Socket;
system "clear"; # sterge ecranul
unless (@ARGV == 2 ||
(@ARGV == 3 && $ARGV[0] == "-1")) {
die "Utilizare: $0 [-1] \nNota: -1 pentru un singur document . \n
Exemple: $0 www.mcp.com /onlineBooks/CGI/toc.html
$0 -1 www.perl.com /CPAN/src/latest.tar.gz"
}
my ($host, # numele (adresa) calculatorului
$document, # calea catre document
$relativePath, # calea pentru legatura curenta
$remote, # numele (adresa) calculatorului de la distanta
$start, $lastSlash, # folosit la extragerea
$first, $second, # numelui din cale
$File, # numele fisierului curent
@Lines, # vectorul cu legaturile
$protocol, # nu trebuie sa existe
# pentru legaturi locale.
$i
);
# Testare parametri din linia de comanda
if (@ARGV == 2) {
$host = shift(@ARGV);
$document = $ARGV[0];
$onePage = "false";
}
else {
shift (@ARGV); # este �1, deci o singura pagina
$host = shift(@ARGV);
$document = $ARGV[0];
$onePage = "true";
}
print "Host: $host, Doc: $document
------------------------\n";
# Stabilire conexiune
$remote = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => $host,
PeerPort => "http(80)",
);
unless ($remote) {
die "Nu ma pot conecta la daemon-ul de http de pe: $host"
}
$remote->autoflush(1);
# Trimite cererea serverului de la distanta
print $remote "GET $document\n";
# Extrage din cale numele fisierului de salvat
$lastSlash = rindex $document, "/";
$File = substr ($document, $lastSlash + 1);
# Deschide si salveaza fisierul
open (OUT, ">$File") ||
die "Nu pot crea fisierul \'$File\'! Iesire ...";
print "Salvez fisierul \'$File\' ..\n";
while ( <$remote> ) { # citire de pe socket
# Selecteaza doar liniile cu taguri in
# vectorul Lines pentru folosinta ulterioara
$Lines[$i++] = $_ if /.*href.*/i;
print OUT $_; # scriere [n noul fisier
}
close $remote; # inchide descriptorul de socket
close OUT; # inchide descriptorul de fisier
print "Fisierul \'$File\' primit.\n";
# Iesire daca -1 a fost specificat
exit 0 if $onePage eq "true";
# Determina calea relativa la document
$relativePath = substr $document, 0, $lastSlash;
undef $protocol;
# Procesul de selectie linii
for ($i = 0; $i < @Lines; $i++) {
$_ = uc ($Lines[$i]); # Transforma linia curenta in litere mari
$start = index $_, HREF;
# Extrage "URL-ul" de dupa HREF
$first = index $_, "\"", $start;
$second = index $_, "\"", $first+1;
$document = substr $Lines[$i], $first+1, $second - $first - 1;
# Extrage protocolul: "HTTP:", "FTP:"
$start = index ($document, ":");
$protocol = uc (substr $document, 0, $start) if ($start != -1);
# Daca exista protocol ignora legaturile,
# pentru ca nu sunt locale
if (! defined ($protocol)) {
# ignora legaturile in aceeasi pagina
# definite cu #ancora_locala
$document = substr
$document, 0, index ($document, "#")
if (index ($File, "#") != -1);
# Umple cu calea reala daca e necesar;
# daca nu, incepe cu "/"
$document = "$relativePath/$document"
if (substr ($File, 0, 0) ne "/");
# Extrage numele fisierului de salvat
$start = rindex $document, "/";
$File = substr ($document, $start + 1);
# Creaza o noua conexiune (NECESAR~) ]i
# salveaza fi]ierul
$remote = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => $host,
PeerPort => "http(80)",
);
unless ($remote) {
die "Nu ma pot conecta la serverul de http pe $host"
}
$remote->autoflush (1);
# Trimite noua cerere
print $remote "GET $document\n";
# Salveaza noul fisier
open (OUT, ">$File") ||
die "Nu pot crea fisierul \'$File\'! Iesire ...";
print "Salvez fi]ier \'$File\' ..\n";
while (defined ($remote) &&
($Line = <$remote>)) {
print OUT $Line;
}
close $remote;
close OUT;
print "Fisier \'$File\' primit.\n";
}
else {
print "Document \'$document\' pare sa nu fie pe calculatorul de la distanta.\n";
}
undef $protocol; # Ini\ializare pentru urmatorul test
} # Sfarsitul procesarii liniilor selectate
|