Dneska tu mám mozkový cvičení za účelem práce s odpovědí serveru na HTTP1.1 požadavek. Nebudu psát žádný konkrétní kódy, php, javu, céčko atd, prostě jen slovní řešení a zápis v pseudokódu.
Nastíníme si problém
Pokud náhodou děláte v něčem, co si neumí poradit s chunked přenosem, je potřeba výsledný přijatý response od serveru nějak zkonvertovat do smysluplných dat. Poprasený příchozí data vypadaj asi takhle.
HTTP/1.1 200 OK
Date: Sat, 08 Nov 2008 22:08:21 GMT
Server: Apache/2.0.63 (Win32)
Connection: close
Transfer-Encoding: chunked
Content-Type: text/xml;charset=utf-856
nejaka silena odpoved od serveru
0
Bystré oko zaregistrovalo především, číslo 56 na začátku dat a na konci potom 0 (nulu). Ti bezradnější již vědí z internetu, o co go, ostatním poradím a vyřeším.[MORE] Jen v rychlosti vysvětlím: Chunked enkoding rozseká data do bloků a přidá k nim velikost v hexa. Takže číslo 56 znamená: 86 dat do dalšího chunku. Nula znamená konec. Přesný zápis je [hlavička HTTP] \r\n \r\n {HEXvelikost} \r\n data \r\n {HEXvelikost} \r\n data \r\n 0 \r\n
zkusíme řešení
Po bestiálním prohledání internetu, s googlem i bez, jsem toho teda moc neobjevil. Zdá se, že tenhle problém nikdo neřeší. Na php stránkách nějaký borec zveřejnil kód, který byl založený na hledání \r\n znaků a ve smyčce zuřivě prochází string a pracuje a pracuje. Bohužel k výsledku se nedopracuje, pač to měl napsaný blbě. Tahle myšlenka se mi i přes to zdála dobrá a jal jsem se konat stejně. Postupně projít string, hledat \r\n znaky a podle čísla vytahovat data a skládat do nové proměné. Celé to ovšem naráželo na nějaké ty problémy.
Především rychlost byla dost tristní. S rostoucí délkou vstupu roste i doba. Dobré tak pro microsoft, nikoliv pro mě, génia :) Druhou závadu jsem odhalil, když jsem testoval. No nějak ty velikosti chunků selhaly a udávali hausnumera. Takže se to posrahausovalo. Nejdřív jsem řešil nějaký ty ifka jak to obejít a pak jsem se na to vysral a vyřešil to jinak. Spoleh na ty chunked čísla není.
Funkční řešení
Všechno jsem smazal, odsednul se dva metry od pičítače a čekal co mozek na to. Snažil jsem se na to jít od lesa. Pojmout to jinak. A pak mě to trklo, myšlenka nedostižné kvality: Jednoduše vyseknu ty ošklivý čísla co jsou navíc a hotovo. Nejdřív jsem nevěděl jak to napsat, a pak to vyřešil jednoduchý replace regular. Slovně tedy: “nahraď vše, co začíná a končí \r\n a uprostřed je jeden až 10 hexa znaků. Deset jsem zvolil takříkajíc odhadem. V řeči vb.net Regex.Replace(input, “\r\n(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f){1,10}\r\n”, “”) a prosím pěkně, záměrně jsem to rozepsal po jednom! Tím to vysekne všechny hnusný chunked informace a máte to čistý jak víno. Zatím to funguje výtečně. Je to na jeden řádek a vcelku rychlé.