vit$oft freeware home page

HTTPER - dokumentace programu

English version

Účel programu HTTPER.EXE

HTTPER je utilita, která umí komunikovat jako klient nebo server při spojeních protokolem HTTP po sítích TCP/IP. Řízení z příkazového řádku ji dovoluje použít k automatizovanému stahování nebo kontrole webových stránek. Je využitelná také ke kontrole záhlaví odesílaného jinými webovými servery nebo klienty, včetně referrerů, cookies a podobných, ne vždy snadno zjistitelných informací.

Instalace

HTTPER je konzolová Win32 utilita, bude tedy pracovat na libovolném počítači s 32bitovým MS Windows a nainstalovaným protokolem TCP/IP. Instalace spočívá v jejím nahrání do některého adresáře uvedeného v systémové proměnné PATH.

HyperText Transfer Protocol

HTTP je aplikační protokol pro získávání provázaných (hypertextových) informací. Podrobně je specifikován např. v dokumentu
RFC2616. Při komunikaci podle tohoto protokolu musí klient (žadatel o informaci) nejprve znát adresu serveru (poskytovatele informace) a umístění požadovaného objektu na počítači serveru. Pak naváže TCP spojení se serverem a zašle mu svůj požadavek - Request na konkrétní objekt, kterým nejčastěji bývá HTML soubor, text, obrázek apod. Server v téže relaci požadovaný soubor vyhledá, zašle klientovi a zpravidla hned nato spojení ukončí. V normálním životě zajišťuje tyto činnosti internetový prohlížeč a uživatel jen vybírá myší ze seznamu svých oblíbených záložek nebo z hypertextových odkazů na WWW stránkách. Při použití řádkového klienta HTTPER je třeba požadavek na server (Request) připravit předem ve formě textového souboru. Odpověď serveru - Response pak nebude zobrazena v okně prohlížeče, ale uložena pod zvoleným názvem do souboru na disk.
Skutečný HTTP server analyzuje požadavek klienta a posílá odpovídající soubor. Server simulovaný programem HTTPER je primitivní, nikterak nezkoumá přenosovou metodu ani obsah požadavku. Pošle vždy předem specifikovaný soubor odpovědi a hned nato se ukončí.

Formát požadavku klienta - Request

HTTP Request sestává z hlavičky (Request Header) v některých případech následované dalšími zasílanými daty (Post File). Hlavička je tvořena jedním nebo více řádky textu a je ukončena jedním prázdným řádkem.
Formát řádků hlavičky je podrobně popsán ve specifikaci HTTP protokolu. Nejdůležitější je první řádek, který obsahuje tři slova oddělená mezerou:
Method   Request-URI   HTTP-Version
Method
Nejčastěji používané metody jsou GET a POST.
Request-URI
je specifikace cesty a názvu objektu na serveru v unixové notaci, tzn. jako oddělovač adresářů se používá lomítko "/". V případě zadání samotného lomítka většina serverů implicitně poskytuje soubor výchozí stránky kořenového adresáře s názvem /default.html, /INDEX.HTM apod.
HTTP-Version
Verze protokolu HTTP se v současné době nejčastěji specifikují jako HTTP/1.0 nebo HTTP/1.1.
Za prvním řádkem mohou následovat další řádky s upřesňujícími parametry ve formě dvojice Jméno-parametru: hodnota, např.
GET /pictures/blondie.jpg HTTP/1.0
If-Unmodified-Since: Sat, 22 Oct 2001 19:43:31 GMT
Poslední, prázdný řádek ukončuje hlavičku.

Formát odpovědi serveru - Response

HTTP Response je podobně jako HTTP Request tvořena textovou hlavičkou ukončenou prázdným řádkem, za kterou mohou následovat vyžádaná data.
První řádek hlavičky obsahuje výsledek posouzení požadavku serverem (Status) a opět je tvořen třemi slovy oddělenými mezerou:
HTTP-Version   Status-Code   Reason-Phrase
HTTP-Version
číslo verze dohodnuté se serverem
Status-Code
číselné vyjádření stavu
Reason-Phrase
odpovídající slovní vyjádření serveru k realizovatelnosti přijatého požadavku.
Další řádky hlavičky mohou upřesňovat vlastnosti požadovaného objektu, jeho velikost, stáří nebo MIME-typ, který říká klientovi, zda má objekt interpretovat jako HTML, prostý text, obrázek apod., např.
HTTP/1.0 200 OK
Content-Length: 23456
Content-Type: image/gif
Hlavička je již tradičně zakončena prázdným řádkem (CR+LF).

Ovládání utility HTTPER

