Yvil standartai
2009 Sausio 13 d.
Arba kaip negalima lįsti prie svetimų inter-domain kukių
Aš kaip labiau web developeris visada nemėgau IE (ir IE based browserių) todėl, kad jo renderinimo varikliukas baisiai neatitinka web standartų. Dėl to norint padaryti ką nors bent šiek nutolstančio nuo pliko HTML’o tenka daug knistis (ypač kai tą darai pirmą kartą).
Šitoj vietoj serverio pusėj Microsoft’as pasitaisė. IIS7 gana griežtai laikosi tiek web standartų, tiek RFC. Atrodytų pasaka, tačiau būtent ties tais standartais aš ir praleidau pusę savaitgalio
Turėjau aš indėną (apache) ir nesukau sau galvos, kad galbūt kažkas padaryta neteisingai. Tačiau pribrendo laikas pradėti išnaudoti IIS 7, negi suksi veltui?
Susikonfiginau IIS7, pratestavau su testiniu subdomain’u – viskas gražiai važiuoja. Ką gi, ko čia bijoti. Atėjo savaitgalis, perkėliau puslapį į IIS7, uždariau indėną, patikrinau ir lengvai atsipūčiau – važiuoja. Kai po kurio laiko pastebėjau, jog su Chrome’u gaunu HTTP 400 (Bad request) problemą padalinau chrome’ui ir/arba TEO proxiui (proxis atsirado mat kolegai su chrome veikė).
Nerimas pakilo dar labiau kai gavau dar porą nusiskundimų iš kitų žmonių. Neveikė random žmonėm iš random browserių. Dėl ISP jau galvos nebesukau – problema IIS7. Pirmas darbas – patikrint gūgle, ką pikti liežuviai mala. Išsiaiškinau, kad 400 yra bene vienitelė klaida, kurios valdymas (handling) yra hardkodintas. Teko užsikurti Wireshark. Atsifiltruoju ip.dst == server ir matau kosmosą
Vienintelės žalios eilutės – SYN. ACK grįžta su blogu TCP checksum’u ir tas blogas checksum’as eina per visas likusias užklausas. Susinervinau – blogo checksum’o atveju turi būti prašomas pakartojimas. Kas blogiausia – sesės kompas viską piešė gražiai (ir puslapį atidarinėjo). Po kokių trijų puodelių arbatos, kelių valandų prie gūgle nusprendžiau pasigilinti į wireshark’o duomenis.
Praleidau trace’ą, rankom paanalizavau užklausas ir paagaliau išsiaiškinau, kad dėl neaiškių priežasčių puslapis x sau (į savo subdomeną) užsistato iškraipytus mūdlo sausainėlius. Pasileidęs Firefox su FireCookie įsitikinau, kad problema per ilgame GET header’yje. Kas blogiausia – puslapis rašytas Perl’u
Gerai, kad tuo metu pasipainiojo frgtn - padėjo sutaisyt kodą.
Taigi moralas: niekada negalima lįsti prie to, kas Tau nepriklauso, nes standartai gali bausti. Kur čia šuo pakastas? Nežinau. Bet matyt apašis tolerantiškesnis request’ams.