GET parametr a binární data?

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

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
+
0
-

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.

Melmen
Člen | 132
+
0
-

Potřebuju to jen v jednom Presenteru, nestačilo by něco jako

$http = new \Nette\Http\RequestFactory();
    $http->setEncoding(FALSE);

?
Nevím, jen hádám

//EDIT Nestačilo, takhle to má stejný účinek

Editoval Melmen (11. 1. 2012 1:15)

Melmen
Člen | 132
+
0
-

Jen dotaz, není můj problém v RequestFactory na tomhle řádku?

const NONCHARS = '#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u';
Jan Tvrdík
Nette guru | 2595
+
0
-

Ano, tím se to filtruje.

Melmen
Člen | 132
+
0
-

Tak to jsem v kelu, s tímhle kamarád nejsem. Nevíš jak to upravit aby mi prošly binární data?

hrach
Člen | 1844
+
0
-

tu jsou duvody, zkus u Davida reklamovat :D
https://forum.nette.org/…ecnych-znaku

Melmen
Člen | 132
+
0
-

To jsem uvedl v prvním příspěvku :)
Patrik Votoček tam psal, že by bylo dobré dát tam volbu „možnost to něják vypnout“, ale asi se na to zapomělo :D

hrach
Člen | 1844
+
0
-

Ajo, nevsim sem si :D srr :D kazdopadne zaloz issue, nebo to pridej do Feature request, pripadne ten prepinac naprogramuj a posli pull ;)

Melmen
Člen | 132
+
0
-

Jak o tom tak přemýšlím, viděl bych to na Feature request :D

Jan Tvrdík
Nette guru | 2595
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

V nejbižších dnech se na to podívám, každopádně díky za pomoc!

Melmen
Člen | 132
+
0
-

Dneska jsem updatoval nette na 2.0.3 a potom na verzi z GitHubu, ale zmíněný „fix“ nereaguje, Nette nejdřív automaticky ořízne všechny GET data, co se posílají v binární formě.

Nějaký nápad co jak změnit / nastavit? Díky moc :)

Melmen
Člen | 132
+
0
-

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

baal
Člen | 34
+
0
-

Nebylo by možné si to vzít přímo z $_GET?

Melmen
Člen | 132
+
0
-

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
+
0
-

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
+
0
-

Bohužel to možné není, posílá se to pomocí Get. Je to specifikace bittorrent protokolu. Btw v master nette výše zmíněný „fix“ nefunguje. Jsem donucen používat starou verzi nette :-\

Jan Tvrdík
Nette guru | 2595
+
0
-

@Melmen: Můžu se zeptat, kvůli čemu to v masteru nefunguje?

Melmen
Člen | 132
+
0
-

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)