CGI programy

V predoslych castiach VPW sme si ukazali, ako vytvorit stranku pomocou prikazu HTML. Zaoberali sme sa stylmi a moznostami textu, obrazkami, tabulkami a oknami. V casti Formulare sme sa vsak priblizili k teme CGI programov. Tato cast je venovana iba im.

CGI - Common Gateway Interface

CGI je rozhranie, pomocou ktoreho mozete prepojit WWW stranku s aplikaciou. Znamena to, ze vystup CGI programu sa da zobrazit v prehliadaci. CGI programy sa vykonavaju na strane servera, preto nijakym sposobom nezatazuju prehliadac.

Aby ste mali lepsiu predstavu o tom, na co mozno pouzit CGI, prezradim vam, ze pomocou tohto rozhrania su robene pocitadla pristupov, statistiky a formulare.

Co su to CGI programy?

CGI programy su programy ako kazde ine, maju vsak tu specificku vlastnost, ze sa spustaju z webovskej stranky. Jedine, cim sa odlisuju od beznych programov, su vstupne udaje, ktore sa vacsinou ziskavaju z formularov a vystupne udaje, ktore sa zobrazuju ako WWW stranka.

CGI programy sa velmi casto vytvaraju pomocou skriptovych jazykov (Perl, sh, tcl, ...) a preto sa casto oznacuju aj ako CGI skripty. Aplikacne rozhranie vsak umoznuje spustat aj kompilovane (spustitelne, binarne) subory (napr. binarka programu v jazyku C, C++, ...). Konkretna pouzitelnost niektoreho skriptoveho jazyka zavisi od WWW-servera.

Ako sa spustaju CGI programy

CGI programy spustate tak, ze nechate zobrazit ich URL, presne ako kazdy iny dokument. Napr. <A HREF="http://example.com/cgi-bin/pokus/skript.pl">skript</A> spusti skript "skript.pl" a zobrazi jeho vystup v prehliadaci.

Ak chcete skript spustit s parametrami, mozete to urobit tak, ze ich pripojite k URL (oddeluju sa znakom "&"):
<A HREF="http://example.com/cgi-bin/pokus/skript.pl?parameter1=hodnota1&parameter2=hodnota2">skript</A>

Pravdepodobne vsak vyuzijete skor formulare, pomocou ktorych ziskate vstupne argumenty pre CGI program.

Vytvaranie CGI programov

CGI programy sa vykonavaju na strane servera s pravami pouzivatela, pod ktorym bezi WWW-server. V zasade su umiestnene v specialnom podadresari (najcastejsie cgi-bin). Obsah tohto adresara sa z webu neda vypisat, ale iba spustit. Okrem toho si treba uvedomit, ze pravo zapisu do tohto adresara ma vo vacsine pripadov iba webmaster. V pripade, ze chcete vytvarat CGI programy, musite sa teda dohodnut s nim alebo spravcom systemu. (Je vyhodne byt webmastrom ;-)

CGI programy sa teda musia nachadzat vo vopred urcenom adresari. (Ked si uvedomite, ze kazdy CGI program je potencialne nebezpecny, pochopite, preco ich nemoze vytvarat hocikto.)

Zakladna struktura CGI programu

CGI program musi v zasade urobit toto:

  1. vypisat hlavicku Content-type: MIME typ\n\n
  2. spracovat vstupne udaje (argumenty programu alebo argumenty z formulara)
  3. vypisat vystupne udaje vo formate MIME typ na standardny vystup (STDOUT)

Hlavicka s MIME-typom

Kazdy CGI program musi skor, nez zacne cokolvek vypisovat, oznamit WWW-serveru, aky format udajov ma predpokladat. Hlavicka je potrebna pre samotny prenos "vasho vypisu" pomocou http protokolu. Preto na zaciatku (pred prvym vypisom) vasho programu vypiste na standardny vystup text:

Content-type: MIME-typ\n\n

Konkretny priklad - ak vas program bude vypisovat HTML prikazy:

Content-type: text/html\n\n

Iny priklad - ak vas program bude vypisovat iba cisty text:

Content-type: text/plain\n\n

V pripade, ze chcete vypisat napr. subor typu GIF, bude to:

Content-type: image/gif\n\n

Dolezite: ak vas CGI program sposobi zobrazenie "Internal server error" a/alebo v chybovom logu najdete zaznam "Malformed header", znamena to, ze nevypisujete spravnu hlavicku! Nezabudnite na dva znaky konca riadku (\n)! Su velmi dolezite.

Vstupne argumenty:

