Záhada mizejícího plus vyřešena!

5. března 2007

Programování

Pokud jdete stejně jako já s dobou a používáte na svých stránkách k něčemu AJAX, možná i Vaše stránky obsahují více či méně nepříjemnou vadu na funkčnosti nebo dokonce chybu.

Objekt XmlHttpRequest je úžasný nástroj, poslední dobou se mi jej daří s úspěchem protlačit do většiny stránek, které dělám. Vyhovuje mi možnost komunikovat se serverem bez nutnosti reloadu celé stránky, dostupné metody GET a POST plus možnost nastavovat (setRequestHeader) a číst (getResponseHeader) HTTP hlavičky požadavků přímo vybízí k použití v promakaných administračních rozhraních (více zde).

Radost z téměř půl roku vyvíjeného administračního rozhraní mi trvala asi měsíc. "Jaktože nemůžu do názvu položky v katalogu napsat znak +?" byla ta věta, která toto krásné období ukončila. Skutečně, bylo třeba si přiznat, že administrační rozhraní není schopné vložit položku se znakem + v názvu, ono plus se vždy nahradilo za mezeru.

Data byla odesílána metodou POST, proto bylo evidentní, že problém spočívá ve (špatném) zakódování do www-form-urlencoded (v tomto kódování jsou všechny mezery zakódovány právě do znaku plus a při dekódování na straně serveru se tato plus dekódují zpět na mezery). Javascript, a tím pádem i objekt XmlHttpRequest odmítá "opravdová" plus escapovat jako ostatní nealfanumerické znaky. A jsme v pytli, úžasný nápad použít místo klasického + jeho entitu + se nakonec neukázal jako úplně šťastný, protože minimálně v HTML žádná taková entita neexistuje.

Nápad číslo dvě sice nebyl příliš efektivní a podložený znalostmi, zato byl ovšem velmi efektní a v konečném důsledku vedl ke zdárnému cíli. Vzhledem k tomu, že klasické formuláře v HTML se znakem plus samozřejmě žádné problémy nemají, vytvořil jsem si jednoduchou HTML stránku s formulářem a jedním textovým polem. Spustil jsem "hackerský" a děsně cool prográmek Wireshark a začal odposlouchávat packety v naší domácí síti. Poté jsem přes dříve vyrobený formulář odeslal metodou POST znak plus (na Seznamu z něho museli mít radost :-D) a v odposlechnutém packetu si přečetl, že se znak + správně kóduje jako %2B. Ne že bych neznal ASCII tabulku nazpaměť nebo že bych se neuměl podívat do PSPadu, ale v daný moment mě opravdu žádný lepší způsob, jak se kóduje plus, nenapadl.

Následuje implementace záplaty - je to jednoduché, stačí v odesílaných datech pouze nahradit všechna plus za sekvenci %2B, například takto:

http_request.send('prusvih=ajax+plus'.replace('+', '%2B'));

Pokud uvažujete stejně jako já, napadly Vás právě dvě otázky ohledně znaku procento.

  1. Escapuje javascript znak procento?
  2. Pokud ano, nedostanu na serveru po dekódování vstupu místo tolik chtěného plus sekvenci %2B?

S pomocí Wiresharku se mi podařilo zjistit, že v tomto ohledu se javascript chová (navíc kupodivu v celém trojlístku prohlížečů) nejlépe jak může. Pokud za procentem objeví dvouciferné šestnáctkové číslo (například 2B v případě našeho plus), poté znak % nechá na pokoji a neescapuje ho. Ve všech ostatních případech je znak procenta escapován pomocí znaků %25. Takže tímto problémy končí.

Aneb jak napsat stránku o jednom řádku kódu v javascriptu...

Publikováno dne 05. 03. 2007 v kategorii Programování Odhadnutá klíčová slova BETA: plus | znak | javascript | napsat | html | GET | znaky | metoda | post
Mohlo by Vás zajímat BETA: HP PhotoSmart Plus e-All-in-One (CN216B) - ideální multifunkční tiskárna s podporou Airprint (recenze)

O kategorii Programování

V nejodbornější kategorii tohoto blogu jsou zařazeny články s mými programátorskými zkušenostmi získanými několikaletou praxí tvorby stránek a java aplikací pro mobilní telefony.

Komentáře k článku

Sergej B. (dne 31. 05. 2011 v 18.00)
Objev Ameriky :-)

JavaScript pro tyto potřeby má funkci escape

Marekzprahy (dne 31. 05. 2011 v 19.25)
Sergej B.: I po více než 4 letech je ten článek pořád pro některé lidi ve firmě přínosný - včetně Tebe, Sergeji ;-)
http://www.w3schools.com/jsref/jsref_escape.asp

Sergej B. (dne 01. 06. 2011 v 07.53)
No zrovna escape použivam kde je to nutné od doby co AJAX použivam - nevím v čem myslíš ten přinos por mě ?

ale to je fuk , ten prototype pro AJAX stejně ne buduje request stringy, a jesli jsem na to nezapominal, tak tam je

Marekzprahy (dne 01. 06. 2011 v 09.54)
cituji z výše uvedeného odkazu:

Definition and Usage

The escape() function encodes a string.

This function makes a string portable, so it can be transmitted across any network to any computer that supports ASCII characters.

This function encodes special characters, with the exception of: * @ - _ + . /

Přidat vlastní komentář:
Jméno:
E-mail:
Sledovat diskusi:
Web:
Kontrolní kód:

Komentáře jsou v prvé řadě určeny ke kladení dotazů k tématu, upozornění na chybu, rozšíření obsahu článku a vůbec ke zpětné reakci na obsah těchto stránek. Mé reakce jsou barevně odlišeny.

V současné době není umožněno vkládat HTML tagy - pokud vložíte HTML kód, bude převeden na entity. K Vašemu komentáři se do databáze uloží čas vložení a Vaše aktuální IP adresa (54.161.40.41). IP adresa se nebude zobrazovat čtenářům, nicméně v případě, že bude Váš odkaz shledán právně závadným, může být Vaše IP adresa předána příslušným státním orgánům. Emailové adresy jsou ochráněny před běžnými spam roboty.

© Marek Demčák 2007 - 2018
Všechna práva dle Autorského zákona (č. 121/2000 Sb.) vyhrazena.