je řízeno parametry příkazového řádku v této syntaxi:
HTTPER   /role   /Timeout=x   IP_addr:port   Request   Response
/role
V první řadě je třeba určit, zda má HTTPER vystupovat v roli klienta či serveru. K tomu slouží parametr /C neboli /Client, případně /S neboli /Server. Role klienta je výchozí, /C tedy není třeba uvádět.
/Timeout=
Tento nepovinný parametr umožňuje stanovit dobu v sekundách, po které se běh programu zruší, i když ještě nedošlo k ukončení komunikace. Např. pětiminutové čekání lze zadat jako /Timeout=300s, /T:300, -t300. Timeout=0 znamená neomezené čekání. Pokud parametr vynecháme, čeká se implicitně 2 minuty v roli klienta nebo 10 minut v roli serveru. I před vypršením této doby lze HTTPER kdykoli předčasně ukončit pomocí Ctrl-Break.
IP_addr
Povinným parametrem je IP adresa. HTTPER nepřevádí doménové adresy na číselné, je tedy nezbytné vždy zadat čtyři čísla 0-255 oddělená tečkou. Bezprostředně za IP adresou může následovat číslo TCP portu oddělené dvojtečkou. Při vynechání se použije defaultní HTTP port :80.
V případě klienta představuje zadaná IP adresa určení serveru, ke kterému se má připojit. V případě role serveru je to adresa rozhraní, na kterém má server odpovídat na HTTP požadavky, zpravidla se zde zadává univerzální adresa 0.0.0.0, která přikazuje odpovídat na požadavky všech klientů.
Request
V případě role klienta představuje Request název souboru obsahujícího předem připravenou žádost klienta.
Pokud HTTPER plní roli serveru, znamená Request název souboru, do něhož bude uložen přijatý požadavek klienta. Pokud soubor již existoval, bude přepsán.
Response
V případě klienta představuje Response název souboru, do něhož bude uložena odpověď přijatá od serveru.
Je-li HTTPER spuštěn jako server, měl by jako Response být uveden název existujícího souboru, jež pak bude odeslán klientovi.
Jak už bylo uvedeno výše, Request i Response jsou tvořeny hlavičkou a datovým obsahem. HTTPER umožňuje oddělenou manipulaci s těmito složkami, pokud budou místo názvu jednoho souboru zadány dva soubory oddělené znaménkem "+". Před i za znaménkem plus musí být aspoň jedna mezera, např.
HTTPER /C 200.100.50.25 Request.TXT ResponseHeader.TXT + Content.html
Odpověď od serveru bude rozdělena, hlavička se uloží do souboru ResponseHeader.TXT a datový obsah do Content.html.

Jména souborů mohou být uváděna včetně plné cesty, např. "D:\PATH\SOUBOR.TXT", v UNC tvaru, např. \\SERVER\SHARE\PATH\FILE.HTM, případně jako jméno zařízení, např. NULL, CON, LPT1.. Obsahuje-li název mezeru, musí být uzavřen v uvozovkách.

Pokud v roli klienta vynecháme specifikaci souboru Response, bude odpověď směrována na standardní systémový výstup, tzn. uvidíme ji na monitoru. V roli serveru bude odpověď vyžadována na systémovém vstupu, můžeme ji tedy zapsat přímo z klávesnice.

Nebude-li na příkazovém řádku uvedeno Request ani Response, jsou oba soubory směrovány na konzolu. V roli klienta pak zadáváme požadavek interaktivně z klávesnice a odpověď vidíme na displeji. V roli serveru nejprve uvidíme přijatý požadavek klienta na obrazovce a odpověď musíme zadat z klávesnice.
Na rozdíl od jiných řádkových klientů (TELNET) se požadavek odešle na server až po jeho zkompletování (Ctrl-Z). Ani při pomalém psaní tedy nehrozí, že protistrana "ztratí trpělivost" a již navázané TCP spojení předčasně zruší.

Na obrazovce se také mohou zobrazovat výzvy a hlášení utility HTTPER začínající znakem #. Tyto zprávy jsou směrovány na standardní chybový výstup, takže nedochází k jejich zamíchání do přijatých dat ani při přesměrování výstupu HTTPER operátorem ">".

Po ukončení běhu utility lze zjistit příčinu pomocí návratové hodnoty ERRORLEVEL:

0
Normální ukončení, přenos proběhl v pořádku.
4
Vzdálený partner odmítl komunikaci, např. protože neposlouchá na zadaném TCP portu.
8
Protistrana se nehlásí (neprůchodná síť, neexistující IP adresa ap.)
12
Utilita byla ukončena kvůli vypršení času stanoveného parametrem /Timeout.
16
Chyba při čtení nebo zápisu do souboru, např. přeplněný disk.
20
Některý ze zadaných vstupních souborů nebyl nalezen.
24
Chybný formát IP adresy nebo portu.
28
Chybný formát příkazu, vypsána nápověda.

