GET parametr a binární data?
- Melmen
- Člen | 132
Ahoj, mám menší problém. Externí aplikace mi na Nette posílá GET parametr s urlencoded() binárními daty, ale Nette si s tím nějáko neví rady. V klasickém PHP vše funguje, ale v Nette ne.
Našel jsem k tomu téma kde se to řešilo. Odpověď „Jak to vypnout“ tam bohužel není.
Díky za rady
- Jan Tvrdík
- Nette guru | 2595
Jistý si nejsem, ale filtrování provádí
Nette\Http\RequestFactory
a jde vypnout pomocí
setEncoding(FALSE)
, což by snad mělo jít předefinováním
služby httpRequest.
- Jan Tvrdík
- Nette guru | 2595
Ale vždyť to jde vypnout ne? Problém je, že to nejde vypnout pouze pro daný presenter, což je ale principiální problém, neboť sestavení požadavku se provádí mnohem dříve, než je známo, na který presenter to bude.
- Melmen
- Člen | 132
Prozatím jsem přepsal v \Nette\Config\Extensions\NetteExtension
// http
$container->addDefinition('httpRequestFactory')
->setClass('Nette\Http\RequestFactory')
->addSetup('setEncoding', array(''))
->setInternal(TRUE)
->setShared(FALSE);
Původně tam bylo:
....
->addSetup('setEncoding', array('UTF-8'))
.....
A frčí to :)
- Jan Tvrdík
- Nette guru | 2595
Editovat NetteExtension
by nemělo být třeba. Mělo by to jít
úplně čistě předefinovat v configu. (Aspoň myslím, nemám ještě
nastudované přesně možnosti konfigurace nového DI.)
- Melmen
- Člen | 132
Tak jsem se hrabal v kódu Nette, a není „chyba“ na jednom z těchto řádků z RequestFactory?
// path & query
if (isset($_SERVER['REQUEST_URI'])) { // Apache, IIS 6.0
$requestUrl = $_SERVER['REQUEST_URI'];
} elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0 (PHP as CGI ?)
$requestUrl = $_SERVER['ORIG_PATH_INFO'];
if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] != '') {
$requestUrl .= '?' . $_SERVER['QUERY_STRING'];
}
} else {
$requestUrl = '';
}
$requestUrl = Strings::replace($requestUrl, $this->urlFilters['url']);
$tmp = explode('?', $requestUrl, 2);
$url->path = Strings::replace($tmp[0], $this->urlFilters['path']);
$url->query = isset($tmp[1]) ? $tmp[1] : '';
Když pošlu GET požadavek, Nette mi automaticky ořízne binární data a
vrátí mi oříznutou adresu bez nich. Chyba je zřejmě v
$url->path = Strings::replace($tmp[0], $this->urlFilters['path']);
?
Jen upřesním, že mám na serveru Nginx, a php 5.3.10 běžící pod php-fpm. A Nette z aktuální verze na Githubu
- Melmen
- Člen | 132
Tak to dělám. Ale ještě předtím mi Nette ořízne všechno, co se mu nelíbí.
Stáhnul jsem nejnovější verzi z Githubu, z verze 2.01 nahrál /Config/Extensions/NetteExtension.php plus obsah složky /Http/, aplikoval výše zmíněný „fix“ a už mi to zase frčí. Nevím co se v Nette měnilo, ale takhle mi to funguje :-)
- David Grudl
- Nette Core | 8282
Obvykle se to řeší tak, že se binární data posílají POSTem podobně jako při uploadu souboru, nebo se enkodují pomocí base64.
- Melmen
- Člen | 132
Zeptat se můžeš, ale s odpovědí to bude horší :-) netuším… Dřív taky fungovalo v indexu před require bootstrapu něco jako
if (isset($_get['hash'])) {
define('hash', bin2hex($_get['hash']));
}
Nicméně v nových verzích mi i toto nette ořízne.
pokud je někde chyba tak sorry, píšu z mobilu :-)
//edit
Dřív se taky nejdřív zpracoval get požadavek normálně, a pak nette
redirectlo na upravený požadavek. poznal jsem to díky logům na serveru.
Nyní se to neredirectne, a rovnou se to ořízne o „nebezpečný“ data
Editoval Melmen (11. 7. 2013 19:09)