CGI program moze nacitat vstupne argumenty tromi sposobmi:

  1. ako vstupne argumenty (char *argv[] v C alebo @ARGV v Perle), ak CGI program spustite priamo s tymito parametrami (pripojenymi za "?" v URL)
  2. z environmentalnej premennej QUERY_STRING (ak pouzijete udaje z formulara s METHOD="GET").
  3. zo standardneho vstupu (ak pouzijete udaje z formulara s METHOD="POST")

Okrem vstupnych argumentov moze CGI program mnozstvo environmentalnych premennych, ktore nastavuje WWW server. Tieto premenne si opiseme v casti Environmentalne premenne v CGI.

Nacitanie argumentov z ARGV je bezproblemove. Horsie to je v zvysnych dvoch pripadoch. Predpokladajme takyto formular:

<FORM METHOD="GET" ACTION="/cgi-bin/pokus/skript.pl">
Login: <INPUT TYPE="text" NAME="username">
Password: <INPUT TYPE="password" NAME="password">
<INPUT TYPE="submit"> </FORM>

Dolezite: ak vam este nikto nepovedal, ze taketo nacitavanie hesla nie je bezpecne, hovorim vam to teraz ja. Tento formular je iba priklad.

Ako ste si vsimli, formular ma nastavenu metodu "GET". To znamena, ze vsetky parametre a ich hodnoty sa prilepia k URL CGI programu za "?". Jednotlive parametre su oddelene znakom "&". Medzera je nahradena znakom "+". Vsetky znaky okrem pismen a cislic su dalej nahradene "escape" kodom v tvare %hexa_cislo, ktore reprezentuje hexadecimalnu hodnotu daneho znaku v ASCII tabulke. Ked napr. odoslem formular s hodnotami "vix" a "heslo", zobrazuje (a spusti) sa URL:
http://example.com/cgi-bin/pokus/skript.pl?username=vix&password=heslo

Okrem toho sa retazec s tymito parametrami vlozi aj do environmentalnej premennej QUERY_STRING. V pripade metody "POST" je retazec v tom istom tvare na standardnom vstupe programu. Nastava klucovy problem - ako nacitat parametre a ich hodnoty?

Ak si na to nenaprogramujete vlastny algoritmus (podla tych par viet, co som napisal pred chvilou), mozete pouzit uz hotovy parser. Ak pouzivate Perl, skuste najst na Google skript formlib.pl. Je volne siritelny a funguje. Perl (aspon distribucie pre Linux a Windows - nepredpokladam, ze robite na niecom exotickejsom) navyse obsahuje kniznice (moduly) na pracu s HTML a CGI. Ja to robim cez formlib, vy nemusite.

Priklad 1 (Perl): nacitanie hodnot a ich zobrazenie s vyuzitim "formlib.pl"

#!/usr/bin/perl
require "formlib.pl";

print "Content-type: text/html\n\n"; # hlavicka s MIME typom
&GetFormArgs();                      # nacitanie hodnot formulara
                                     # formlib.pl ich ulozi do hash-pola %in
print <<FIN;                         # vypis az po navestie FIN
<HTML>
<HEAD><TITLE>pokus</TITLE></HEAD>
<BODY>
<H1>Zadane hodnoty:</H1>
Login: $in{username}<BR>             # vypis hodnoty hash-pola s klucom
Password: $in{password}              # username resp. password (nase premenne
</BODY>                              # z formulara!)
</HTML>
FIN                                  # tu je navestie FIN
  

Environmentalne premenne v CGI

CGI program moze pocas behu vyuzit hodnoty environmentalnych premennych, ktore nastavil WWW server. Tu su niektore z nich s opisom:

PremennaOpisUkazkova hodnota
REQUEST_METHOD metoda, ktora bola pouzita na prenos udajov GET
QUERY_STRING udaje z formulara username=vix&password=password
REMOTE_ADDR adresa, z ktorej sa ziada zobrazenie stranky (adresa klienta alebo proxy servera). Mozete ju pouzit napr. pri kontrole pristupu. axp.elf.stuba.sk
SCRIPT_NAME lokalna URI adresa spustaneho programu (v ramci priestoru WWW servera) /cgi-bin/env.pl
SCRIPT_FILENAME plna cesta k programu /services/httpd/cgi-bin/env.pl
REQUEST_URI URI vyziadaneho suboru (pre skripty je to samotny skript, pre server-side-includes stranka, z ktorej sa skript vola) /cgi-bin/env.pl
SERVER_NAME meno a adresa (virtualneho) WWW servera server.example.com
HTTP_USER_AGENT identifikacia prehliadaca Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)