Newsgroup: it.comp.lang.perl
Titolo: fare un webserver (php e perl)

Salve,
vorrei realizzare un webserver, o almeno una libreria che facili la
creazione del medesimo.
Io conosco i path del file php.exe e perl.exe
So che per eseguire una pagina o uno script basta fare
php.exe script.php
perl.exe pagina.cgi
Dunque, io voglio invece sapere come il webserver passa i parametri di
ambiente come i ref, i campi di post.
Cioè, voglio eseguire gli script come se fosse un vero e proprio webserver.
Ora, per passare gli script agli eseguibili php faccio:
open (PAGPHP, "html.php");
open (PIPONA, "|php|") or die ("non ho aperto la pipe");
print PIPONA $_ while(<PAGPHP>);
close (PIPONA);
close PAGPHP;
Però così non faccio proprio quello che voglio fare.
Ho visto che per passare i parametri di get basta fare:
open (PIPONA, "|php ?par=1&param=2|") or die ("non ho aperto la pipe");
ma il resto?
Grazie in anticipo.

 ambiente come i ref, i campi di post.
Per il metodo GET i parametri vengono passati tramite la variabile
d'ambiente 'QUERY_STRING'.
Con il metodo post i parametri vengono passati tramite STDIN, infatti per
leggerli si usa:
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
-- 
-- Marco Allegretti --
http://www.shishii.com

 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
Interessante.
Però vedo che apache passa anche una serie di altre informazioni, mi
riferisco a queste:
http://hoohoo.ncsa.uiuc.edu/cgi/env.html

Ho premuto invio per andare a capo invece mi ha spedito il messaggio...booo
Vabbè, continuando....
In pratica, dicevo, che apache passa molti parametri, non solo quello che
riceve dal browser (come la lingua accettata dal browser & co.) ma passa
l'indirizzo remoto del client, la porta remota, insomma.
Io in perl dovrei riuscire a realizzare questo, non solo passare i parametri
ricevuti tramite GET e POST.
Rileggendo vedo che parli di varibili di ambiente. questo argomento non l'go
mai trattato ma penso che tutti i valori siano passati in questa maniera.
Provo a farmi una lettura da qualche parte sperando di trovare qualcosa.
Grazie ancora shishii ^_^

NON CI CREDO!!!
$ENV{'omega'}="io sono omega";
@testo= `php -f html.php ciao=1&alfa=beta&gamma=omega`;
open (FILE, ">prova2.html");
foreach $buf (@testo) {
print FILE $buf;
}
close (FILE);
-------- html.php
<?PHP
#phpinfo();
print "ciao mondo\n";
print $ENV[omega];
print $_ENV[omega];
?>
ciao ciao ciao!!
------ risultato in prova2.html
ciao mondo
io sono omegaciao ciao ciao!!
Cioè, è la fine, è semplicissimo!
Fare un webserver diventa la cosa più semplice del mondo XD
Grazie shishii, mi hai illuminato la strada!
I love you

 [...]
A giudicare dai tuoi post sull'argomento non capisco il senso di cio' 
che vuoi ottenere...
Mi spiego: nell'esempio che posti tu STAI *gia'* utilizzando le 
funzionalita' di un WEB server e dei suoi moduli.
Hai quindi realizzato non un WEB server, ma un semplice programma che si 
serve delle sue funzionalita'.
Se vuoi invece realizzare un WEB server devi partire dall'assunto che tu 
non ne abbia a disposizione uno (altrimenti che lo realizzi a fare?).
E' come se dicessi: "devo costruire una automobile: ok, parto da questa 
automobile che tra le altre funzionalita' *produce* automobili", che 
senso ha?
Mi ricordo che all'universita' dovemmo sviluppare un WEB server in C per 
poter sostenere un esame.
Bene, e' come se mi fossi presentato con un programma scritto in C e che 
invocava i moduli di Apache da riga di comando per restituire le 
stringhe prodotte in un file di testo.
Partendo da queste premesse, allore forse avresti un po' piu' da fare 
tra socket, pre/postThreading etc.
HTH,
baba

 tra socket, pre/postThreading etc.
In realtà di dico che:
Non sto usando moduli da webserver.
Per la gestione degli socket uso una libreria che ho fatto io per gestiro
socket non bloccanti e oggetti socket server.
Sto facendo un altra libreria con la quale si può creare Oggetti
SessioneWebServer che poi riceve come parametri il testo che riceve (non
necessariamente da uno socket.
Una volta che SessioneWebServer vede di aver ricevuto tutti gli header non
fa altro che generare una pagina (da un CGI o html normale) e inviarla ad
una funzione che a sua volta la invierà allo socket.
Dunque io sto facendo la libreria SessioneWebServer.
Una volta finita posso creare con estrema facilità un programma che
interfaccia i dati ricevuti dagli socket con la mia prima libreria alla
nuova libreriad el server.
Questo è il codice di esempio che analizza i dati ricevuti da un browser:
require "HTTPServerMs.pm";
require "
ctcp.pm
";
use IO::Socket::INET;
use strict;
my $ctcp=IO::Socket::cTcp->new();
   my $server = IO::Socket::INET->new(Listen    => 5,
                                 LocalPort => 9000,
                                 Proto     => 'tcp');
my $webserver=HTTPServerMs->new();
$ctcp->AddSock($server,'server');
while (1) {
 if(my $ref=$ctcp->Select(undef)) {
  if (exists $ref->{ConnectionRequest}) {
   foreach my $value (@{$ref->{ConnectionRequest}}) {
    my $socket=$value->accept;
    $webserver->NewSession($socket);
    $ctcp->AddSock($socket,'data');
   }
  }
  if (exists $ref->{CanRead}) {
   foreach my $value (@{$ref->{CanRead}}) {
    $webserver->RecData($value,$ctcp->recv($value));
   }
  }
  if (exists $ref->{Disconnessi}) {
   foreach my $value (@{$ref->{Disconnessi}}) {
    print "Disconnessi\n";
    $webserver->Remove($value);
   }
  }
 }
}
E funziona (in parte).
Vedi le richieste del browser e la libreria inserisce i dari in tante
variabili.
Il problema rimane come fare il parsing dei dati ricevuti con POST che posso
essere in vari formati.
Per quello mi serve una libreria che mi faccia il parsing dei dati e mi
restituisca variabili e non testo.

bene, ti dirņ che il Webserver non esegue ancora i CGI ma spedisce
divinamente i dati.
Se voglio posso anche limitare la banda in upload con un semplice click.
Tutto il multisessione, capace di reggere centinaia di connessioni alla
volta (dipende da quanti ne regge Perl).
Domani vedrņ di implementare il Mime Type e l'esecuzione dei CGI.
Poi l'ultimo passo sarą un autorefresh dei buffer in uscita nel caso si
volessero scaricare file superiori ai 50KB. Ora come ora prende tutto il
file e lo infila nei buffer. Se scarica un file di 60MB avrei qualche
problemino di ram XD
I Love Perl!

Il webserver l'ěho finito č funziona perfettamente.
Ci ho fatto girare un forum intentero e il tutto usando librerie di basso
livello.
io::socket.
IO::pipe
mime::types
e basta mi sembra.
Gestisce piů connessioni contemporaneamente e si puň limitare la banda
totale uscente.
Come detto ci posso facilmente far girare i CGI. Basta che dico l'estenzione
dei CGI e a quale inteprete sono collegati e il webserver fa tutto da solo.
:D