SaCzech Podprogram EncodeHTTP

Tento podprogram zaji¨Ÿuje polo‘en¡ p©¡slu¨n‚ho dotazu sv‚mu vlastn¡mu serveru a zmˆnu k¢du jeho odpovˆdi. Jedn  se o smˆs p–vodn¡ho k¢du, kter˜ mi poslal Vladim¡r Michl a mnou dodˆl van˜ch £prav. ve v˜sledku se ob‡as s m ¨patnˆ vyzn v m, tak‘e se nebude popisovat p©¡li¨ snadno...

Na za‡ tku se inicializuje ©ada r–zn˜ch promˆnn˜ch - ‡ stˆ‡nˆ na z kladˆ promˆnn˜ch prost©ed¡, ‡ ste‡nˆ na z kladˆ nejr–znˆj¨¡ch syst‚mov˜ch slu‘eb. Zaj¡mav  je p©edev¨¡m promˆnn  $request, ve kter‚ se vytv ©¡ URL dotazu, kter˜ bude polo‘en serveru. Je zkombinov n z obsahu promˆnn˜ch prost©ed¡ (dle CGI specifikace) PATH_INFO a QUERY_STRING. Pokud byla p©i instalaci zapnuta volna decodequery, p©ev d¡ se obsah druh‚ z nich nav¡c do z kladn¡ho k¢du serveru.

Pot‚ n sleduje otev©en¡ soketu, kter˜ bude pou‘it pro komunikaci s WWW serverem. To se odehraje v ‡ sti, za‡¡naj¡c¡ © dkem

$ok=socket(...);
Po jej¡m proveden¡ promˆnn  $ok signalizuje £spˆ¨nost ‡i ne£spˆ¨nost cel‚ operace. Pokud nedopadlo dob©e, skon‡¡ skript zpr vou "Chyba v komunikaci" (tuto ‡ st najdete a‘ na konci podprogramu).

Jestli‘e s otev¡r n¡m nebyly pot¡‘e, p©epne skript v¨echny soubory do bin rn¡ho re‘imu (t¡m se snad odstran¡ probl‚my s konverzemi, kter‚ Perl prov d¡ v neunixov˜ch opera‡n¡ch syst‚mech) a polo‘¡ dotaz. Za n¡m n sleduje p©ed v n¡ hlavi‡ek v cyklu, zah jen‚m

foreach $key ( keys %ENV )
Saczech se zde sna‘¡ do dotazu vlo‘it stejn‚ HTTP hlavi‡ky, jak‚ dostal od s m. Jestli‘e by SaCzech vyvol n HTTP metodou POST, n sleduje p©ed n¡ informac¡ o tˆle dotazu a vlastn¡ho tˆla. To je opˆt p©ek¢dov no do z kladn¡ho k¢du serveru (pokud byla p©i instalaci zapnuta volba decodequery).

T¡m je dotaz zad n a SaCzech za‡ne zpracov vat odpovˆƒ. Jej¡ zpracov n¡ je rozlo‘eno do dvou cykl– se shodnou podm¡nkou

while ( < FS > )
V prvn¡m se vyhodnocuj¡ hlavi‡ky odpovˆdi a hled  se v nich Content-Type. Obsah p©¡slu¨n‚ hlavi‡ky je pak porovn n s obsahem pole %mime a pokud je v nˆm p©¡slu¨n˜ typ obsa‘en, nastav¡ se promˆnn  $convert na hodnotu 1 - obsah odpovˆdi m  b˜t p©ek¢dov n. Tato ‡innost se prov d¡ jen v tom p©¡padˆ, pokud server odpov¡d  protokolem HTTP verze alespo¤ 1.0. Odpovˆdi star¨¡ch server– nebudou p©ek¢dov ny. Zji¨tˆn¡ verze protokolu, ve kter‚m server odpov¡d , zaji¨Ÿuje test
if ( m!^HTTP/\d\.\d\s+\d+\s+! )
M te-li server s protokolem HTTP verze 0.9 a chcete, aby jeho odpovˆdi byly k¢dov ny, vlo‘te do else-vˆtve tohoto p©¡kazu (je vyzna‡ena koment ©em HTTP/0.9)
$convert=1;
Ov¨em v tom p©¡padˆ budou k¢dov ny v¨echny odpovˆdi, proch zej¡c¡ procedurou EncodeHTTP bez ohledu na jejich typ!

Hlavn¡ ‡ st skriptu je uzav©ena do podm¡nˆn‚ho p©¡kazu

if ( $convert )
Jeho else-vˆtev nedˆl  nic. Pouze op¡¨e sv–j vstup do v˜stupu. Pokud se m  k¢dovat, vol  se nav¡c podprogram EncodeLine.


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

Pavel Satrapa
29. kvˆtna 1996