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

  1. CGI programm kutsutakse välja <FORM> elemendiga.
    <FORM> elementi kasutatakse tavaliselt andmebaasidega suhtlemiseks.
    Näit. &ltFORM 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/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 [vajalik internetiühendus]
Yahoo:Computers and Internet:Internet:World Wide Web:CGI - Common Gateway Interface
[vajalik internetiühendus]

Kindlasti loe ka oma serveri dokumentatsiooni !


© Copyright 1996, Kain Kalju
All Rights Reserved