SaCzech Podprogram EncodeFile

Po‡ te‡n¡ test
if ( -d $ENV{"PATH_TRANSLATED"} )
provˆ©uje, zda cesta, zadan  v dotazu, ukazuje na adres ©. Pokud ano, p©ipoj¡ se na jej¡ konec jm‚no souboru, kter˜ m  b˜t u‘ivateli p©edlo‘en v takov‚m p©¡padˆ (typicky index.html). V˜sledkem je naplnˆn¡ promˆnn‚ $pagefile jm‚nem souboru, kter˜ m  b˜t p©ek¢dov n a odesl n u‘ivateli.

Do promˆnn‚ $ext se vz pˆt¡ ulo‘¡ p©¡pona doty‡n‚ho souboru.

K¢dovat ‡i nek¢dovat

Fundament ln¡m rozhodnut¡m v ‘ivotˆ podprogramu je, zda soubor pat©¡ do jeho kompetence. O to se star  test
if ( $mime{$ext} )
Asociativn¡ pole %mime obsahuje typy (hodnoty HTTP hlavi‡ky Content-Type), p©i©azen‚ p©¡pon m, kter‚ maj¡ b˜t k¢dov ny. Implicitnˆ se SaCzech star  jen o soubory s p©¡ponami html, htm (typ text/html) a txt (typ text/plain). Chcete-li zmˆnit sortiment zpracov van˜ch p©¡pon, mus¡te zas hnout do souboru script.tpl, kter˜ je sou‡ st¡ distribuce, a znovu instalovat SaCzech.

M -li p©¡pona souboru v poli %mime p©i©azen typ, bude programem zpracov na. V opa‡n‚m p©¡padˆ dojde k proveden¡ z vˆre‡n˜ch © dk– podprogramu. Ty po¨lou jako odpovˆƒ klientovi p©esmˆrov n¡ (s vyu‘it¡m n vratov‚ho k¢du 301 "Trvale p©esunuto" a HTTP hlavi‡ky Location) p©¡mo na soubor - SaCzech vynech  z URL s m sebe. Klient se po t‚to odpovˆdi obr t¡ znovu na WWW server s nov˜m URL souboru, kter‚ ji‘ neobsahuje vol n¡ k¢duj¡c¡ho programu. To samoz©ejmˆ znamen  jist‚ zpo‘dˆn¡. Sekvence dotaz-p©esmˆrov n¡-dotaz-odpovˆƒ je jistˆ pomalej¨¡ ne‘ dotaz-odpovˆƒ. Ov¨em zpo‘dˆn¡, zp–soben‚ p©esmˆrov n¡m a nov˜m dotazem, je zpravidla zanedbateln‚ ve srovn n¡ s p©epravn¡ dobou dokumentu.

Alternativn¡m ©e¨en¡m by bylo, aby program klientovi rovnou odpovˆdˆl a poslal mu soubor v p–vodn¡m znˆn¡ beze zmˆny k¢dov n¡. Tento p©¡stup m  dva velmi z va‘n‚ nedostatky.

  1. Klient mus¡ v hlavi‡k ch odpovˆdi zaslat typ dat (Content-Type). K tomu, aby mohl zas¡lat spr vn‚ typy pro v¨echny mo‘n‚ soubory, musel by b˜t konfigurov n pro v¨echny mo‘n‚ i nemo‘n‚ p©¡pony - stejnˆ jako je WWW server. Zmˆna ve struktu©e p©¡pon by znamenala zmˆnu konfigurace WWW serveru i SaCzechu. To je pracn‚ a hroz¡ nekonzistence.
  2. Odes¡lan˜ soubor by byl "novˆ vytvo©en" - jednalo by se o v˜stup z CGI skriptu. T¡m be se efektivnˆ zlikvidoval £‡inek vyrovn vac¡ch pamˆt¡.
Z tˆchto dvou d–vod– pova‘uji p©esmˆrov n¡ za v˜hodnˆj¨¡ ©e¨en¡.

Kdy‘ se k¢duje

Jestli‘e podprogram zjist¡, ‘e se k¢dov n¡ nevyhne, otev©e soubor a zavol  podporgram MakeHeaders, kter˜ vytvo©¡ hlavi‡ky odpovˆdi. Pot‚ se m–‘e pustit do pr ce. Cel˜ proces k¢dov n¡ prob¡h  po © dc¡ch. Zpracov n¡ jednoho © dku je obsa‘eno v tˆle cyklu
while ( <HTML> )
Ka‘d˜ © dek je nejprve p©ek¢dov n vol n¡m podprogramu EncodeLine a pot‚ odesl n na v˜stup.

SaCzech pamatuje i na p©¡padn˜ ne£spˆch p©i otev¡r n¡ souboru. V takov‚m p©¡padˆ po¨le klientovi jako odpovˆƒ n vratov˜ k¢d 404 "Nena¨el jsem" a skon‡¡ svou ‡innost.