Cvičení z HTTP protokolu

Chcete-li si osvojit vlastnosti protokolu HTTP a používání utility HTTPER, vyzkoušejte následující příklady.

Stažení webové stránky metodou GET

Jako server použijeme některý existující WWW server na intranetu nebo Internetu. Jeho IP adresu zjistíte z doménové adresy příkazem
PING doménová_adresa
Pokud na vašem počítači běží některý WWW server (Apache, Personal Web Server, MS IIS), můžete použít univerzální místní IP adresu 127.0.0.1 (localhost). Jako klienta použijeme HTTPER.EXE. Na výzvu # Enter Request zadejte požadavek GET:
HTTPER /Client 127.0.0.1
# Enter Request  (terminate with Ctrl-Z)
GET / HTTP/1.0

^Z
# Connecting to server... (abort with Ctrl-Break)
Nezapomeňte na prázdný řádek ukončující hlavičku. Psaní z klávesnice je třeba ukončit stiskem Ctrl-Z následovaným klávesou Enter. Následuje zpráva # Connecting to server... (abort with Ctrl-Break) a pokud se spojení zdaří, měl by se na vás vychrlit HTML kód výchozí stránky. Možná budete chtít pokus zopakovat s přesměrováním výstupu utility HTTPER do souboru nebo s pozastavováním výpisu pomocí MORE:
HTTPER /C 127.0.0.1 | MORE
Pokud je známo přesné umístění požadovaného objektu v rámci webu, lze jej zadat v prvním řádku hlavičky. Následující příklad stáhne obrázek a uloží jej na disk.
ECHO GET /pictures/blondie.jpg HTTP/1.0>"REQUEST.TXT"
ECHO:>>"REQUEST.TXT"
HTTPER /C 200.100.50.25 "REQUEST.TXT"  NULL + "BLONDIE.JPG"

# Connecting to server...  (abort with Ctrl-Break)

# Content received OK.
Hlavičku požadavku REQUEST.TXT jsme vytvořili dynamicky, dvěma příkazy ECHO. Odpověď ze vzdáleného serveru jsme nechali rozdělit, záhlaví odpovědi serveru jsme zahodili uvedením názvu NULL a vlastní data nechali uložit pod názvem BLONDIE.JPG. Pokud bychom místo NULL uvedli CON, zobrazila by se hlavička odpovědi na obrazovce.

Zaslání formuláře

Webové formuláře se mohou po vyplnění posílat na server metodou GET nebo POST. Údaje z políček formuláře jsou odesílány ve tvaru
název-pole=vyplněná-hodnota
a upraveny překódováním těch znaků, které nejsou přípustné v internetové adrese URI. Přípustné znaky jsou "A..Z", "a..z", "0..9", "$", -", "_", ".". Ostatní znaky by měly být zakódovány pomocí své hexadecimální ASCII hodnoty prefixované znakem "%", např. %3B místo středníku, %25 místo procenta ap. Mezeru lze zakódovat vedle %20 také jako znak "+". Dvojice pole=hodnota se oddělují znakem "&".
Při metodě GET je zakódovaný řetěz parametrů připojen otazníkem "?" ke specifikaci adresy objektu v prvním řádku hlavičky požadavku. Objektem bývá skript zpracovávající předané parametry, jeho adresu zjistíme ze zdrojového kódu stránky s HTML formulářem jako hodnotu ACTION=. Při ručním odesílání formuláře bychom tedy specifikovali požadavek např. takto:
GET /cgi-bin/script.cgi?Name=Joe+Smith&Email=smith@hotmail.com HTTP/1.0

Častěji je autory webových sídel preferována metoda POST, kdy je v hlavičce uvedena jen adresa zpracovávajícího skriptu a parametry jsou odesílány v těle požadavku:
POST /cgi-bin/script.cgi HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 38

Name=Joe+Smith&Email=smith@hotmail.com
Jelikož je při posílání formulářových parametrů metodou POST nutné zadávat typ a délku předávaných dat, bude asi pohodlnější výše uvedený text napsat v editoru jako textový soubor nazvaný např. "REQUEST.TXT" a pak jej zadat jako parametr:
HTTPER /C 200.100.50.25 "REQUEST.TXT"
# Connecting to server... (abort with Ctrl-Break)

Mnohé webové servery poskytují zajímavý obsah dynamicky, na základě zaslání formuláře. Naplánováním spouštění utility HTTPER si můžete zajistit pravidelný přísun těchto dat, aniž by bylo nutno někam klikat a shlížet přitom kvanta reklam.

Hrajeme si na server

