http://www.neti.ee/CGI.html
(kiirem), http://www.keila.edu.ee/CGI.html(aeglasem)
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.
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]);
}
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.
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.
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 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.
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.
MIME tüüpe.Content-type: | faili laiend |
---|---|
application/msword | doc |
application/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ä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.
HTTP/1.1 protokolli uuri
http://www.w3.org/pub/WWW/Protocols/HTTP/1.1/spec.html [vajalik internetiühendus]Kindlasti loe ka oma serveri dokumentatsiooni !