#!/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

Getpage

BYTE România - decembrie 1997


(C) Copyright Computer Press Agora