• Non ci sono risultati.

L a P rog ra mm az ion e C GI

N/A
N/A
Protected

Academic year: 2021

Condividi "L a P rog ra mm az ion e C GI"

Copied!
15
0
0

Testo completo

(1)

Franco Zambonelli CGI - 1

C dL in Ing e gn e ri a E le tt ron ica e In fo rm a tica M odu lo d i Fond a m e n ti d i I n fo rm a tica D

L a P rog ra mm az ion e C GI

P ro f. F ra n c o Z a m bon e lli F e bb ra io 2001

Franco Zambonelli CGI - 2

P rog ra mm a z ione c li en t/ se rve r in WWW

richiesta

risposta HTTPclient HTTPserver

sistema remotosistema locale

Possibilità di avere risposta con informazioni dinamiche

Che tipo di elaborazione delle informazioni edove viene eseguita

richiestarispostatipo di elaborazioneDocumentoHTML Statica (la pagina è unfile, non modificabile) semplice trasferimentofile dal serverCGIdinamicaqualunque elaborazionesul nodo serverJava appletstaticacodice dal server nonmodificabile, esecuzionesul clientJavaapplicazione dinamicaserver elaboradinamicamente il codice(in base alla richiesta),esecuzione dinamica sulclient

(2)

Franco Zambonelli CGI - 3

C o mm on G a te w ay In te rf ace (C GI)

richiesta

risposta HTTPclient HTTPserver

CGI applicazioni

sistema remotosistema locale esterne

CGI è uno standard per interfacciare un server WWW conapplicazioni esterne (residenti sulla macchina server)

CGI fornisce all’utente la capacità di eseguire una applicazionesulla macchina server remota

richiestarispostatipo di elaborazioneCGIdinamica Qualunqueelaborazione,sulnodo server

La risposta ottenuta dal server è "dinamica", in quantorisultante dalla esecuzione di un programma sul server.

Franco Zambone

P rog ra mm a z ione C GI

Una applicazione CGI permette agli utenti di esapplicazione sul nodo dove risiede il server www.Applicazioni CGI possono essere scritte in: C/C++PERL, TCL, Any Unix shell, Visual Basic ….etc etc

Normale attivazione di una CGI:•Si invia al server un messaggio (ciò atipicamente riempiendo moduli, FORM HTMLserviranno come input al programma)•Il messaggio scatena l'esecuzione del programm•Il programma CGI genera come output una pagHTML in cui inserisce i risultati della sua esec

Interfaccia tra server WWW e applicazione CGI•Variabili di ambienteLinea di comandoStandard input: il server manda come standaalla applicazione CGI i dati ricevuti dal client Il numero di byte totali è nella varabile di CONTENT_LENGTH.•Coppie Nome-Valore: L’input della appliccostituito da insiemi di stringhe nome=vpratica, l’input è formato da una serie di variabnome e un valore. Le differenti variabili sono da &Standard output: l’applicazione CGI manda dell-elaborazione sullo standard output (in HTML), verso il server, il quale prende i dati e al client.

(3)

Franco Zambonelli CGI - 5

C li e n t H TT P →→ se rve r H TT P →→ C G I

Tipicamente, uso di form

<TITLE>Esempio di Form </TITLE><H1>Esempio di Form </H1>

<FORM METHOD="POST" ACTION="http://www-lia.deis.unibo.it/cgi-bin/post-query">

Inserisci del testo: <INPUT NAME="entry">

e premi per invio: <INPUT TYPE="submit"VALUE="Invio"></FORM>

Visualizzazione form

Franco Zambonelli CGI - 6

C li e n t H TT P →→ se rve r H TT P →→ C G I

Attributi del form tag

<TITLE>Esempio di Form </TITLE><H1>Esempio di Form </H1>

<FORM METHOD="POST" ACTION="http://www-lia.deis.unibo.it/cgi-bin/post-query">

Inserisci del testo: <INPUT NAME="entry">

e premi per invio: <INPUT TYPE="submit"VALUE="Invio"></FORM>

Dove:

ACTIONURL di chi processa la query

METHODmetodo usato per sottomettere il form:

POSTil form con i dati è spedito come data body(metodo consigliato), cioè come dati chefanno parte del testo del messaggio HTTP

GETil form con i dati è spedito attaccatoall’URL, cioè come parte integrantedell’URL del messaggio (action?name=value&name=value)