EncodeLine

Tento podprogram je srdcem cel‚ho SaCzechu. V nˆm je realizov no p©ek¢dov n¡ jednoho © dku dokumentu.

Nejprve se pod¡vejte na jeho z vˆr. Nebude to zrovna pˆkn˜ pohled. Najdete zde slo‘it˜ podm¡nˆn˜ p©¡kaz (v manu lu Perlu se slibuje, ‘e je zpracov n inteligentnˆ a sk ‡e se rovnou na p©¡slu¨nou variantu), kter˜ podle v˜choz¡ho k¢du str nky (ulo‘en v promˆnn‚ $source) zvol¡ ten prav˜ p©¡kaz tr, kter˜ zajist¡ p©ek¢dov n¡ © dku.

VraŸme se teƒ zpˆt na za‡ tek tˆla podporgramu EncodeLine. Jestli‘e se na © dku vyskytuje slovo CHARSET, provede se tˆlo podm¡nˆn‚ho p©¡kazu. V nˆm se zaji¨Ÿuj¡ dvˆ operace. ž dek

s/__CHARSET__/ASCII/g;
zajist¡ nahrazen¡ ©etˆzce __CHARSET__ jm‚nem k¢du, do kter‚ho se dokument p©ekl p¡.

N sleduje komplikovanˆj¨¡ pas ‘, kter  umo‘¤uje nastaven¡ v˜choz¡ho k¢du. Program j¡ proch z¡ jen v p©¡padˆ, ‘e © dek obsahuje ©etˆzece MYCHARSET. Pak se do promˆnn‚ $newsource vyextrahuje jm‚no k¢du, uveden‚ v koment ©i. Jestli‘e je jm‚nem jednoho z podporovan˜ch k¢d–, p©epne se promˆnn  $source na tuto hodnotu. Podle n¡ pak z vˆre‡n  pas ‘ cyklu, o kter‚ jsem ji‘ mluvil, vybere spr vnou v˜choz¡ tabulku.

V n sleduj¡c¡m podm¡nˆn‚m p©¡kazu se zkoum , zda © dek obsahuje koment © se slovem BAR - tedy zda u‘ivatel po‘aduje automatick‚ generov n¡ nab¡dky k¢d–. Pokud je nalezen, vol  se podprogram MakeBar s parametrem "en" pro anglickou nab¡dku (vyvol no koment ©em <--BAR E-->) nebo "cz", m -li b˜t nab¡dka v ‡e¨tinˆ (koment © bez "E").

Samotn˜ podprogram MakeBar nen¡ nic, na ‡em byste si mohli zl mat mozek. Jedn  se o celkem prostou posloupnost v˜stup–, kter  vytvo©¡ skupinku odkaz– na aktu ln¡ dokument, vedouc¡ch p©es r–zn‚ k¢dovac¡ skripty SaCzechu.

MakeHeaders

Tˆlo tohoto podprogramu je velmi variabiln¡ a z vis¡ na nastaven¡ konfigura‡n¡ch voleb timeservices a ifmodifiedsince. Pokud vypnete prvn¡ z nich, bude tˆlo degradov no na prost˜ p©¡kaz
print "Content-Type: $mime{$ext}\n";
Kter˜ na z kladˆ p©¡pony souboru vytvo©¡ hlavi‡ku Content-Type s odpov¡daj¡c¡m typem.

Jestli‘e p©i instalaci byla zapnuta volba timeservices, je tˆlo podprogramu mnohem ko¨atˆj¨¡. Na jeho za‡ tku se objev¡ ©ada lok ln¡ch promˆnn˜ch (local ...), kter‚ se napln¡ vol n¡m funkc¡ stat a localtime.

N sleduje (pokud jste to nezak zali volbou ifmodifiedsince) podm¡nˆn˜ p©¡kaz, obsluhuj¡c¡ podm¡nˆn‚ odesl n¡ souboru. Jestli‘e dotaz obsahoval HTTP hlavi‡ku If-Modified-Since a soubor nen¡ novˆj¨¡, odpov¡ skipt stavov˜m k¢dem 304 Not Modified a ukon‡¡ svou ‡innost. V opa‡n‚m p©¡padˆ pokra‡uje norm lnˆ d l. Vol n¡ podprogramu ConvertTime, kter‚ je sou‡ st¡ p©¡kazu, zaji¨Ÿuje p©evod ‡asov‚ho £daje (rozezn v  v¨echny t©i tvary, povolen‚ podle RFC 1866) na vnit©n¡ tvar, pou‘¡van˜ SaCzechem.

Po hlavi‡ce Content-Type pak skript vytvo©¡ je¨tˆ Content-Length a Last-Modified podle £daj–, kter‚ z¡skal na za‡ tku podprogramu p©i vol n¡ stat.


Tato str nka je sou‡ st¡ on-line dokumentace programu SaCzech.

Pavel Satrapa
29. kvˆtna 1996