Sissejuhatus.
CGI (Common Gateway Interface) on standard servermasinas jooksvate programmidega suhtlemiseks. Sellised programmid asuvad tavaliselt kataloogis /cgi-bin/ või on laiendiga .cgi. CGI programmide standard sisendiks (STDIN) on WWW browseri poolt saadetud infojada ja väljundiks (STDOUT) WWW browserile saadetav infojada. Cache serverid CGI programmiga vahetatud infot tavaliselt ei puhverda.
Keel.
CGI programm võib olla kirjutatud põhimõtteliselt suvalises keeles. Suur osa CGI programme on kirjutatud C-s, Perlis või mõnes UNIX shellis.
Näide lihtsast CGI scriptist (Perl), mis näitab kõiki tema keskonnamuutujaid.
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
while (($key, $val) = each %ENV) {
print "$key = $val<BR>\n";
}
Sellise prograammi käivitamise tulemusena tekib järgmine väljund:
SERVER_SOFTWARE = Apache/1.1.0
GATEWAY_INTERFACE = CGI/1.1
DOCUMENT_ROOT = /usr/local/etc/httpd/htdocs
REMOTE_ADDR = 193.40.112.60
SERVER_PROTOCOL = HTTP/1.0
REQUEST_METHOD = GET
REMOTE_HOST = nuhk.rei.ee
QUERY_STRING = bla
HTTP_USER_AGENT = Mozilla/2.02 (X11; I; Linux 1.2.13 i486)
PATH = /bin:/usr/bin
HTTP_CONNECTION = Keep-Alive
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
SCRIPT_NAME = /cgi-bin/test-cgi
SCRIPT_FILENAME = /usr/local/etc/httpd/cgi-bin/test-cgi
HTTP_PRAGMA = no-cache
SERVER_NAME = www.keila.edu.ee
HTTP_COOKIE = Keila=nuhk7527836863883107
SERVER_PORT = 80
HTTP_HOST = www.keila.edu.ee
SERVER_ADMIN = webmaster@keila.edu.ee
Samasuguse väljundi tekitab ka järgnev C-s kirjutatud programm:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int i;
printf("Content-type: text/html\n\n");
for (i=0; environ[i] != NULL; ++i)
printf("%s <BR>\n", environ[i]);
}
Muutujad.
HTTP serveri poolt CGI programmile edastatavad keskkonnamuutujad.
SERVER_SOFTWARE | HTTP serveri info |
SERVER_NAME | server host |
SERVER_ADMIN | serveri administraatori e-posti aadress |
SERVER_PORT | serveri pordi number |
SERVER_PROTOCOL | HTTP versioon |
GATEWAY_INTERFACE | CGI versioon |
REQUEST_METHOD | päringu meetod |
QUERY_STRING | kasutajalt tulev päring (GET meetodil) |
REMOTE_HOST | kasutaja host |
REMOTE_ADDR | kasutaja hosti IP number |
REMOTE_USER | kasutaja nimi (eelneva autentimise korral) |
DOCUMENT_ROOT | serveri juurkataloog |
PATH | kasutatavate programmide asukoht |
PATH_INFO | CGI töökataloog |
PATH_TRANSLATED | täielik töökataloog |
HTTP_REFERER | URL millelt pöörduti |
HTTP_USER_AGENT | info kasutaja browseri kohta |
HTTP_COOKIE | Küpsis(ed) |
HTTP_ACCEPT | millist tüüpi võib väljund olla |
HTTP_PRAGMA | no-cache, saadetakse dokumendi uuesti lugemisel (reload) |
Märkus: Erinevatel HTTP serveritel võivad muutujate
nimed olla erinevad. Konkreetses näites on toodud Apache serveri poolt CGI'le edastatavad.
Muutujad, mis algavad tähtedega HTTP_ on HTTP päringu päise väljad.
Näiteks päringu:
GET /cgi-bin/test-cgi HTTP/1.0
Lollus: blaah
välja Lollus väärtuse saab programm keskonnamuutuja HTTP_LOLLUS näol.
Käivitamine.
CGI programm käivitatakse HTTP serveri poolt kui viimane saab vastava päringu.
CGI program peab olema HTTP serveri konfiguratsioonis märgitud kataloogis
või omama konfiguratsioonis kirjeldatud laiendit, et server teda käivitamise asemel kliendile tavalise dokumendina ei serveeriks.
CGI programmile viitamiseks on mitmeid meetodeid.
- CGI programm kutsutakse välja <FORM> elemendiga.
<FORM> elementi kasutatakse tavaliselt andmebaasidega suhtlemiseks.
Näit. <FORM ACTION="/cgi-bin/test-cgi"><INPUT TYPE=TEXT NAME="query"></FORM>
Sellisel juhul käivitatakse CGI programmi muutujaga QUERY_STRING="query=sisse_toksitud_tekst".
Päringu saab edestada ka POST meetodil.
- CGI programm kutsutakse välja <A> elemendiga.
Näit. <A HREF="/cgi-bin/test-cgi?test">
Sellisel juhul käivitatava programmi muutuja QUERY_STRING="test". Programm käivitatakse juhul kui kasutaja järgib seda viidet.
- CGI programm kutsutakse välja <IMG> elemendiga.
Näit. <IMG SRC="/cgi-bin/test-cgi?test">
Sellisel juhul käivitatava programmi muutuja QUERY_STRING="test". Programmi poole pöördutakse kui kasutaja vaatab lehekülge, millel viide asub ja tema browser automaagiliselt downloadib ka kõik sellel lehel olevad <IMG> viited (auto load images).
Viimasel moodusel käivitatakse countereid.
- Kindlasti tekib neid aegade jooksul juurde. Lihtsalt ei hakka siia kõike sarnaseid viise välja tooma.
Kõik GET meetodil edastatav info on päringus välja kutsutava programmi URL'i lõpus "?" märgiga eraldatud (/cgi-bin/test?query).
CGI töökataloog edastatakse ka kohe päringus välja kutsutava programmi URL'i lõpus "?" ja programmi nime vahel (/cgi-bin/test/kataloog?query). Viimasel juhul saab hästi edastada infot arhiivide päringuaparaatidele.
Sisend.
CGI programmile antakse muutujad kas GET või POST meetodil.
Vormidelt saadud info GET meetodina edastatakse QUERY_STRING muutujana. POST
meetodiga tõmmatakse ennem käima CGI ja siis loetakse info
standard sisendist otse mingiks suvalise nimega muutujaks. Iga query alam osa on eraldatud
& sümboliga. Näit. word=tere&lang=eesti
Perlis vöiks sellise info lammutada muutujateks lausega:
($a,$word,$b,$lang) = split(/[&,=]/, $query_sting, 4);
QUERY_STRING väärtuses võivad osad sümbolid olla kodeeritud. Selleks kasutatakse kodeeringut application/x-www-form-urlencoded, mida kirjeldab rfc1738.
Väljund.
CGI programmilt tulev väljund peab algama MIME reaga Content-type:, mis määrab väljundi tüübi.
Näit. Content-type: text/html, mis tähendab, et väljund on HTML tüüpi.
Juhul kui CGI programmi nime alguses on nph- (no parse header) (Näit. /cgi-bin/nph-test), siis peab
väljundis olema terve HTTP päis, kuna server sellisel juhul päisesse ise midagi juurde ei kirjuta. Kindlasti peaks hakkama reaga HTTP/1.0 200 OK.
Väljund võib olla suvalist tüüpi. Ainukeseks tingimuseks, et kasutaja browser seda tunneks.
Näiteks võib tekitada päringu tulemusena MS Wordi dokumendi (Content-type: application/msword)
mille peale käivitab WWW browser peale vastuse kätte saamist eelpool nimetatud
programmi ja kasutaja saab seda lugeda, salvestada, muuta ja välja printida.
Võimatu ei tohiks olla ka interaktiivsete filmide loomine, kus kasutaja
saab peale igat vaadatud videoklippi otsustada filmi edasise käigu üle.
CGI võimalused on peaaegu piiramatud.Teoreetiliselt võikski
tööks kasutada ainult CGI programme ja WWW browserit. Ainukeseks
piiranguks on ehk võrgu ühenduse kiirus.
Content-type: | faili laiend |
application/msword | doc |
application/pdf | pdf |
application/postscript | ai eps ps |
application/wordperfect5.1 | wp |
application/x-dvi | dvi |
application/x-tex | tex |
application/x-texinfo | texinfo texi |
application/x-troff | t tr roff |
application/x-troff-man | man |
application/x-troff-me | me |
application/x-troff-ms | ms |
application/zip | zip |
application/x-cpio | cpio |
application/x-gtar | gtar |
application/x-shar | shar |
application/x-tar | tar |
audio/basic | au snd |
audio/x-aiff | aif aiff aifc |
audio/x-wav | wav |
image/gif | gif |
image/jpeg | jpeg jpg jpe |
image/tiff | tiff tif |
image/x-portable-bitmap | pbm |
image/x-portable-graymap | pgm |
image/x-portable-pixmap | ppm |
image/x-rgb | rgb |
image/x-xbitmap | xbm |
image/x-xpixmap | xpm |
message/news | |
message/partial | |
message/rfc822 | |
multipart/digest | |
multipart/mixed | |
multipart/parallel | |
text/html | html |
text/plain | txt |
video/mpeg | mpeg mpg mpe |
video/quicktime | qt mov |
video/x-msvideo | avi |
video/x-sgi-movie | movie |
Näpunäiteid.
Näpunäited on koostatud Apache ja NCSA serverite kasutamise kogemuste põhjal.
Mõlemad eelpool mainitud serverid lubavad CGI programmil öelda HTTP staatuse, millega vastav väljund kasutajale tagastatakse.
Selleks peaks väljundi esimesel real olema Status: 200 OK. Staatus võib põhimõtteliselt olla suvaline.
Näiteks võib programm "valetada", et teda polegi olemas: Status: 404 Not Found
Kasutaja ümbersuunamiseks peaks programm väljundiks andma:
Location: http://www.server.domain/, mille peale teatatakse kasutajale, et lehekülg, mida Te vaatada soovisite on ajutiselt viidud uuele aadressile (http://www.server.domain/).
CGI programmi väljundi puhverdamise vältimiseks võite väljundisse lisada Pragma: no-cache.
Või kui soovite, et kasutaja saaks antud infi mõnda aega kasutada, võite lisada hoopis Expires: HTTP-date. HTTP-date võib olla kas rfc1123 või rfc850 kirjeldatud kujul.
NPH- algusega programmide väljund saadetakse TCP/IP paketti suuruse ulatuses kasutajale juba enne programmi töö lõppu. Näiteks saab seda kasuta kasutajale reaalajas infi saatmiseks.
Kuna tavalise CGI programmi väljund kogutakse nii kui nii enne kasutale saatmist serveri puhvrisse, siis oleks vahest mõtekas lugeda vastuse baidid kokku ja lisada päisesse Content-length: baiti, et Keep-Alive toetava browseri korral saaks sama TCP/IP ühendust katkestamata veel ka mõne teise päringu serverile esitada.
Asjakohast Kirjandust.
HTTP/1.1 protokolli uuri http://www.w3.org/pub/WWW/Protocols/HTTP/1.1/spec.html
Yahoo:Computers and Internet:Internet:World Wide Web:CGI - Common Gateway Interface
Kindlasti loe ka oma serveri dokumentatsiooni !