casoGEThttp://www-lia.deis.unibo.it/cgi-bin/get-query?entry=testocasoPOSThttp://www-lia.deis.unibo.it/cgi-bin/post-querye come data body:entry=testo

(4)

Franco Zambonelli CGI - 7

A pp li ca z ion e C G I →→ se rve r H TT P

Applicazione CGI usa standard output per mandare al server idati. I dati sono identificati da un header.

Tipi di dati forniti:

•full document con il corrispondente MIME type (text/html,text/plain per testo ASCII, etc.)

Esempio: per spedire una pagina HTML

Content-type: text/html

<HTML><HEAD><TITLE>output di HTML da script CGI</TITLE></HEAD><BODY><H1>titolo</H1>semplice <STRONG>prova</STRONG></BODY></HTML>

•reference a un altro documentoEsempio: riferisco un documento gopher

Content-type: text/htmlLocation: gopher://httprules.foobar.org/0

<HTML><HEAD><TITLE > Sorry ... it moved </TITLE></HEAD><BODY><H1>goto gopher </H1>Now available at<A HREF="gopher://httprules.foobar.org/0">new location</A> of gopher server.</BODY></HTML>

Franco Zam

A pp li ca z ion e C G I

Esempio: generazione della pagina di rispo(caso full document)

#include <stdio.h>...

