Common Gateway Interface. Dynamic HTML le risposte inviate al client sono (parzialmente o...
-
Upload
ilario-gatto -
Category
Documents
-
view
212 -
download
0
Transcript of Common Gateway Interface. Dynamic HTML le risposte inviate al client sono (parzialmente o...
Common Gateway Interface
Dynamic HTML
• le risposte inviate al client sono (parzialmente o totalmente) create on-the-fly (al volo) dopo aver ricevuto il pacchetto di richiesta
• il contenuto delle pagine può variare di volta in volta in base a parametri diversi (ora del giorno, stato del sistema, dati trasmessi dal client). I motori di ricerca, per esempio, rispondono alle interrogazioni con delle pagine html contenenti link
• necessitano di supporto da parte del web server – CGI, Servlet: chiamata di programmi esterni – ASP, JSP, PHP: codice direttamente dentro le pagine html ed
interpretato dal server (il client non lo può vedere)
Tecnologie che consentono di mostrare su Web l’output di programmi
ASP (Active Server Pages)• E’ uno standard Microsoft• Sono le pagine che hanno l’estensione .ASP• Utilizzano ActiveX scripting (generalmente codice
VBscript o JavaScript)Esempio:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
<HTML><HEAD></HEAD><BODY>
Hello World!<BR>
<% Next %>
<% For i = 3 To 7 %>
</BODY></HTML>
<% = i %> ><FONT SIZE
JSP (Java Server Pages)
Risposta della Sun all’ASP di MicrosoftUtilizzano codice Java embeddato nel file HTTP
<% for(int i=1; i<6; i++) { %>
The current number is 1The current number is 2The current number is 3The current number is 4The current number is 5
The current number is 1The current number is 2The current number is 3The current number is 4The current number is 5
The current number is
<%= i %>
<BR>
<% } %>
PHP (PHP Hypertext Preprocessor)Creato da un privato (Rasmus Lerdorf) nel 1994Distribuito con diversi Web servers (per es. Apache)Utilizza una sintassi simile al Perl or C
<?php $a = 1;
Function incrementa ($par) { return $par + 1;} $a = incrementa($a);echo(“Now a is”); echo ($a);?>
Now a is 2Now a is 2
web browser web server
gatewayprogram
http CGI
fisico
connessione
IP
TCP
sessione
presentazione
applicazione
bla bla<html><head>
bla bla<html><head>
??
CGI: architetturaRichiesta
host
Richiesta di usuali di files
Client
GET /index.html HTTP/1.0
bla bla<html><head>
bla bla<html><head>
??
Server
bla bla <html><head>
bla bla <html><head>bla bla
<html><head>
bla bla <html><head>bla bla
<html><head>
bla bla <html><head>bla bla
<html><head>
bla bla <html><head>
Il server risponde inviando il contenuto di un file che è presente nel file system.
Esecuzione di un CGI
Client
GET /cgi-bin/program?par1+par2 HTTP/1.0
Server
program
bla bla<html><head>
bla bla<html><head>
??
bla
bla
<htm
l><
hea
d>
bla
bla
<htm
l><
hea
d>
par1par2
par1par2
il server riconosce una chiamata ad un CGI dal fatto che la “risorsa” richiesta si trova in una directory particolare (es: http://…./cgi-bin/….)
Organizzazione interna del serverLa configurazione del server web prevede la definizione di due directory:
sito web cgi• la directory interna corrispondente
alla radice del sito web (viene specificato anche come viene acceduta dall’esterno, generalmente come “/”)
• la directory interna corrispondente alla radice dell’albero degli eseguibili (viene specificato anche come viene acceduta dell’esterno, tipicamente come “/cgi-bin/”)
file system interno del server
Input e output del CGI program
• un pacchetto GET viene inviato quando:
– L’utente specifica l’URL di un CGI
– Si clicca un link all’URL di un CGI
– Invio dati da una FORM con METHOD=GET
• un pacchetto POST viene inviato quando:
– Invio dati da una FORM con METHOD=POST
L’input di un CGI è una sequenza di valori o di coppie nome=valore
I dati vengono mandati al server tramite pacchetti GET o POST del protocollo http.
La form HTML
HTTPServer
form.html
CGI program
HTTPServer
1
2
3
4
Server1
Server2Client
Un esempio di FORMun esempio di form
In quale città vivi?
ResetSubmit
1) Netscape2) Explorer
Che browser stai usando?
<FORM METHOD=POST ACTION= “http://www.dia.uniroma3.it/cgi-bin/miofile”><P>In quale città vivi?<INPUT NAME=“city” TYPE=text SIZE=“20”><P>Che browser stai usando? <P> Netscape <INPUT NAME=“brow” TYPE=radio VALUE=“netscape”><P> Explorer <INPUT NAME=“brow” TYPE=radio VALUE=“explorer”><P><INPUT TYPE=submit> <INPUT TYPE=reset></FORM>
Marcatori HTML per le FORM<FORM></FORM> possibili attributi:
METHOD=GETMETHOD=POSTACTION=“http://host.com/cgi-bin/miofile”
<INPUT> possibili attributi:TYPE=TEXT (input testuale)TYPE=CHECKBOX (selezione)TYPE=RADIO (selezione esclusiva)TYPE=SUBMIT (tasto per inviare i dati)TYPE=RESET (per cancellare i dati)NAME=“mia_etichetta”VALUE=“valore_associato” (se selezionato)CHECKED (selezionato per default)
<SELECT> <OPTION>...</SELECT> (menù a tendina)possibili attributi:NAME=“mia_etichetta”
Pacchetto GET
Referer: http://www.spc.com/form.html User-Agent: Mozilla/4.05 [en] (Win95; I)Host: www.spc.comAccept: image/gif, image/x-xbitmap, image/jpeg, */*Accept-Language: enAccept-Charset: iso-8859-1,*,utf-8
GET /cgi-bin/miofile?city=roma&brow=netscape HTTP/1.0
Pacchetto POST
Referer: http://www.spc.com/form.htmlUser-Agent: Mozilla/4.05 [en] (Win95; I)Host: www.spc.comAccept: image/gif, image/x-xbitmap, image/jpeg, */*Accept-Language: enAccept-Charset: iso-8859-1,*,utf-8Content-type: application/x-www-form-urlencodedContent-length: 23
POST /cgi-bin/miofile HTTP/1.0
city=roma&brow=netscape
Vs
<A HREF=“http://www.altavista.com/cgi-bin/search?query=complexity> Ricerca Altavista sulla complessità</A>...
<A HREF=“http://www.altavista.com/cgi-bin/search?query=complexity> Ricerca Altavista sulla complessità</A>...
Indicato per grandi quantità di dati
Dati in qualsiasi formato (testi, immagini, video)
Solo in risposta ad una form
GETIndicato per pochi parametri
Solo parametri testuali
Possibilità di inserire un URL con parametri
opportuni all’interno di una pagina HTML
es.
POST
Interazione webserver-CGI
• come argomenti della linea di comando
• come variabili di ambiente
• come standard input
Esistono tre modi per passare i parametri dal server al CGI:
Il CGI invia la risposta al server sempre su standard output
Passaggio dei parametri
Submit diuna form
(contiene coppie“nome=valore”)
chiamata diretta ad URL (può
contenere o meno coppie
“nome = valore”) VARIABILIAMBIENTE
LINEA DI COMANDO
STANDARDINPUT
GET
POST
contiene “=“
non contiene “=“
Passaggio sulla linea di comando
il client invia una richiesta http:GET /cgi-bin/mioprog?val1+val2 HTTP/1.0
il server esegue: mioprog val1 val2
nel codice del programma mioprog.ci parametri potranno essere recuperati in questo modo:
main(int argc, char** argv){
…argv[1]; /* contiene val1 */argv[2]; /* contiene val2 */…
}
main(int argc, char** argv){
…argv[1]; /* contiene val1 */argv[2]; /* contiene val2 */…
}
Passaggio per standard input
il client invia una richiesta http:
nel codice del programma mioprog.c ci saranno istruzioni come:
il server passa i parametri a mioprog dallo standard input
oppurescanf(“%s”,stringa);scanf(“%s”,stringa); char c = getchar();char c = getchar();
POST /cgi-bin/mioprog HTTP/1.0…(una linea vuota)nome1=val1&nome2=val2
POST /cgi-bin/mioprog HTTP/1.0…(una linea vuota)nome1=val1&nome2=val2
al programmatore è lasciato il compito di fare il parsing della stringa
Passaggio con variabile di ambiente
il client invia una richiesta http:
il server esegue mioprog ma prima mette la stringa
“nome1=val1&nome2=val2”
nella variabile di ambiente QUERY_STRING
GET /cgi-bin/mioprog?nome1=val1&nome2=val2 HTTP/1.0GET /cgi-bin/mioprog?nome1=val1&nome2=val2 HTTP/1.0
nel codice del programma mioprog.c ci saranno istruzioni come:
char * str = getenv("QUERY_STRING");char * str = getenv("QUERY_STRING");
al programmatore è lasciato il compito di fare il parsing della stringa
Dal gateway al server(solo tramite standard output)
Se il nome del gateway program…
… comincia per “nph”(non parsed header)
Il server manda l’output del gateway program al client così com’è
… altrimenti
Il server premette l’header del pacchetto http
Il client aggiunge
Content-type: type/subtype(una riga vuota)…il resto del pacchetto http
Considerazioni sui CGI
• è possibile scrivere un CGI in un qualsiasi linguaggio (es. C, PERL, JAVA, VisualBasic)
• ogni consultazione di un CGI prevede il lancio di un nuovo processo sul server (questo può essere troppo oneroso)
• c’è un potenziale pericolo per la sicurezza dovuto al fatto che l’applicazione CGI viene lanciata dal processo server (con i privilegi di quest’ultimo)
• è uno standard de facto. Un tentativo di standardizzazione (Common Gateway Interface RFC Project) può essere reperito qui: http://web.golux.com/coar/cgi/