CGI (Common Gateway Interface)

Ce este CGI?

    CGI este un standard de comunicare intre documentele Web si scripturile CGI pe care le scrieti. Un program CGI este doar un program care comunica intr-un mod oarecare cu documentele Web, prin documente Web intelegand orice fel de fisiere utilizate pe Web. Existenta acestui standard permite realizarea unor pagini Web mai dinamice si mai interactive decat s-ar realiza numai cu pagini HTML (chiar daca aceste pagini contin scripturi care folosesc DHTML).

Limbaje

    Aplicatiile CGI pot fi scrise in orice limbaj care poate fi executat calculatorul care este server Web. Alegerea limbajului depinde de tipul aplicatiei. Perl, spre exemplu, este foarte bun pentru manipularea sirurilor si fisierelor, in timp ce C este bun pentru aplicatii mari si complexe. Perl si C sunt probabil cele mai utilizate limbaje pentru programarea CGI. Depinzand de tipul si destinatia aplicatiei, precum si de indemanarea programatorului (in diferitele limbaje), pentru aplicatiile CGI se pot folosi limbajele:

    Aceste limbaje, precum si multe altele, pun la dispozitie programatorului mijloace de a indeplini, pe de o parte, cerintele cuprinse in specificatiile CGI, iar pe de alta usureaza atingerea performantelor maximale ale acestei interfete.

La ce este utila aceasta interfata

In functie de complexitate aplicatiile CGI se impart in:

    1. Aplicatii simple de genul

    2. Aplicatii de complexitate medie cum ar fi:

    3. Aplicatii complexe precum:

Cum se transmit datele din browser scriptului CGI

    Simplu! Toate datele relavante transmise serverului de catre browser, precum datele dintr-un formular (la care browserul adauga automat antetele specifice protocolului HTTP), sunt transmise de server catre scriptul CGI fie prin intermediul unor variable de mediu, fie pe calea fisierului standard de intrare <STDIN> (care este modul implicit prin care un program primeste date).

Variabilele de mediu

    Atunci cand un browser apeleaza un script CGI de la server, serverul porneste programul CGI intr-un proces independent. Deoarece, la un moment dat, pe server acelasi script poate rula pentru mai multi utilizatori, serverul transmite fiecarui proces  in care este executat scriptul toata informatia de care acesta are nevoie pentru a deservi clientul pentru care a fost lansat procesul. Cu alte cuvinte exista o corespondenta univoca client - proces de rulare a scriptului, astfel incat, chiar daca este executat acelasi script, fiecare client va fi deservit conform cererii sale particulare.

    Deoarece serverul creeaza de fiecare data cate un nou mediu pentru fiecare proces in care este executat scriptul, calea cea mai simpla de transmitere a informatiei server - script se face prin intermediul variabilelor de mediu. Tabelul de mai jos listeaza variabilele de mediu ale CGI.

Variabilele de mediu ale CGI
Variabila Semnificatie
AUTH_TYPE

Contine metoda de autentificare folosita pentru a accepta cererea browserului, daca este folosita vre una. Un exemplu de metoda de autentificare este schema utilizator/parola.

CONTENT_LENGTH

Lungimea continutului furnizat de utilizator in pagina Web care apeleaza scriptul CGI. Deoarece acest continut este transmis scriptului sub forma unui sir (de caractere), aceasta lungime este exprimata in octeti (bytes), cate un byte pentru fiecare caracter.

CONTENT_TYPE

Contine tipul fisierului (datei) care insoteste cererea browserului catre scriptul CGI. Spre exemplu: text/html,sau image/jpeg.

GATEWAY_INTERFACE

Contine versiunea CGI care va fi utilizata. Pentru versiunea 1.1 a specificatiei CGI, aceasta variabila va fi CGI/1.1.

PATH_INFO

Contine informatii suplimentare privind o cale (path) necesara scriptului CGI. Aceasta informatie este plasata dupa un slash la URL-ului care apeleaza scriptul CGI.

este de regula o cale virtuala catre un alt document, relativ la radacina curenta a site-ului, pe care scriptul CGI sa il foloseasca. Aceasta valoare este precizata din informatia adaugata URL-ului care apeleaza scriptul CGI.