main(int argc, char *argv[]) {int cl;

generazione di un full document in rispostaprintf("Content-type: text/html");

cl = atoi(getenv("CONTENT_LENGTH"));

for(x=0;cl && (!feof(stdin));x++) {...elaborazione dell’input (stdin)... /* L’input ad esempio sara’: “entry=ciao&Submit=Invio”}

printf("<H1>Query Results</H1>");printf("You submitted ...");

for(x=0; x <= m; x++)printf("...", ... , ....);}

(5)

Franco Zambonelli CGI - 9

ESE M P IO C O N M E T O D I P O S T E G E T

Franco Zambonelli CGI - 10

S O R G EN T E H T M L

<H1>Fondamenti di Informatica D</H1>

<I><P>Prof. <AHREF="http://www.dbgroup.unimo.it/Vincini.html">Maurizio Vincini</I></A> </P>

<HR>

<br>

<FONT SIZE="5"><B>Esempio di Inserimento dati -Lettura variabili d'ambiente</B></FONT>

<br>

<H1>Metodo POST</H1>

<FORM ACTION="LeggiVariabili.exe" METHOD=post>

<TABLE border="0" cellpadding="3"cellspacing="3" WIDTH="100%">

<tr><td colspan="5" align="right">

</td></tr>

<tr>

<P><td BGCOLOR="#76b6f2" width="200"><b>Stringainserita</b></td>

<td><INPUT NAME="var1"></td></P>

</tr>

</TABLE>

<BR>

<INPUT TYPE="submit" VALUE="Inserisci"id=submit name=submit>

<INPUT TYPE="reset" VALUE="Reset"></P>

</FORM>

<br>

(6)

Franco Zambonelli CGI - 11 <H1>Metodo GET</H1><FORM ACTION="LeggiVariabili.exe" METHOD=get><TABLE border="0" cellpadding="3"cellspacing="3" WIDTH="100%"><tr><td colspan="5" align="right"></td></tr><tr><P><td BGCOLOR="#76b6f2" width="200"><b>Stringainserita</b></td><td><INPUT NAME="var1"></td></P></tr></TABLE><BR><INPUT TYPE="submit" VALUE="Inserisci"id=submit name=submit><INPUT TYPE="reset" VALUE="Reset"></P>

</FORM>

S uppon ia m o d i i n s e rir e “p ippo ” e s o tt o m e tt e re

Franco Zambone

C O N P O S T

(7)

Franco Zambonelli CGI - 13

C O N G E T

Franco Zambonelli CGI - 14

C O D ICE C DE LL ’ESE M P IO

/* QUI METTEREMO TUTTO L’INPUT */char InputBuffer[4096];

/** Programma Principale*/int main(int argc, char *argv[]) {int ContentLength;int i;char *p;char *pRequestMethod;char *c;

/* Intestazione della pagina di output */

printf("Content-type: text/html\n");

/* Fine dell'header HTML*/ printf("\n");

/* Scrive le variabili di input */ printf("argc = %d\n<BR>\n",argc); for (i=0;i<argc;i++) { printf("argv[%d] = %s\n<BR>\n",i,argv[i]); } printf("\n<BR>\n");

/* Visualizza le variabili d'ambiente */

DisplayEnvVars();

printf("\n");

(8)

Franco Zambonelli CGI - 15

V ISUA L IZZ A Z IO NE VAR . A M B IEN T E

void DisplayEnvVars(void) {int i;

i = 0; while (_environ[i]) { printf("%s\n<BR>\n",_environ[i]);/* VISUALIZZA COPPIA NOME=VALORE*/ i++; } printf("\n<BR>\n");}

ALTERNATIVA (se si conosce il nome dellavariabile di interesse)

char *valore_var;

valore_var = getenv("HTTP_HOST");

/* oppure, se rappresenta un numero */cl = atoi(getenv("CONTENT_LENGTH"));

Franco Zambone

C O N T INUA IL M A IN .

/* Acquisizione metodo di richiesta (POST o GET) */ pRequestMethod = getenv("REQUEST_METHOD"); if (pRequestMethod==NULL) { return 0; }

if (_stricmp(pRequestMethod,"POST")==0) {

/* ADESSO ANDIAMO A RECUPERARE DIM. INPUT */

p = getenv("CONTENT_LENGTH");

/* Trasformiamo la stringa in intero */ if (p!=NULL) { ContentLength = atoi(p); } else { ContentLength = 0; }

/* controlliamo se InputBuffer e’grandeabbastanza */if (ContentLength>sizeof(InputBuffer)-1) { ContentLength = sizeof(InputBuffer)-1; }

(9)

Franco Zambonelli CGI - 17

S T A M P IA MO T U TT O L ’I NPU T

fgets(InputBuffer,ContentLength+1,stdin);i = strlen(InputBuffer);printf("Stringa inviata dal Form:<FONT COLOR=""blue"">%s</FONT>\n<BR>\n",InputBuffer);/* stampiamo tutto l’input come unica stringa*/

if(strcmp(p,"application/x-www-form-urlencoded")==0){strcpy(p, InputBuffer);/* copiamo input per non modificare *//* la copia originale */

/* Trova valore variabile var1 */c = GetField("var1", p);

if (c != NULL) {printf("La variabile var1 vale:<FONT COLOR=""red""> %s </FONT>", c);} else {printf("La variabile var1&egrave; NULL");} } else{ /* Visualizza i dati */ printf("Input = %s\n",InputBuffer); }

Franco Zambonelli CGI - 18

F UN Z IO N I PE R R E CU PE RAR E L E C O PP IE N O M E V A L O R E DA LL ’I N P U T (1 )

char *ValueField(char *Item){char *p;

p = strchr(Item,'=');/* torna la sottostringa che parte da ‘=’ */

if (p==NULL) return NULL; *p='\0';/* ci metteil terminatore, per spezzare lacoppia nome&valore in due stringhe separate */

/* incrementa, e punta alla stringa valore */ p++;

/* ritorna la stringa che rappresenta il valoredella variabile */return p;}

(10)

Franco Zambonelli CGI - 19

F UN Z IO N I PE R R E CU PE RAR E L E C O PP IE N O M E V A L O R E DA LL ’I N P U T (2 )

/* Ritorna il valore della variabile Itemcontenuta nella stringa Field */char *GetField(char *Item, char *Field){char *p;char *s;

p = strtok(Field,"&");/* la funzione strtok spezza una stringa indiverse stringhe, assumendo come punto diseparazione il secondo parametro*/ /* se ilprimo parametro e’ NULL, si intende che usiamoa spezzattare la stessa stringa di prima –ritorna la stringa separata dal resto *//* nel nostro caso, una stringa nome=valore *//* quando non e’ piu’possibile continuareaspezzettare, ritorna NULL */

while (p!=NULL) { s = ValueField(p);/* andiamoa estrarre il valore dalla stringanome valore */

printf("Valore di variabile(%s) = %s <BR>\n",p, s);

if (strcmp(p, Item) == 0) return s; p = strtok(NULL,"&");/* se non ha trovato la variabilecercata,continua a spezzattare la stringa di input… */ }

return NULL;}

Franco Zambone RECUPERO VALORI VARIABILI: ATTEN

Il Web server tratta in modo particolare i carattinviati dalle CGI.

Caratteri speciali quali: ‘à’ (lettere accentateetc…

Esempio: la ‘à’ diventa ‘%E5’ (cioè il esadecimale che rappresenta il codice ASCaccentata).

Esempio: lo spazio ‘ ‘ diventa ‘+’.

Nella CGI, bisogna effettuare la conversione inv

/** Ritorna il valore della variabile*/char *ValueField(char *Item) {char *p;

p = strchr(Item,'='); if (p==NULL) return NULL; *p++='\0';/* la funzione URL decode ri-trasforma lacodifica dei caratteri speciali, p.e.,trasforma i‘+’ in spazi.

urlDecode(Item); urlDecode(p);return p;}

(11)

Franco Zambonelli CGI - 21 FUNZIONE URLDECODE

/** Decodifica la stringa in input che utilizza il %

*/void urlDecode(char *p) {

char *pD;

pD = p;

while (*p) {

if (*p=='%') {

/* i 2 char successivi sono larappresentazione hex del carattere in esame */

p++;

// isxdigit ritorna un valore != 0 nel casoin cui il char sia di tipo esadecimale

if (isxdigit(p[0]) && isxdigit(p[1])) {

*pD++ = (char) TwoHex2Int(p);

p += 2;

}

} else {

if (*p=='+') { /* SPAZIO DIVENTATO ‘+’ */

*pD++ = ' ';

p++;

}else

*pD++ = *p++;

}

}

*pD = '\0';

}

Franco Zambonelli CGI - 22 FUNZIONE TwoHex2Int

/** The string starts with two hex characters. Returnan integer formed from them.*/static int TwoHex2Int(char *pC) {int Hi;int Lo;int Result;

Hi = pC[0]; if ('0'<=Hi && Hi<='9') { Hi -= '0'; } else if ('a'<=Hi && Hi<='f') { Hi -= ('a'-10); } else if ('A'<=Hi && Hi<='F') { Hi -= ('A'-10); } Lo = pC[1]; if ('0'<=Lo && Lo<='9') { Lo -= '0'; } else if ('a'<=Lo && Lo<='f') { Lo -= ('a'-10); } else if ('A'<=Lo && Lo<='F') { Lo -= ('A'-10); } Result = Lo + 16*Hi; return Result;}

(12)

Franco Zambonelli CGI - 23

BAS IC F O R M T A G S

I forms sono i moduli per richiedere informazioniall’interno delle pagine html.

Tag/attributeUse<FORM>Indica un form all’interno di undocumento HTML. All’internodi <FORM></FORM> sidevono mettere tutti icampiche servono per generalel’input e sottmetterlo al server

<INPUT TYPE=SUBMITVALUE=> Fornisce un pulsante submitper il form. La pressione diquesto pulsante scatenal’invio del form al server.L’attributo value produce iltesto sul pulsante.<INPUT TYPE=IMAGENAME= POINTSRC= BORDER=0> Fornisce un pulsante submitgrafico. L’attributo SRC indical’immagine che è originata dalfile indicato, e l’attributo bordo= compone il bordodell’immagine.<INPUT TYPE=RESETVALUE= > Fornisce un pulsante reset peril form, che annulla tutti i datiinseriri. L’attributo VALUEproduce un testo sul pulsante.

Franco Zambone

Inpu t F ie ld Tag and A tt ri bu te

Tag/attributeUse<INPUT>Fissa un’area in un form per l’idall’utenteTYPE= Fissa il tipo di campo di inpuvalori sono TEXT, PASSCHECKBOX, RADIO, FILEIMAGE, SUBMIT, e RESET.NAME= Nome della variabileVALUE= Fornisce un contenuto assNAME= “…. Bisogna usattributo con i pulsanti CHECKBOX perché nonaccinput. Si può anche usare con per avere un input iniziale.SIZE= nFissa la dimensione visibile peEpossibile usare questo asolamente con i text input.MAXLENGTH=n Fissa il plungo set di capossono essere sottomessquesto attributo con text fieldsSELECTEDIndica la selezione di defauessere presentata quandoinizialmente caricato o resettaACCEPT= Specifica i tipi accettabili di Mcaricati. Wildcards sono accein image/*.

(13)

Franco Zambonelli CGI - 25

Tex t A rea Tags and A tt ri bu tes

Tag/attributesUse<TEXTAREA>Fissa un’area in un form per uninserimento dati testuale dell’utente. Ilcontenuto iniziale del textarea va inseritotra l’opening e il closing tag.NAME= Stabilisce una nome per un input field.L’attributo NAME è usato nel caso di CGIROWS= Fissa il numero di linee per l’areaCOLS= Fissa il numero di colonne per l’area.

Franco Zambonelli CGI - 26

S e lec t F ied ls Tags and A tt ri bu tes

Tag/attributesUse<SELECT>Fissa un’area in un form per un field diselezione che può intendersi come unalista a cascata.NAME= Stabilisce un nomeSIZE= nFissa la dimensione di larghezza per icampi. Il default crea una lista a cascata.Si può cambiare il default (2 o maggiore)se si vogliono popzioni ben visibili.MULTIPLEFa si’ che un campo selezionato accettipiù di una selezione. Si utilizza questoattributo insieme a SIZE= per fissare unnumero grande quanto il massimonumero di possibili selezioni.<OPTION>Evidenzia i valori inclusi nel camposelezionato. Si avrà un <OPTION> perogni item che si inserirà . Il closing tag èopzionale.VALUE= Fornisce un valore associato a NameSELECTEDFa specificare una selezione per defaultche apparirà quando il form è inizialmentecaricato o resettato

(14)

Franco Zambonelli CGI - 27

ESE M P I

<FORM method="POST" action="/cgi-bin/giudizio">

<B><FONT SIZE=+1>Dati Revisore</FONT></B>

<INPUT TYPE=”HIDDENNAME=”ANNOVALUE=”2001”>

<SELECT NAME="Revisore">

<OPTION SELECTED VALUE="Nessun Nome">Nome Revisore

<OPTION VALUE=" Sonia Bergamaschi"> Sonia Bergamaschi

<OPTION VALUE=" Letizia Leonardi"> Letizia Leonardi

<OPTION VALUE=" Franco Zambonelli"> Franco Zambonelli

</SELECT>

.

Franco Zambone <P><I><FONT SIZE=+1> Esprimi un giudizio sintetico peda 1 a 10 </FONT></I>

<P><B><FONT SIZE=+1>1) Rilevanza del contributo neObject-Oriented</FONT></B>

<P><FONT SIZE=+1>1 completamente irrilevante10 molto rilevante in OO</FONT>

<DL><DT><FONT SIZE=+2>

<INPUT type="RADIO" name="Rilevanza" value="1" checked

<INPUT type="RADIO" name="Rilevanza" value="2">2

<INPUT type="RADIO" name="Rilevanza" value="3">3

<INPUT type="RADIO" name="Rilevanza" value="10">10</FONT>

</DT></DL>

(15)

Franco Zambonelli CGI - 29 <P><P><B><FONT SIZE=+1>Commenti </FONT></B><BR><textarea name="Commenti Generali" rows="20" cols="80"maxlength="65000" wrap="HARD"></textarea><P><FONT SIZE=+1>&nbsp;</FONT>

Franco Zambonelli CGI - 30 <P><p>Data<input type="TEXT" size="8" maxlength="8" name="Data">

<input type="SUBMIT" value="Invia">

<input type="RESET" value="Azzera"></p></FORM></BODY></HTML>

Riferimenti

Documenti correlati

Occorre precisare che, poiché per ogni macrostrato sono state presi in esami due inviluppi delle velocità e due inviluppi del decadimento del modulo di taglio, le regressioni

Analisi Matematica 1, Esercizi sui limiti (giustificare le risposte).. Vicenza,

della variabile X1 si tiene conto anche degli effetti della variabile X2. La stima –53.22 ci dice che, per un dato ammontare della spesa per l’attività promozionale, si

Progettare e implementare tre function per il calcolo di zeri di funzioni con controllo

La matrice di smorzamento [C] è composta da un termine MPD (mass proportional dumping α) che moltiplica la matrice delle masse [M] e da un termine SPD (stiffness proportional dumping

Per determinare quale sia il sistema di separazione più opportuno, occorre considerare la fase della corrente in uscita dal reattore6. ¾ Se LIQUIDA occorre un sistema di

Al termine, seduti a semicerchio, quaderno e penna alla mano ciascun alunno scrive le altezze dei compagni che a loro volta a turno registrano le loro altezze così come

int getValue(Contatore);void setValue(Contatore *, int ) ;void inc(Contatore *c);void dec(Contatore