C-SaCzech Procedura EncodeFile

Do prom�nn� pagefile si zkop�ruje obsah prom�nn� PATH_TRANSLATED, kter� by m�la obsahovat cestu, kter� vede k dokumentu zadan�mu jako parametr. Zda se jedn� od adres�� zji��uje podm�nka
if ( isdir(pagefile) )
kde isdir je funkce definovan� v <www.h>. Pokud je to tedy adres��, p�ipoj� se na konec pagefile 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.

Ukazatel b je nastaven tak, aby ukazoval na za��tek p��pony p�ekl�dan�ho souboru (resp. na znak za posledn� te�kou v n�zvu souboru).

K�dovat �i nek�dovat

Fundament�ln�m rozhodnut�m v �ivot� procedury je, zda soubor pat�� do jeho kompetence. O to se star� test
if ( ISEXT(b) )
Pole ext obsahuje typy (hodnoty HTTP hlavi�ky Content-Type), p�i�azen� p��pon�m, kter� maj� b�t k�dov�ny. Implicitn� se C-SaCzech star� jen o soubory s p��ponami html, htm (typ text/html) txt (typ text/plain) a cz (typ text/html). Chcete-li zm�nit sortiment zpracov�van�ch p��pon, mus�te na za��tku souboru csaczechXX.c zm�nit pole ext a znovu instalovat C-SaCzech.

M�-li p��pona souboru v poli ext p�i�azen typ, bude programem zpracov�na. V opa�n�m p��pad� (a tak� tehdy, pokud soubor nem� p��ponu) po�le procedura jako odpov�� klientovi p�esm�rov�n� (s vyu�it�m HTTP hlavi�ky Location) p��mo na soubor - 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 C-SaCzech. 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�uval autor SaCzechu p�esm�rov�n� za v�hodn�j�� �e�en� a m� nezb�v� ne� souhlasit.

Kdy� se k�duje

Jestli�e procedura zjist�, �e se k�dov�n� nevyhne, otev�e soubor a zavol� 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(fgets(buff, 512, fd )!=NULL)
Nejprve se pod�vejte na jeho z�v�r, kde najdete vol�n� procedury EncodeLine. To je j�dro cel�ho C-SaCzechu, zaji��uj�c� vlastn� zm�nu k�du. Je to vlastn� alias, ve skute�nosti se vol�
cs_encode( XX, source, target )
kde source je zdrojov� a target c�lov� k�dov�n�. Procedura cs_encode je definov�na v souboru <cstools.h>. D�l� to, �e si vytvo�� he�ovac� tabulku pro p�evod z jednoho k�du do druh�ho a potom postupn� p�evede ka�d� znak ze vstupn�ho �et�zce.

Vra�me se te� zp�t na za��tek t�la zpracov�vaj�c�ho cyklu. 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

subs( buff, "__CHARSET__", TRUENAME(target) );
zajist� nahrazen� �et�zce __CHARSET__ jm�nem k�du, do kter�ho se dokument p�ev�d�.

N�sleduje pas�, kter� umo��uje nastaven� v�choz�ho k�du. Program j� proch�z� jen v p��pad�, �e ��dek obsahuje �et�zece MYCHARSET. V tom p��pad� se zavol� procedura newsource, kter� zajist� korektn� p�e�ten� a rozpozn�n� n�zvu k�du, do kter�ho se chce dokument p�epnout. Jestli�e se jedn� o n�kter� ze jmen podporovan�ch k�d�, p�enastav� se prom�nn� source, jinak se nastav� zp�tky na default hodnotu.

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��kazy
  for(i=0; i<4; i+=2)
    if ( !strcasecmp(extt, ext[i] ) ) break;
  printf( "Content-Type: %s\r\n", ext[i+1] );
  printf( "\r\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 pr�ce procedury mnohem n�ro�n�j��. Na jej�m za��tku se napln� centr�ln� struktura buff vol�n�m funkce stat a struktura tmi �asem modifikace po�adovan�ho souboru.

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� program stavov�m k�dem 304 Not Modified a ukon�� svou �innost. V opa�n�m p��pad� pokra�uje norm�ln� d�l. ��st programu v t�le podm�n�n�ho p��kazu za��naj�c�ho

if ( g == a || b[3] == *a || &b[3] == g )
zaji��uje p�evod �asov�ho �daje (m�l by rozezn�vat v�echny t�i tvary, povolen� podle RFC 1866, stejn� jako p�vodn� SaCzech ) na vnit�n� tvar, pou��van� C-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.


ZPET Zp�t

Tato str�nka je sou��st� dokumentace programu C-SaCzech.