next up previous contents index
Next: ``Vary features'' Up: Implementace Previous: Zpracování záznamu

Expirační model a revalidace

  Tento algoritmus má za úkol určit jestli je daný záznam čerstvý (FRESH) či starý (STALE), což závisí na informacích získaných z HTTP hlavičky analyzovaného záznamu a několika konfiguračních parametrech. Vyhodnocovací proces pracuje s následujícími hodnotami:

now
- aktuální čas3

o_date
- čas stažení příslušného záznamu z cílového serveru určený z položky Date hlavičky
o_lm
- datum poslední modifikace, které je obsahem položky Last-Modified hlavičky
o_age
- současné stáří dokumentu (now - o_date)
o_lmage
- stáří dokumentu v ve chvíli kdy byl stažen z cílového serveru (o_date-o_lm)
o_agefactor
= o_objage/o_lmage
o_maxage
explicitně stanovené stáří záznamu specifikované direktivou ``Cache-Control: max-age=<seconds>''
o_expires
explicitně stanovený čas expirace dokumentu specifikovaný položkou hlavičky ``Expires: <httpDate>''

Dále se pracuje s konfigurovatelnými parametry sg_entry_min_age, sg_entry_max_age a sg_entry_max_agefactor (přesná specifikace jejich významu je součástí uživatelské dokumentace) a samotné určení stavu záznamu probíhá následujícím algoritmem:

if (o_maxage)

     if (o_age > o_maxage)

         záznam je STARÝ, algoritmus končí

if (o_age <= sg_entry_min_age)

    záznam je ČERSTVÝ, algoritmus končí

if (o_expires) {

     if (o_expires <= now)

         záznam je STARÝ, algoritmus končí
     else

         záznam je ČERSTVÝ, algoritmus končí

}

if (o_age > sg_entry_max_age)

     záznam je STARÝ, algoritmus končí

if (o_agefactor < sg_entry_max_agefactor)

     záznam je ČERSTVÝ, algoritmus končí

záznam je STARÝ, algoritmus končí

Pokud algoritmus prohlásí, že je záznam starý, dochází k tzv. revalidaci záznamu, při které je cílový server kontaktován s tzv. revalidačním požadavkem, kdy je do hlavičky požadavku klienta přidána direktiva ``If-Modified-Since: <httpDate>'' (argument httpDate je zkopírován z položky Last-Modified vyexpirovaného záznamu, pokud není přítomna, pak je zkopírován z položky Date, která je povinná), poté je načtena a zpracována odpověď serveru, což vede k jedné ze tří následujících akcí:

1.
Pokud server odpověděl stavovým kódem ``304 Not Modified'', který značí, že se dokument nezměnil, pak v hlavičce následují položky, které je proxy server povinen substituovat do revalidovaného záznamu. K tomu slouží funkce

char *sg_mergeheaders(sg_header_t *src,

                      sg_header_t *subst,

                      char *tail);

s argumenty:

src
- ukazatel na hlavičku revalidovaného záznamu
subst
- ukazatel na hlavičku odpovědi serveru na revalidační požadavek
tail
- volitelný parametr, obsahující řetězec, který může být přidán za nově vzniklou hlavičku
Návratovou hodnotou funkce je ukazatel na buffer, ve kterém je požadovaný výsledek spojení hlaviček src a subst, kterým je bezprostředně přepsána hlavička revalidovaného záznamu a aktualizovaný dokument je odeslán klientovi.

2.
V případě, že server odpověděl cachovatelným stavovým kódem, což znamená, že došlo ke změně dokumentu, pak je existující (revalidovaný) záznam reinicializován (pomocí funkce sg_getentryfd(entry,TRUE)) a je do něj zapsána celá odpověď z cílového server, která je současně odesílán klientovi.
3.
Odpoví-li cílový server necachovatelným stavovým kódem, pak je revalidovaný záznam smazán a odpověď cílového serveru je odeslána klientovi.


next up previous contents index
Next: ``Vary features'' Up: Implementace Previous: Zpracování záznamu
Stanislav Pavlicek
2000-06-12