V následujícím pokusu použijeme plnohodnotný internetový prohlížeč, např. MSIE nebo Netscape Navigator. Jako server spustíme v dosovém okně téhož počítače HTTPER v interaktivním režimu: HTTPER /S 0.0.0.0 Pokud by na počítači již nějaký jiný WWW server běžel, HTTPER by se ukončil s chybovým hlášením # Error binding socket. V tom případě bude nutné zvolit jiný TCP port, např.
HTTPER /S 0.0.0.0:12345. Do adresního řádku prohlížeče pak zadejte adresu http://127.0.0.1:12345/anything/you/like.
HTTPER v roli serveru by měl nyní ukončit čekání na klienta a zobrazí záhlaví požadavku. Můžete se podívat, co všechno o sobě váš prohlížeč vytrubuje do světa. Na výzvu miniserveru # Enter Response (terminate with Ctrl-Z) napište nějaký text, např. Hello World!. Po stisku Ctrl-Z a Enter by se tentýž text měl objevit v okně prohlížeče.

Po odeslání odpovědi náš server skončí. Tím se liší od skutečných WWW serverů, které musejí neustále vyřizovat velká množství požadavků. Pokud by měla být utilita HTTPER využívána v rámci nějakého bezobslužného přenosu informací, bude nutné ji umístit do dávkového souboru a jakmile se ukončí, zařídit potřebné úkony (inkrementace počitadla, příprava dalšího souboru apod.) a pak ji znovu nastartovat.

Předání souboru klientovi

V roli serveru zkusíme předat internetovému prohlížeči obrázek uložený v souboru "BLONDIE.JPG" o délce 23456 bajtů. K tomu bude třeba nejprve připravit hlavičku odpovědi (Response-header). Aby byl prohlížeč spokojen, musí ho odpověď serveru ujistit, že je vše OK. Tomu v protokolu HTTP odpovídá stavový kód 200. Dále je třeba v hlavičce upřesnit délku a typ předávaného objektu, aby prohlížeč věděl, že se jedná o obrázek a nesnažil se místo blondýny ukazovat mnohem ošklivější znakový kód obrázku. Připravme tedy nejprve hlavičku odpovědi RESPONSE.TXT a pak ji spolu s obrázkem předáme serveru HTTPER:
ECHO HTTP/1.0 200 OK>RESPONSE.TXT
ECHO Content-Type: image/jpeg>>RESPONSE.TXT
ECHO Content-Length: 23456>>RESPONSE.TXT
ECHO:>>RESPONSE.TXT
HTTPER /S 0.0.0.0:12345 CON  "RESPONSE.TXT" + "BLONDIE.JPG"
# Listening to client...  (abort with Ctrl-Break)
Když teď bude v prohlížeči zadána adresa http://127.0.0.1:12345, měl by HTTPER zareagovat zobrazením požadavku klienta a odesláním obsahu, který se objeví v prohlížeči. Pokud tyto pokusy děláte se dvěma počítači, je samozřejmě nutné místo lokální adresy 127.0.0.1 zadávat skutečnou IP adresu vzdáleného počítače.

HTTP upload

Otevřte dvě konzolová okna a v každém nastavte jiný adresář. Zkusíme mezi nimi přenést diskový soubor (např. BLONDIE.JPG o délce 23456) protokolem HTTP. Předpokládejme, že soubor leží v adresáři klientského okna, jinak bychom v následujícím příkladu museli zadávat jeho plnou cestu. V okně serveru nejprve spusťte následující příkazy:
ECHO HTTP/1.0 200 OK>RESPONSE.TXT
ECHO:>>RESPONSE.TXT
HTTPER /S 0.0.0.0:12345 CON + RECEIVED.JPG RESPONSE.TXT
# Listening to client...  (abort with Ctrl-Break)
To znamená, že přijatý požadavek klienta bude rozdělen, hlavička se zobrazí na konzole a obsah (vlastní obrázek) se uloží pod názvem RECEIVED.JPG. Odpověď serveru bude odeslána z předem připraveného souboru RESPONSE.TXT.
V okně klienta zadáme odeslání požadavku a souboru metodou POST:
ECHO POST / HTTP/1.0>REQUEST.TXT
ECHO Content-Type: image/jpeg>>REQUEST.TXT
ECHO Content-Length: 23456>>REQUEST.TXT
ECHO:>>REQUEST.TXT
HTTPER /C 127.0.0.1:12345  REQUEST.TXT + BLONDIE.JPG

# Connecting to server...  (abort with Ctrl-Break)
HTTP/1.0 200 OK


# Content received OK.
Po příkazu DIR by v okně serveru měl být vidět přijatý soubor RECEIVED.JPG.