CGI Tutvustus.

http://www.neti.ee/CGI.html(kiirem), http://www.keila.edu.ee/CGI.html(aeglasem)

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_SOFTWAREHTTP serveri info
SERVER_NAMEserver host
SERVER_ADMINserveri administraatori e-posti aadress
SERVER_PORTserveri pordi number
SERVER_PROTOCOLHTTP versioon
GATEWAY_INTERFACECGI versioon
REQUEST_METHODpäringu meetod
QUERY_STRINGkasutajalt tulev päring (GET meetodil)
REMOTE_HOSTkasutaja host
REMOTE_ADDRkasutaja hosti IP number
REMOTE_USERkasutaja nimi (eelneva autentimise korral)
DOCUMENT_ROOTserveri juurkataloog
PATHkasutatavate programmide asukoht
PATH_INFOCGI töökataloog
PATH_TRANSLATEDtäielik töökataloog
HTTP_REFERERURL millelt pöörduti
HTTP_USER_AGENTinfo kasutaja browseri kohta
HTTP_COOKIEKüpsis(ed)
HTTP_ACCEPTmillist tüüpi võib väljund olla
HTTP_PRAGMAno-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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

MIME tüüpe.

Content-type:faili laiend
application/msworddoc
application/pdf pdf
application/postscriptai eps ps
application/wordperfect5.1wp
application/x-dvi dvi
application/x-textex
application/x-texinfotexinfo texi
application/x-trofft tr roff
application/x-troff-manman
application/x-troff-meme
application/x-troff-msms
application/zipzip
application/x-cpiocpio
application/x-gtargtar
application/x-sharshar
application/x-tartar
audio/basicau snd
audio/x-aiffaif aiff aifc
audio/x-wavwav
image/gifgif
image/jpegjpeg jpg jpe
image/tifftiff tif
image/x-portable-bitmappbm
image/x-portable-graymappgm
image/x-portable-pixmapppm
image/x-rgbrgb
image/x-xbitmapxbm
image/x-xpixmapxpm
message/news
message/partial
message/rfc822
multipart/digest
multipart/mixed
multipart/parallel
text/htmlhtml
text/plaintxt
video/mpegmpeg mpg mpe
video/quicktimeqt mov
video/x-msvideoavi
video/x-sgi-moviemovie

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 !


© Copyright 1996, Kain Kalju
All Rights Reserved