PATH_TRANSLATED

Contine calea completa catre PATH_INFO.

QUERY_STRING

Contine data furnizata de utilizator atunci cand metoda folosita este GET. Informatia transmisa sub forma de sir este adaugata dupa un semn de intrebare (?) la URL-ul de apelare. Spre exemplu, in URL-ul http://www.robertm.com/cgi-bin/answer.pl?state=CA, variabila QUERY_STRING contine "state=CA."

REMOTE_ADDR

Memoreaza adresa IP a masinii pe care ruleaza aplicatia browser care a apelat scriptul CGI.

REMOTE_HOST

Memoreaza numele domeniului caruia ii apartina masina pe care ruleaza aplicatia browser care a apelat scriptul CGI. Daca aceasta informatie nu ii este disponibila serverului numai REMOTE_ADDR va fi setata.

REMOTE_IDENT

Memoreaza numele de intrare al utilizatorului) (user's login name) numai daca serverul Web suporta identificare.

REMOTE_USER

Memoreaza numele utilizatorului specificat pentru autentificare. Acesta variabila este setata numai daca serverul suporta autentificare si scriptul CGI este protejat.

REQUEST_METHOD

Contine metoda folosita la apelarea scriptului CGI. Aceasta poate contina una dintre metodele de apelare valide pentru HTTP precum: GET, HEAD, POST, PUT si asa mai departe.

SCRIPT_NAME

Memoreaza calea virtuala si numele scriptului CGI care este executat. Aceasta este folosita drept URL pentru autoreferire.

SERVER_NAME

Contine fie numela, fie numele domeniului si adresa IP a masinii pe care ruleaza aplicatia de server Web.

SERVER_PORT

Contine numarul portului pe care browserul Web a trimis cererea catre server.

SERVER_PROTOCOL

Contine numele si versiunea protocolului utilizat pentru a face apelul scriptului CGI. In majoritatea cazurilor, acesta va fi ceva de genul "HTTP/1.0".

SERVER_SOFTWARE

Memoreaza numele si versiunea aplicatiei de server Web care executa scriptul CGI.

 

    In afara variabilelor de mediu CGI, serverul Web pune la dispozitia scripturilor toate datele cuprinse in header-ul HTTP transmis de browser. Si aceste informatii sunt plasate in variabile de mediu, toate avand prefixul HTTP_. Tabelul urmator listeaza aceste variabile.

 

Variabilele de mediu referitoare la antetul HTTP
HTTP Request Header Meaning
HTTP_ACCEPT

Contine lista de elemente separate prin virgula a tipurilor media pe care browserul le poate accepta in raspuns de la serverul Web. Exemple sunt audio/basic, image/gif, text/*, */*. Ultimele doua elemente contin (*) cu semnificatia de "orice" (wildcard), precizand ca sunt acceptate toate formele de text, iar */* specifica suportatre oricarui tip de continut.

HTTP_ACCEPT_ENCODING

Contine metodele de codificare pe care browserul le poate folosi la interpretarea raspunsului de la server. Exemple sunt: x-zip, x-stuffit si x-tar.

HTTP_ACCEPT_LANGUAGE

Contine limbajul preferat de browser pentru raspunsul de la server. Cu toate acestea, raspunsuri in orice limba nespecificata in aceste variabile sunt permise. Un exemplu este "en_UK", care se refera la engleza regatului unit (engleza vorbita in Anglia).

HTTP_AUTHORIZATION

Contine informatia privind autorizarea furnizata de browserul Web. VAloarea ei este utilizata de browser pentru a se autentifica pe el insusi catre server. Nu exista un singur format pentru toate posibilele valori ale acestui camp si noi formate pot fi adaugate. Un exemplu schema utilizator/parola in care valoarea este de forma "nume:parola".

HTTP_CHARGE_TO

Formatele acestui camp sunt inca nedeterminate. Totusi, este diponibil pentru a contine informatii referitoare la contul si costul pentru receptionarea informatiei solicitate.

HTTP_FROM

Contine numele utilizatorului furnizata de browserul WEB sub forma unei adrese de e-mail. Spre exemplu cineva@www.companie.com.

HTTP_IF_MODIFIED_SINCE

Poate contine o valoare specificata a datei intr-un format standard valid ARPANET, precum: Weekday,  DD-Mon-YY HH:MM:SS TIMEZONE. Acest camp poate fi utilizat in conjunctie cu metoda GET pentru a solicita un document numai daca s-a schimbat de la data specificata.

HTTP_PRAGMA

Contine valoarea oricarei directive speciale pentru serverul Web. De exemplu, un server de proxy Web are o valoare valida "no-cache", care inseamna ca serverul proxy sa returneze documentul solicitat direct de la server si nu din copia lui din cache. In acest mod se evita obtinerea unui document expirat atunci cand intre browser si serve este interpus un server proxy Web.

HTTP_REFERER

Contne URI-ul (uniform resource identifier, care este un superset al URL-ului) documentului care contine link-ul catre documentul solicitat. Un xemplu ar fi: http://fpce4.fizica.unibuc.ro/indexmiddle.html.

HTTP_USER_AGENT

Contine numele aplicatiei browser Web care solicita documentul. Un exemplu este: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90), care apare atunci cand se foloseste MSIE pe un sistem Me.

    In mod evident sunt multe variabile disponibile unui script CGI. Utilizarea unora sau altora se face in functie de cerintele aplicatiei concrete. In tabelul urmator este listat un script PERL pentru afisarea acestor variabile de mediu.

Scriptul CGI display.pl
#!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "AUTH_TYPE = $ENV{'AUTH_TYPE'}<BR>\n"; print "CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'}<BR>\n"; print "CONTENT_TYPE = $ENV{'CONTENT_TYPE'}<BR>\n"; print "GATEWAY_INTERFACE = $ENV{'GATEWAY_INTERFACE'}<BR>\n"; print "PATH_INFO = $ENV{'PATH_INFO'}<BR>\n"; print "PATH_TRANSLATED = $ENV{'PATH_TRANSLATED'}<BR>\n"; print "QUERY_STRING = $ENV{'QUERY_STRING'}<BR>\n"; print "REMOTE_ADDR = $ENV{'REMOTE_ADDR'}<BR>\n"; print "REMOTE_HOST = $ENV{'REMOTE_HOST'}<BR>\n"; print "REMOTE_IDENT = $ENV{'REMOTE_IDENT'}<BR>\n"; print "REMOTE_USER = $ENV{'REMOTE_USER'}<BR>\n"; print "REQUEST_METHOD = $ENV{'REQUEST_METHOD'}<BR>\n"; print "SCRIPT_NAME = $ENV{'SCRIPT_NAME'}<BR>\n"; print "SERVER_NAME = $ENV{'SERVER_NAME'}<BR>\n"; print "SERVER_PORT = $ENV{'SERVER_PORT'}<BR>\n"; print "SERVER_PROTOCOL = $ENV{'SERVER_PROTOCOL'}<BR>\n"; print "SERVER_SOFTWARE = $ENV{'SERVER_SOFTWARE'}<BR>\n"; print "HTTP_ACCEPT = $ENV{'HTTP_ACCEPT'}<BR>\n"; print "HTTP_ACCEPT_ENCODING = $ENV{'HTTP_ACCEPT_ENCODING'}<BR>\n"; print "HTTP_ACCEPT_LANGUAGE = $ENV{'HTTP_ACCEPT_LANGUAGE'}<BR>\n"; print "HTTP_AUTHORIZATION = $ENV{'HTTP_AUTHORIZATION'}<BR>\n"; print "HTTP_CHARGE_TO = $ENV{'HTTP_CHARGE_TO'}<BR>\n"; print "HTTP_FROM = $ENV{'HTTP_FROM'}<BR>\n"; print "HTTP_IF_MODIFIED_SINCE = $ENV{'HTTP_IF_MODIFIED_SINCE'}<BR>\n"; print "HTTP_PRAGMA = $ENV{'HTTP_PRAGMA'}<BR>\n"; print "HTTP_REFERER = $ENV{'HTTP_REFERER'}<BR>\n"; print "HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}<BR>\n";

 Apasa butonul de mai jos pentru a vedea variabilele

Test C

Cornel Mironel Niculae, 2003-2004

01-Mar-2004