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 | 8285
 
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)