Corso di CGI

Gli headers

 

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. l’utente chiede al server un indirizzo posto in cgi-bin, spesso premendo il tasto “submit” di un form.
2. il server si accorge che l’indirizzo 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 all’utente.

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...)

L’espressione “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 dall’esecuzione 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 dell’utente, 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 l’header “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