Superate le precedenti lezioni con successo, abbiamo messo su un
completo sistema di sviluppo CGI (non gasiamoci troppo). Come ho
accennato in precedenza, il meccanismo del CGI è questo:
1. lutente chiede al server un indirizzo posto in cgi-bin,
spesso premendo il tasto submit di un form.
2. il server si accorge che lindirizzo non è una pagina web
normale, ma un programma CGI
3. il server fa partire il programma CGI
4. il programma CGI fa qualcosa (si spera), e produce uno o più
risultati. Nel 99% dei casi questi risultati comprendono una pagina
html di risposta da far vedere all'utente
5. la pagina html in questione viene raccolta dal server web, e
spedita allutente.
Ci siamo già occupati dei passi 2 e 3, configurando il server Apache
in modo che i files nella directory cgi-bin vengano
trattati come programmi CGI. Dobbiamo adesso occuparci del passo
5 (lo so che non sto andando per ordine, ma gli argomenti vanno
introdotti nel modo giusto...)
Lespressione pagina html in questione significa,
in realtà, qualunque cosa il nostro programma abbia scritto nello
standard output (stdout). Vi ricordo che in genere, se non altrimenti
specificato, tutte le istruzioni tipo print, printf(), write() dei
vari linguaggi scrivono appunto nello stdout.
A questo punto torna in azione il server web, messo momentaneamente
in disparte dallesecuzione del nostro programma CGI. Tutta
la roba scritta nello stdout viene presa come risultato
dell'elaborazione (fatto salvo che il nostro programma può aver
fatto altre cose in mezzo, come spedizione di e-mails, aggiornamento
di database, decollo di missili intercontinentali e altre bazzecole).
Il server web prende il risultato e lo manda al browser dellutente,
il quale farà del suo meglio per visualizzarlo.
Ma qui entrano in gioco gli standard Internet. Quando un browser
riceve un qualunque blocco di dati, sia esso una pagina html, un'immagine,
o un testo semplice, si aspetta dal server una serie di informazioni
aggiuntive: lunghezza del blocco, data e ora dell'ultima modifica,
tipo di connessione eccetera. Tutte queste informazioni si chiamano
headers, e sono composte da una serie di linee di testo che
precedono i dati veri e propri.
Tra tutti questi headers, ce ne interessa per ora solo uno: il Content-type,
che dice al browser come interpretare il blocco dati in arrivo.
La necessità di questo header nasce dal fatto che i browser sono
in grado di visualizzare una gran varietà di informazioni, codificate
in modo diverso (testi, immagini varie, suoni, video). E poiché,
dal punto di vista di un computer, tutti i dati si assomigliano
tra loro (sono tutti una serie di bytes in sequenza), occorre che
qualcuno dica al browser cosa deve farsene dei dati in arrivo.
Finché si tratta di pagine html e di immagini, ci pensa il server
web a mandare il Content-type giusto. Ma quando il nostro programma
CGI tira fuori il suo bel risultato, dobbiamo essere noi
a dire al server web cosa abbiamo fatto. Una pagina web? Un'immagine
gif (come Shinystat)? Qualcosa di più esotico? Il server web non
lo sa. Perciò dobbiamo anteporre al risultato qualche header. Il
solo Content-type è sufficiente per adesso. Ecco degli esempi:
Content-type: text/plain
Content-type: text/html
Content-type: image/gif
Content-type: image/jpeg
Mi sembra abbastanza chiaro: se il nostro CGI produce una pagina
html, dovremo anteporre lheader Content-type: text/html.
Se invece produciamo un file di testo in puro ASCII, useremo Content-type:
text/plain. E così via.
Inoltre, ci vuole un modo per separare gli headers dal contenuto
vero e proprio. Lo standard dice che, siccome ogni header è composto
da una linea di testo, una linea vuota segnala la fine degli headers.
Ecco perché la nostra istruzione print:
print "Content-type:
text/html\n\n";
comprende due ritorni a capo: uno per terminare la linea di testo,
e uno per produrre una linea vuota. Subito dopo, il browser si aspetta
di trovare i dati interessanti. Nel nostro caso, abbiamo immediatamente
scritto la pagina html.
Questo è quanto per la teoria. Nella pratica, basterà mettere tra
le primissime istruzioni del programma la scrittura di questo header,
e saremo a posto. Avanti con la prossima lezione!
Torna all'indice Generale del corso di Corso di CGI di Software Planet