Další nekonečný cyklus – canonicalize()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza Kuchař
Člen | 1662
+
0
-

Ahoj, tak už jsem zase narazil na nekonečný cyklus. Debugováním jsem došel na následující.

Aktuální adresa je

http://localhost/01Vyvoj/TabControl2/document_root/?grid-by=addressLine1&grid-order=addressLine1%3Da&do=grid-order

a canocicalize mě přesměruje na

http://localhost/01Vyvoj/TabControl2/document_root/?do=grid-order&grid-by=addressLine1&grid-order=addressLine1%3Da

Což je ta stejná url akorát má přeházené parametry. Tzn. problém je ve fci Uri::isEqual($uri). Teď je jenom otázka, proč Firefox 3.5 toto přesměrování neprovedl.

Takže prozatimní řešení je si v presenteru nastavit $autoCanonicalize = FALSE;.
PHP 5.2.9; Nette rev. 476

Editoval honzakuchar (9. 8. 2009 9:13)

Honza Kuchař
Člen | 1662
+
0
-

Ahoj, tak už se mi KONEČNĚ podařilo přijít na to, kde je chyba. V objektu HttpRequest jsou 2 uri.

// Tato uri odpovídá tomu co jsem mi poslal prohlížeč v GET xxx
$this->getHttpRequest()->getOriginalUri()->absoluteUri;

// Tato uri odpovídá nejspíš kanonickému ekvivalentu url
$this->getHttpRequest()->getUri()->absoluteUri

Proto prosím o vylepšení PHPDoc u těchto 2 metod. Protože vlastně ani nevím jaký je v nich přesně rozdíl. Ví někdo co přesně dělá metoda Uri::isEqual($url); ?

Nekonečný cyklus jsem opravil následující opravou:
Presenter.php:753

if ($uri !== NULL and $uri != $this->getHttpRequest()->getOriginalUri()->absoluteUri)

místo:

if ($uri !== NULL && !$this->getHttpRequest()->getUri()->isEqual($uri))

Žádné vedlejší účiny jsem nezaznamenal. Proto prosím někoho kdo má přístup do repozitáře Nette, aby to přidal do další revize. Pokud chcete aplikaci, kde to dělá (protože mi tohle Nette udělalo asi na 1 z 10 aplikací), tak velice rád poskytnu zdrojáky.

Ale popravdě řečeno dost dobře nechápu proč se tenhle vyskytuje jen v některých app s některými komponentami a jen v některých stavech. Například mám jen prázdnou stránku s DataGridem. Seřadím položky ASC. Vše je OK. Seřadím DESC. Nekonečný cyklus. Vypnu kanonizaci a je to ok (nebo nahradím výše zmíněný kód). Nevíte někdo čím by to mohlo být?

PetrP
Člen | 587
+
0
-

SVN Commit Policy

Neodesílejte kód, kterému nerozumíte
Nikdy neodesílejte opravy jen proto, že „vám fungují“. Opravujte chyby jen tehdy, pokud jejich příčině přesně rozumíte a jste si kódem opravy zcela jisti.

honzakuchar napsal(a):

Protože vlastně ani nevím jaký je v nich přesně rozdíl. Ví někdo co přesně dělá metoda Uri::isEqual($url); ?

Žádné vedlejší účiny jsem nezaznamenal. Proto prosím někoho kdo má přístup do repozitáře Nette, aby to přidal do další revize. Pokud chcete aplikaci, kde to dělá (protože mi tohle Nette udělalo asi na 1 z 10 aplikací)

Ale popravdě řečeno dost dobře nechápu proč se tenhle vyskytuje jen v některých app s některými komponentami a jen v některých stavech.

;]

Honza Kuchař
Člen | 1662
+
0
-

No jasne, doufal jsem, že to někdo Nette-zkušenější vysvětlí. ;)

Honza Kuchař
Člen | 1662
+
0
-

Tak už se mi tato chyba projevila na dalším projektu. Prostudoval jsem si metodu HttpRequest::detectUri() podle mě by se opravdu v canonicalize měla url porovnávat s getOriginalUri. Protože přece nemá smymsl srovnávat novou canonickou url s auktuální url v canonickém tvaru. ;) Je potřeba srovnávat s AKTUÁLNÍ url (bez úprav), kterou je možno získat pomocí getOriginalUri. Nebo se snad pletu?

David Grudl
Nette Core | 8228
+
0
-

fixed