Letní škola informačních technologií, Studnice 96
Brzy se ukázalo, že natolik jednoduchý protokol nestačí. Klient nebyl schopen rozeznat atributy zaslaného dokumentu jinak, než z přípony jména dokumentu. Původně to nevadilo, protože byl omezen počet zpřístupněných dokumentů a vesměs se jednalo o textové nebo hypertextové dokumenty. Dalším problémem byla neznalost velikosti dokumentu, klient musel číst data, která mu posílal server, tak dlouho, dokud server neukončil spojení. Uživatel při přenosu nevěděl, jak velký bude přenášený dokument a nemohl se podle toho zařídit. Rovněž neexistoval způsob, jak zjistit čas poslední modifikace dokumentu a klient proto musel přenášet každý dokument vždy znovu. První vylepšená verze protokolu vznikla doplněním základních hlaviček do požadavku klienta i odpovědi serveru. Základní sada hlaviček popisuje typ a atributy dokumentu a vychází ze standardu MIME (Multipurpose Internet Mail Extensions, RFC1521). Ostatní hlavičky slouží pro přenos pomocných informací a předávání parametrů mezi klientem a serverem.
V této podobě je protokol http používán dodnes. V květnu 1996 byla publikována definice protokolu http verze 1.0 ve formě dokumentu RFC 1945. Tato definice obsahuje jako podmnožinu původní jednoduchý protokol s označením 0.9. Pro urychlení schválení definice protokolu verze 1.0 byly vypuštěny od druhého návrhu mnohé nové rysy protokolu a byly přesunuty do návrhu protokolu http verze 1.1 (viz http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v11-spec-07.txt).
Nový protokol je rozšířením protokolu http verze 1.0, každý klient a server zvládající protokol verze 0.9, 1.0 i 1.1 musí být schopen komunikovat všemi nižšími verzemi protokolu. Protokol je rozšířen o požadavky uložení dat na server (PUT), modifikace dokumentu (PATCH), kopie, přesun a zrušení dokumentu (COPY, MOVE a DELETE), vytvoření vazby (LINK) a zrušení vazby (UNLINK). Poslední dva požadavky by společně s vhodným zpracováním mohly vyřešit principiální nedostatek systému WWW, údržbu konzistence odkazů. Server by mohl při vložení dokumentů zaregistrovat všechny odkazy z dokumentu a při případných přesunech a rušení varovat uživatele.
GET http://www.some.net http/1.1 Connection: keep-alivePokud server akceptuje požadavek na udržení spojení, zašle odpověď, do které doplní hlavičku Keep-Alive:
HTTP/1.1 200 OK Keep-Alive: timeout=30, max=10Pokud klient přijme odpověď serveru s touto hlavičkou, může zaslat další požadavek. Hodnota timeout oznamuje klientovi, jak dlouho bude spojení udržováno, pokud nezašle další požadavek. Hodnota max je maximální počet požadavků, kolik může v rámci udržovaného spojení klient zaslat. Požadavek na udržení spojení musí být opakován při každém dalším požadavku. Pokud některý požadavek hlavičku Connection neobsahuje, server uzavře po odeslání odpovědi spojení.
HTTP/1.1 200 OK<CR><LF> Transfer-Encoding: chunked<CR><LF> <CR><LF> 1A4C<CR><LF> text ... <CR><LF> 2F8<CR><LF> text ... <CR><LF> 0<CR><LF> Content-Type: text/html; charset=ISO-8859-2<CR><LF> <CR><LF>Pokud je na začátku uvedena hlavička Transfer-Encoding s hodnotou chunked, pak je dokument složen ze samostatných částí. Každá část začíná hexadecimálně zapsanou délkou části. Za koncem části musí být prázdný řádek a buď další část nebo prázdná poslední část s délkou 0, za kterou mohou být dodatečné hlavičky.
Accept: text/html, text/plain;q=0.2, audio/*;q=0.2;mxb=100000 Accept-Charset: ISO-8859-2, unicode-1-1-utf-8 Accept-Language: cz, sk, en;q=0.9, de;q=0.5Na těchto hlavičkách je trochu nezvyklé to, že oddělovačem preferencí je čárka, zatímco středník je oddělovač parametrů v rámci jedné preference. Nejsložitější je způsob zadávání preference formátu a kvality dokumentu. Specifikace každého preferovaného formátu dokumentu může obsahovat parametr q, určující relativní váhu (kvalitu). Pokud není uvedeno, je uvažována váha 1. Pokud je k dispozici dokument ve více formátech, je vybrán ten, který má nejvyšší preferovanou kvalitu (váhu). Dalším parametrem může být maximální přijatelná velikost (mxb). Pokud dokument ve zvoleném formátu přesáhne limit velikosti, zvolí se následující vyhovující formát. Priorita preferencí se stejnými vahami postupuje zleva doprava. Pokud server nemá k dispozici dokument v jednom z preferovaných kódů, či jazyků, předá dokument v implicitním kódu a jazyku. Pokud je k dispozici více mutací požadovaného dokumentu, obsahuje navíc odpověď serveru hlavičku URI, která obsahuje parametr vary:
Content-Type: text/html; charset=ISO-8859-2 Content-Language: cz Content-Length: 1241 URI: <http://www.some.net/Welcome.html>; vary="charset, language"
GET /doc/VeryLongDocument.html http/1.1 Range: 1000-8000,50000-Požadovaná část je určena intervalem od počáteční po poslední požadovanou slabiku dokumentu. Pokud není uvedena horní mez, je přenesen dokument až do konce. Pokud není uvedena dolní mez, je přenesen zadaný počet slabik od konce dokumentu. V jedné hlavičce může být uvedeno více intervalů, oddělených čárkami. Pokud klient požaduje několik částí, zašle je server ve tvaru zprávy o více částech ve formátu MIME. Každá část navíc obsahuje hlavičku Content-Range, která identifikuje obsažený interval.
Content-Type: multipart/x-byteranges; boundary=MARK --MARK Content-Type: text/html Content-Range: 1000-8000/327482 ... --MARK Content-Type: text/html Content-Range: 50000-327482/327482 ... --MARK
Tabulky | RFC 1942 |
Vkládání souborů pomocí formulářů | RFC 1867 |
Internacionalizace HTML | draft-ietf-html-i18n-04.txt |
Zápis citlivých obrázků u klienta | RFC1980 |
Speciální typy odkazů | draft-ietf-html-relrev-00.txt |
Označování dialektů jazyka HTML | http://www.w3.org/pub/WWW/TR/WD-doctypes |
Použití stylů | draft-ietf-html-style-01.txt |
Styly CSS | http://www.w3.org/pub/WWW/TR/WD-css1 |
Definice rámců ve stylech | http://www.w3.org/pub/WWW/TR/WD-layout |
Vkládání objektů | http://www.w3.org/pub/WWW/TR/WD-object.html |
Aktuální informace o stavu návrhu jsou dostupné z dokumentů pracovní skupiny HTML IETF na adrese http://www.ics.uci.edu/pub/ietf/html/. Původní specifikaci jazyka HTML verze 3.0 lze nalézt na adrese http://www.fee.vutbr.cz/pub/WWW/documents/draft-ietf-html-specv3-00.txt.old. Následující popis vychází z informací dostupných koncem června 1996. Je třeba zdůraznit, že vývoj běží stále dále a mezi dobou napsání článku a vyjitím se může ledacos změnit.
<BODY BGCOLOR="blue"> Toto je text dokumentu na modrém pozadí
<H1 align="center">Toto je centrovaný nadpis</H1> <P align="center">Toto je centrovaný text</P>Pro centrování textu je dále doplněna samostatná značka <CENTER>, kterou lze použít pro zkrácení zápisu místo značky <P> s atributem ALIGN=CENTER.
<P align="center">text nad obrázkem<BR> text zleva<IMG SRC="image.gif" align="middle">text zprava <BR clear="all"> text pod obrázkem
text nad obrázkem
text zlevatext zprava
text pod obrázkem
Při toku textu kolem obrázku nastává problém, jak zahájit další text, který nemá být zalomen kolem obrázku a má začít až pod obrázkem. V návrhu je doplněn atribut CLEAR, který může být použit u značek nadpisů, odstavců, zalomení, oddělovacích čar, seznamů a bloků textu. Hodnotou může být LEFT, RIGHT, ALL nebo číselně vertikální mezera. Hodnota LEFT posune následující text až na místo, kde je levý okraj normální, čistý (clear). Podobně RIGHT posune text na místo, kde je normální pravý okraj, a hodnota ALL na místo, kde jsou oba okraje normální. Prohlížeče tento atribut zatím nezvládají, nebo jej interpretují jen u některých značek (například Netscape jen u <BR>).
<A HREF="http://www/htbin/map"><IMG USEMAP="#map"> ISMAP HREF="image.gif"></A>Pokud je použit atribut USEMAP a prohlížeč mu rozumí, pak má přednost před hypertextovým odkazem <A>. Prohlížeče, které neumí zpracovávat odkazy v citlivých obrázcích na straně klienta, tento atribut ignorují a zpracují citlivý obrázek původní metodou.
Každému použitému odkazu musí odpovídat definice citlivých ploch značkou <MAP>. Jméno definice uvedené v atributu USEMAP musí odpovídat jménu uvedenému v atributu NAME značky <MAP>:
<MAP NAME="map"> <AREA SHAPE="rect" COORDS="20,200,200,400" HREF="news.html"> <AREA SHAPE="circle" COORDS="100,100,40" HREF="index.html"> <AREA SHAPE="POLY" COORDS="20,20,30,40,10,40" HREF="what.html"> </MAP>Citlivé plochy jsou popsány značkami <AREA>. Formát zadávání citlivých ploch odpovídá zadávání ploch pro program imagemap na straně serveru. Plocha může být obdélníková (rect), kruhová (circle) nebo obecný mnohoúhelník (poly). Obdélník je popsán souřadnicí levého horního rohu, šířkou a výškou. Kruhová plocha je popsána souřadnicí středu a poloměrem. Mnohoúhelník je popsán souřadnicemi jednotlivých vrcholů. Definice citlivých obrázků na straně klienta je podporována v běžných prohlížečích (Netscape 2.0, Microsoft Internet Explorer 2.0).
Značka | Zobrazení | Význam |
<CITE>Systém WWW</CITE> | Systém WWW | citace |
<CODE>x = a + i*b</CODE> | x = a + i*b |
kód programu |
<DFN>termín</DFN> | termín | definice termínu |
<EM>nelze</EM> | nelze | zdůraznění |
<KBD>rm abc</KBD> | rm abc | vstup uživatele |
<SAMP>XmNwidth</SAMP> | XmNwidth | výpis, konstanta |
<STRONG>nikdy</STRONG> | nikdy | silné zdůraznění |
<VAR>filename</VAR> | filename | proměnná |
Typografické značky
Značka | Zobrazení |
<B>tučně</B> | tučně |
<BIG>velkým</BIG> | velkým |
<I>kurzíva</I> | kurzíva> |
<SMALL>malým</SMALL> | malým |
<S>přeškrknutě</S> | |
<SUB>dolní index</SUB> | dolní index |
<SUP>horní index</SUP> | horní index |
<TT>neproporcionálně</TT> | neproporcionálně |
<U>podtrženě</U> | podtrženě |
<HEAD> <TITLE>Dokument s vloženým stylem</TITLE> <STYLE TYPE="text/css"> ... definice stylu ... </STYLE> </HEAD>Definice stylu je vložena do hlavičky dokumenty značkou <STYLE>. Typ použitého stylu je určen atributem TYPE. Jméno typu má formálně tvar registrovaného typu média dle RFC1590. Definice stylů nemusí být zapsána v hlavičce dokumentu, styl může být celé asociován značkou <LINK>:
<HEAD> <TITLE>Dokument s připojeným stylem</TITLE> <LINK REL="StyleSheet" HREF="style.css" TYPE="text/css"> </HEAD>Atribut REL musí mít hodnotu STYLESHEET, která identifikuje, že odkaz definuje styl dokumentu. Definice stylů mohou být také uvedeny přímo u jednotlivých značek v textu. Většina značek má doplněn atribut STYLE, který může obsahovat definici stylu značky:
<P STYLE="...definice stylu...">Hlavička musí v tomto případě obsahovat alespoň počáteční značku <STYLE> s uvedením použitého typu definic stylů. Definice stylů nemusí modifikovat zobrazení pouze standardních prvků dokumentu. Pomocí nového atributu CLASS je možné zavádět vlastní třídy standardních prvků dokumentu. Hodnotou atributu může být libovolné jméno odkazující se na definici stylu:
<P CLASS=italic>text kurzívouOdkazovaná třída musí být samozřejmě definovaná v použité definici stylu. Navíc je zavedena nová značka <DIV> vymezující blok textu, který nemá žádný speciální význam, a může být použit pro definici nových typů bloků textu. Podobně je doplněna párová značka <SPAN>, která je určena pro typografickou kontrolu vymezené části textu, podobně jako například značka <B>.
Přesný formát zápisu definice stylu je zatím ve vývoji. Zatím existují dva návrhy. Definice stylů Cascading Style Sheets (CSS) je navrhována organizací WWW Consortium. Firma Novell navrhuje mocnější nástroj pro definici stylů - Document Style Semantics and Specification Language (DSSSL). Rozdíl mezi těmito návrhy je dosti podstatný. Návrh CSS dovoluje jen nastavovat existující atributy zobrazení pro jednotlivé strukturální prvky dokumentu. Návrh DSSSL zavádí metajazyk pro popis sémantiky a zobrazení dokumentu v systému SGML. Je vlastně doplňkem systému SGML a proto je také předložen jako návrh normy ISO/IEC (10179). Použitý metajazyk je funkcionálním programovacím jazykem podobným jazyku LISP. Z hlediska implementace je podstatně jednodušší návrh CSS. Poslední pracovní návrh specifikace stylů CSS získal podporu řady firem, mezi jinými také firem Netscape, Spyglass a Microsoft. Návrh specifikace stylů CSS je poměrně rozsáhlý. V následujících příkladech jsou proto pouze naznačeny možnosti definic stylů:
<HEAD> <TITLE>Dokument s vloženým stylem</TITLE> <STYLE TYPE="text/css"> @import url(http://www.some.net/style.css); H1,H2 { color: green; font-size: 24pt; align: center } P { indent: 30em; align: center } P.italic { font-style: italic } BODY { background: dark-green } </STYLE> </HEAD>První řádek definice začínající znakem @ vkládá definici stylu z jiného zdroje, například definici firemního stylu dokumentů. Jedná se o obdobu příkazu include. Vlastní definice stylu se skládá z posloupnosti definic atributů pro jednotlivé prvky struktury dokumentu (H1, H2, atd.). Jméno prvku může být doplněno identifikátorem třídy a tím je pak odvozen nový strukturální prvek dokumentu s odlišnými vlastnostmi (např. P.italic). Definice atributů ve složených závorkách se skládá ze sekvence jmen a hodnot atributů. Oddělovačem je středník. Nastavení atributů se dědí podle zanoření značek. Například definici fontu pro dokument (značka <BODY>) dědí všechny prvky dokumentu, které nemají explicitně uvedenu definici fontu. Definice atributů může být dokonce kontextově závislá. Následující definice nastavuje barvu pro text položky seznamu zanořeného do jiného seznamu:
UL UL LI { color: red }Definice stylu ve značce má formálně stejný tvar jako v hlavičce:
<BODY STYLE="background: yellow" <P STYLE="color: green">text zeleně
Princip zápisu matematických výrazů byl v návrhu jazyka HTML verze 3 převzat z větší části z programu LaTeX. Některé odlišnosti jsou dány syntaxí zápisu v systému SGML, kterému musí být jazyk HTML podřízen. Dále byly v některých případech zvoleny jiné jména symbolů, protože jsou preferovány názvy z norem ISO. Příklad zápisu výrazu:
<MATH>∫<SUB>a</SUB><SUP>b</SUP><BOX>f(x)<over>x+1</BOX> dx</MATH>Místo značek <SUB>, <SUP> a <BOX> lze použít zkratky podtržení (_), šipku (^) a složené závorky ({). Zápis matematických výrazů je jednou z částí nové specifikace jazyka, která je zatím nejméně podporována.
Zobrazení dokumentů v dělených oknech musí být nejprve zahájeno počátečním dokumentem, který rozdělí okno prohlížeče na více částí. Počáteční dokument neobsahuje na rozdíl od normálních dokumentů tělo vymezené značkou <BODY>, ale pouze skupiny rámů, vymezené značkami <FRAMESET>:
<HEAD> <TITLE>Dokument s dělením okna</TITLE> </HEAD> <FRAMESET COLS="20%,80%"> <FRAME SRC="content.html" NAME="content"> <FRAME SRC="page1.html" NAME="main"> </FRAMESET>Tento dokument rozdělí okno prohlížeče na dvě okna vedle sebe, v levém zobrazí dokument "content.html" a v pravém "page1.html". Vlastní dokumenty, které jsou zobrazeny v jednotlivých oknech, mají formálně normální tvar. Skupiny rámů (FRAMESET) jsou rozděleny horizontálně (atribut COLS) nebo vertikálně (atribut ROWS) na více rámů (FRAME). Velikost jednotlivých rámů je zadána relativními nebo absolutními velikostmi. Obsah rámů je dán hypertextovým odkazem ve značce <FRAME>. Takovýto dokument by prohlížeč, který nerozumí značce <FRAMESET>, zobrazil prázdný. Proto je doplněna ještě značka <NOFRAMES>, která může doplnit alternativní zobrazení pro tyto prohlížeče. Přitom je využito společné vlastnosti všech prohlížečů, že značky, kterým nerozumí, ignorují, ale text mezi nimi zobrazí. Naopak prohlížeč, který umí zpracovat značku <FRAMESET>, blok vymezený značkou <NOFRAMES> ignoruje:
<FRAMESET COLS="20%,80%"> <NOFRAMES> <H1>Dokument abc</H1> <A HREF SRC="content.html">Obsah</A><p> <A HREF SRC="page1.html">Část 1</A><p> ... <BQ>Tento dokument obsahuje rámce, prohlížeč bez podpory rámců jej zobrazí v náhradním vzhledu </NOFRAMES> <FRAME SRC="content.html" NAME="content"> <FRAME SRC="page1.html" NAME="main"> </FRAMESET>Problémem stávající implementace je nutnost doplnění odkazů o jména oken, do kterých má být odkazovaný dokument zobrazen. Například v uvedeném příkladu je třeba doplnit do všech odkazů v dokumentu "content.html" atribut TARGET se jménem okna z atributu <FRAME>. Dokumenty se tak stávají závislé na počátečním dokumentu, který vytvoří a pojmenuje daná okna:
<H1>Obsah</H1> <A HREF SRC="page1.html" TARGET="main">Část 1</A><p> <A HREF SRC="page2.html" TARGET="main">Část 2</A><p>Pokud by tyto atributy scházely, pak by se dokument "page1.html" zobrazil také v levém okně a tím by přepsal zobrazený obsah. Variantou oproti doplňování atributu do všech odkazů je uvést jej ve značce <BASE>.
Pro úplnost dodejme, že podobný způsob zobrazení je zahrnut také do návrhu stylů jazyka HTML verze 3. Rozložení oken je definováno v definici stylu dokumentu příkazy @PAGE a @FRAME. Pro umístění textu do okna je použit atribut FLOW a pro definici okna, ve kterém bude zobrazen odkazovaný dokument, atribut TARGET:
<HEAD> <TITLE>Dokument s vloženým stylem s definicí rámců</TITLE> <STYLE TYPE="text/css"> @page { layout: column } @frame { content: 20% } @frame { main: 80% } h1.toc { flow: content; target: main } a.toc { flow: content; target: main } </STYLE> </HEAD> <H1 CLASS=toc>Obsah</H1> <A CLASS=toc HREF SRC="page1.html">Část 1</A><p> <A CLASS=toc HREF SRC="page2.html">Část 2</A><p>