RequestTest.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Tests\Component\HttpFoundation;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\File\UploadedFile;
  13. class RequestTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * @covers Symfony\Component\HttpFoundation\Request::__construct
  17. */
  18. public function testConstructor()
  19. {
  20. $this->testInitialize();
  21. }
  22. /**
  23. * @covers Symfony\Component\HttpFoundation\Request::initialize
  24. */
  25. public function testInitialize()
  26. {
  27. $request = new Request();
  28. $request->initialize(array('foo' => 'bar'));
  29. $this->assertEquals('bar', $request->query->get('foo'), '->initialize() takes an array of query parameters as its first argument');
  30. $request->initialize(array(), array('foo' => 'bar'));
  31. $this->assertEquals('bar', $request->request->get('foo'), '->initialize() takes an array of request parameters as its second argument');
  32. $request->initialize(array(), array(), array('foo' => 'bar'));
  33. $this->assertEquals('bar', $request->attributes->get('foo'), '->initialize() takes an array of attributes as its thrid argument');
  34. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_FOO' => 'bar'));
  35. $this->assertEquals('bar', $request->headers->get('FOO'), '->initialize() takes an array of HTTP headers as its fourth argument');
  36. }
  37. /**
  38. * @covers Symfony\Component\HttpFoundation\Request::create
  39. */
  40. public function testCreate()
  41. {
  42. $request = Request::create('http://test.com/foo?bar=baz');
  43. $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
  44. $this->assertEquals('/foo', $request->getPathInfo());
  45. $this->assertEquals('bar=baz', $request->getQueryString());
  46. $this->assertEquals(80, $request->getPort());
  47. $this->assertEquals('test.com', $request->getHttpHost());
  48. $this->assertFalse($request->isSecure());
  49. $request = Request::create('https://test.com/foo?bar=baz');
  50. $this->assertEquals('https://test.com/foo?bar=baz', $request->getUri());
  51. $this->assertEquals('/foo', $request->getPathInfo());
  52. $this->assertEquals('bar=baz', $request->getQueryString());
  53. $this->assertEquals(443, $request->getPort());
  54. $this->assertEquals('test.com', $request->getHttpHost());
  55. $this->assertTrue($request->isSecure());
  56. $request = Request::create('test.com:90/foo');
  57. $this->assertEquals('http://test.com:90/foo', $request->getUri());
  58. $this->assertEquals('/foo', $request->getPathInfo());
  59. $this->assertEquals('test.com', $request->getHost());
  60. $this->assertEquals('test.com:90', $request->getHttpHost());
  61. $this->assertEquals(90, $request->getPort());
  62. $this->assertFalse($request->isSecure());
  63. $request = Request::create('https://test.com:90/foo');
  64. $this->assertEquals('https://test.com:90/foo', $request->getUri());
  65. $this->assertEquals('/foo', $request->getPathInfo());
  66. $this->assertEquals('test.com', $request->getHost());
  67. $this->assertEquals('test.com:90', $request->getHttpHost());
  68. $this->assertEquals(90, $request->getPort());
  69. $this->assertTrue($request->isSecure());
  70. $json = '{"jsonrpc":"2.0","method":"echo","id":7,"params":["Hello World"]}';
  71. $request = Request::create('http://example.com/jsonrpc', 'POST', array(), array(), array(), array(), $json);
  72. $this->assertEquals($json, $request->getContent());
  73. $this->assertFalse($request->isSecure());
  74. }
  75. /**
  76. * @covers Symfony\Component\HttpFoundation\Request::duplicate
  77. */
  78. public function testDuplicate()
  79. {
  80. $request = new Request(array('foo' => 'bar'), array('foo' => 'bar'), array('foo' => 'bar'), array(), array(), array('HTTP_FOO' => 'bar'));
  81. $dup = $request->duplicate();
  82. $this->assertEquals($request->query->all(), $dup->query->all(), '->duplicate() duplicates a request an copy the current query parameters');
  83. $this->assertEquals($request->request->all(), $dup->request->all(), '->duplicate() duplicates a request an copy the current request parameters');
  84. $this->assertEquals($request->attributes->all(), $dup->attributes->all(), '->duplicate() duplicates a request an copy the current attributes');
  85. $this->assertEquals($request->headers->all(), $dup->headers->all(), '->duplicate() duplicates a request an copy the current HTTP headers');
  86. $dup = $request->duplicate(array('foo' => 'foobar'), array('foo' => 'foobar'), array('foo' => 'foobar'), array(), array(), array('HTTP_FOO' => 'foobar'));
  87. $this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided');
  88. $this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided');
  89. $this->assertEquals(array('foo' => 'foobar'), $dup->attributes->all(), '->duplicate() overrides the attributes if provided');
  90. $this->assertEquals(array('foo' => array('foobar')), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided');
  91. }
  92. /**
  93. * @covers Symfony\Component\HttpFoundation\Request::getFormat
  94. * @covers Symfony\Component\HttpFoundation\Request::setFormat
  95. * @dataProvider getFormatToMimeTypeMapProvider
  96. */
  97. public function testGetFormatFromMimeType($format, $mimeTypes)
  98. {
  99. $request = new Request();
  100. foreach ($mimeTypes as $mime) {
  101. $this->assertEquals($format, $request->getFormat($mime));
  102. }
  103. $request->setFormat($format, $mimeTypes);
  104. foreach ($mimeTypes as $mime) {
  105. $this->assertEquals($format, $request->getFormat($mime));
  106. }
  107. }
  108. /**
  109. * @covers Symfony\Component\HttpFoundation\Request::getMimeType
  110. * @dataProvider getFormatToMimeTypeMapProvider
  111. */
  112. public function testGetMimeTypeFromFormat($format, $mimeTypes)
  113. {
  114. if (null !== $format) {
  115. $request = new Request();
  116. $this->assertEquals($mimeTypes[0], $request->getMimeType($format));
  117. }
  118. }
  119. public function getFormatToMimeTypeMapProvider()
  120. {
  121. return array(
  122. array(null, array(null, 'unexistent-mime-type')),
  123. array('txt', array('text/plain')),
  124. array('js', array('application/javascript', 'application/x-javascript', 'text/javascript')),
  125. array('css', array('text/css')),
  126. array('json', array('application/json', 'application/x-json')),
  127. array('xml', array('text/xml', 'application/xml', 'application/x-xml')),
  128. array('rdf', array('application/rdf+xml')),
  129. array('atom',array('application/atom+xml')),
  130. );
  131. }
  132. /**
  133. * @covers Symfony\Component\HttpFoundation\Request::getUri
  134. */
  135. public function testGetUri()
  136. {
  137. $server = array();
  138. // Standard Request on non default PORT
  139. // http://hostname:8080/index.php/path/info?query=string
  140. $server['HTTP_HOST'] = 'hostname:8080';
  141. $server['SERVER_NAME'] = 'hostname';
  142. $server['SERVER_PORT'] = '8080';
  143. $server['QUERY_STRING'] = 'query=string';
  144. $server['REQUEST_URI'] = '/index.php/path/info?query=string';
  145. $server['SCRIPT_NAME'] = '/index.php';
  146. $server['PATH_INFO'] = '/path/info';
  147. $server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info';
  148. $server['PHP_SELF'] = '/index_dev.php/path/info';
  149. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  150. $request = new Request();
  151. $request->initialize(array(), array(), array(), array(), array(), $server);
  152. $this->assertEquals('http://hostname:8080/index.php/path/info?query=string', $request->getUri(), '->getUri() with non default port');
  153. // Use std port number
  154. $server['HTTP_HOST'] = 'hostname';
  155. $server['SERVER_NAME'] = 'hostname';
  156. $server['SERVER_PORT'] = '80';
  157. $request->initialize(array(), array(), array(), array(), array(), $server);
  158. $this->assertEquals('http://hostname/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port');
  159. // Without HOST HEADER
  160. unset($server['HTTP_HOST']);
  161. $server['SERVER_NAME'] = 'hostname';
  162. $server['SERVER_PORT'] = '80';
  163. $request->initialize(array(), array(), array(), array(), array(), $server);
  164. $this->assertEquals('http://hostname/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port without HOST_HEADER');
  165. // Request with URL REWRITING (hide index.php)
  166. // RewriteCond %{REQUEST_FILENAME} !-f
  167. // RewriteRule ^(.*)$ index.php [QSA,L]
  168. // http://hostname:8080/path/info?query=string
  169. $server = array();
  170. $server['HTTP_HOST'] = 'hostname:8080';
  171. $server['SERVER_NAME'] = 'hostname';
  172. $server['SERVER_PORT'] = '8080';
  173. $server['REDIRECT_QUERY_STRING'] = 'query=string';
  174. $server['REDIRECT_URL'] = '/path/info';
  175. $server['SCRIPT_NAME'] = '/index.php';
  176. $server['QUERY_STRING'] = 'query=string';
  177. $server['REQUEST_URI'] = '/path/info?toto=test&1=1';
  178. $server['SCRIPT_NAME'] = '/index.php';
  179. $server['PHP_SELF'] = '/index.php';
  180. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  181. $request->initialize(array(), array(), array(), array(), array(), $server);
  182. $this->assertEquals('http://hostname:8080/path/info?query=string', $request->getUri(), '->getUri() with rewrite');
  183. // Use std port number
  184. // http://hostname/path/info?query=string
  185. $server['HTTP_HOST'] = 'hostname';
  186. $server['SERVER_NAME'] = 'hostname';
  187. $server['SERVER_PORT'] = '80';
  188. $request->initialize(array(), array(), array(), array(), array(), $server);
  189. $this->assertEquals('http://hostname/path/info?query=string', $request->getUri(), '->getUri() with rewrite and default port');
  190. // Without HOST HEADER
  191. unset($server['HTTP_HOST']);
  192. $server['SERVER_NAME'] = 'hostname';
  193. $server['SERVER_PORT'] = '80';
  194. $request->initialize(array(), array(), array(), array(), array(), $server);
  195. $this->assertEquals('http://hostname/path/info?query=string', $request->getUri(), '->getUri() with rewrite, default port without HOST_HEADER');
  196. }
  197. /**
  198. * @covers Symfony\Component\HttpFoundation\Request::getUriForPath
  199. */
  200. public function testGetUriForPath()
  201. {
  202. $request = Request::create('http://test.com/foo?bar=baz');
  203. $this->assertEquals('http://test.com/some/path', $request->getUriForPath('/some/path'));
  204. $request = Request::create('http://test.com:90/foo?bar=baz');
  205. $this->assertEquals('http://test.com:90/some/path', $request->getUriForPath('/some/path'));
  206. $request = Request::create('https://test.com/foo?bar=baz');
  207. $this->assertEquals('https://test.com/some/path', $request->getUriForPath('/some/path'));
  208. $request = Request::create('https://test.com:90/foo?bar=baz');
  209. $this->assertEquals('https://test.com:90/some/path', $request->getUriForPath('/some/path'));
  210. $server = array();
  211. // Standard Request on non default PORT
  212. // http://hostname:8080/index.php/path/info?query=string
  213. $server['HTTP_HOST'] = 'hostname:8080';
  214. $server['SERVER_NAME'] = 'hostname';
  215. $server['SERVER_PORT'] = '8080';
  216. $server['QUERY_STRING'] = 'query=string';
  217. $server['REQUEST_URI'] = '/index.php/path/info?query=string';
  218. $server['SCRIPT_NAME'] = '/index.php';
  219. $server['PATH_INFO'] = '/path/info';
  220. $server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info';
  221. $server['PHP_SELF'] = '/index_dev.php/path/info';
  222. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  223. $request = new Request();
  224. $request->initialize(array(), array(), array(), array(), array(),$server);
  225. $this->assertEquals('http://hostname:8080/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with non default port');
  226. // Use std port number
  227. $server['HTTP_HOST'] = 'hostname';
  228. $server['SERVER_NAME'] = 'hostname';
  229. $server['SERVER_PORT'] = '80';
  230. $request->initialize(array(), array(), array(), array(), array(), $server);
  231. $this->assertEquals('http://hostname/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port');
  232. // Without HOST HEADER
  233. unset($server['HTTP_HOST']);
  234. $server['SERVER_NAME'] = 'hostname';
  235. $server['SERVER_PORT'] = '80';
  236. $request->initialize(array(), array(), array(), array(), array(), $server);
  237. $this->assertEquals('http://hostname/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port without HOST_HEADER');
  238. // Request with URL REWRITING (hide index.php)
  239. // RewriteCond %{REQUEST_FILENAME} !-f
  240. // RewriteRule ^(.*)$ index.php [QSA,L]
  241. // http://hostname:8080/path/info?query=string
  242. $server = array();
  243. $server['HTTP_HOST'] = 'hostname:8080';
  244. $server['SERVER_NAME'] = 'hostname';
  245. $server['SERVER_PORT'] = '8080';
  246. $server['REDIRECT_QUERY_STRING'] = 'query=string';
  247. $server['REDIRECT_URL'] = '/path/info';
  248. $server['SCRIPT_NAME'] = '/index.php';
  249. $server['QUERY_STRING'] = 'query=string';
  250. $server['REQUEST_URI'] = '/path/info?toto=test&1=1';
  251. $server['SCRIPT_NAME'] = '/index.php';
  252. $server['PHP_SELF'] = '/index.php';
  253. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  254. $request->initialize(array(), array(), array(), array(), array(), $server);
  255. $this->assertEquals('http://hostname:8080/some/path', $request->getUriForPath('/some/path'), '->getUri() with rewrite');
  256. // Use std port number
  257. // http://hostname/path/info?query=string
  258. $server['HTTP_HOST'] = 'hostname';
  259. $server['SERVER_NAME'] = 'hostname';
  260. $server['SERVER_PORT'] = '80';
  261. $request->initialize(array(), array(), array(), array(), array(), $server);
  262. $this->assertEquals('http://hostname/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite and default port');
  263. // Without HOST HEADER
  264. unset($server['HTTP_HOST']);
  265. $server['SERVER_NAME'] = 'hostname';
  266. $server['SERVER_PORT'] = '80';
  267. $request->initialize(array(), array(), array(), array(), array(), $server);
  268. $this->assertEquals('http://hostname/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite, default port without HOST_HEADER');
  269. $this->assertEquals('hostname', $request->getHttpHost());
  270. }
  271. /**
  272. * @covers Symfony\Component\HttpFoundation\Request::getQueryString
  273. */
  274. public function testGetQueryString()
  275. {
  276. $request = new Request();
  277. $request->server->set('QUERY_STRING', 'foo');
  278. $this->assertEquals('foo', $request->getQueryString(), '->getQueryString() works with valueless parameters');
  279. $request->server->set('QUERY_STRING', 'foo=');
  280. $this->assertEquals('foo=', $request->getQueryString(), '->getQueryString() includes a dangling equal sign');
  281. $request->server->set('QUERY_STRING', 'bar=&foo=bar');
  282. $this->assertEquals('bar=&foo=bar', $request->getQueryString(), '->getQueryString() works when empty parameters');
  283. $request->server->set('QUERY_STRING', 'foo=bar&bar=');
  284. $this->assertEquals('bar=&foo=bar', $request->getQueryString(), '->getQueryString() sorts keys alphabetically');
  285. $request->server->set('QUERY_STRING', 'him=John%20Doe&her=Jane+Doe');
  286. $this->assertEquals('her=Jane+Doe&him=John+Doe', $request->getQueryString(), '->getQueryString() normalizes encoding');
  287. $request->server->set('QUERY_STRING', 'foo[]=1&foo[]=2');
  288. $this->assertEquals('foo%5B%5D=1&foo%5B%5D=2', $request->getQueryString(), '->getQueryString() allows array notation');
  289. $request->server->set('QUERY_STRING', 'foo=1&foo=2');
  290. $this->assertEquals('foo=1&foo=2', $request->getQueryString(), '->getQueryString() allows repeated parameters');
  291. }
  292. /**
  293. * @covers Symfony\Component\HttpFoundation\Request::getHost
  294. */
  295. public function testGetHost()
  296. {
  297. $request = new Request();
  298. $request->initialize(array('foo' => 'bar'));
  299. $this->assertEquals('', $request->getHost(), '->getHost() return empty string if not initialized');
  300. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.exemple.com'));
  301. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from Host Header');
  302. // Host header with port number.
  303. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.exemple.com:8080'));
  304. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from Host Header with port number');
  305. // Server values.
  306. $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.exemple.com'));
  307. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from server name');
  308. // X_FORWARDED_HOST.
  309. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com'));
  310. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from X_FORWARDED_HOST');
  311. // X_FORWARDED_HOST
  312. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com, www.second.com'));
  313. $this->assertEquals('www.second.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST use last value');
  314. // X_FORWARDED_HOST with port number
  315. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com, www.second.com:8080'));
  316. $this->assertEquals('www.second.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST with port number');
  317. $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.exemple.com', 'HTTP_X_FORWARDED_HOST' => 'www.forward.com'));
  318. $this->assertEquals('www.forward.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST has priority over Host');
  319. $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.exemple.com', 'HTTP_X_FORWARDED_HOST' => 'www.forward.com'));
  320. $this->assertEquals('www.forward.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST has priority over SERVER_NAME ');
  321. $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.exemple.com', 'HTTP_HOST' => 'www.host.com'));
  322. $this->assertEquals('www.host.com', $request->getHost(), '->getHost() value from Host header has priority over SERVER_NAME ');
  323. }
  324. /**
  325. * @covers Symfony\Component\HttpFoundation\Request::setMethod
  326. * @covers Symfony\Component\HttpFoundation\Request::getMethod
  327. */
  328. public function testGetSetMethod()
  329. {
  330. $request = new Request();
  331. $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns GET if no method is defined');
  332. $request->setMethod('get');
  333. $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns an uppercased string');
  334. $request->setMethod('PURGE');
  335. $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method even if it is not a standard one');
  336. $request->setMethod('POST');
  337. $this->assertEquals('POST', $request->getMethod(), '->getMethod() returns the method POST if no _method is defined');
  338. $request->setMethod('POST');
  339. $request->request->set('_method', 'purge');
  340. $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method from _method if defined and POST');
  341. }
  342. public function testGetClientIp()
  343. {
  344. $request = new Request;
  345. $this->assertEquals('', $request->getClientIp());
  346. $this->assertEquals('', $request->getClientIp(true));
  347. $request->initialize(array(), array(), array(), array(), array(), array('REMOTE_ADDR' => '88.88.88.88'));
  348. $this->assertEquals('88.88.88.88', $request->getClientIp());
  349. $request->initialize(array(), array(), array(), array(), array(), array('REMOTE_ADDR' => '127.0.0.1', 'HTTP_CLIENT_IP' => '88.88.88.88'));
  350. $this->assertEquals('127.0.0.1', $request->getClientIp());
  351. $request->initialize(array(), array(), array(), array(), array(), array('REMOTE_ADDR' => '127.0.0.1', 'HTTP_CLIENT_IP' => '88.88.88.88'));
  352. $this->assertEquals('88.88.88.88', $request->getClientIp(true));
  353. $request->initialize(array(), array(), array(), array(), array(), array('REMOTE_ADDR' => '127.0.0.1', 'HTTP_X_FORWARDED_FOR' => '88.88.88.88'));
  354. $this->assertEquals('127.0.0.1', $request->getClientIp());
  355. $request->initialize(array(), array(), array(), array(), array(), array('REMOTE_ADDR' => '127.0.0.1', 'HTTP_X_FORWARDED_FOR' => '88.88.88.88'));
  356. $this->assertEquals('88.88.88.88', $request->getClientIp(true));
  357. }
  358. public function testGetContentWorksTwiceInDefaultMode()
  359. {
  360. $req = new Request;
  361. $this->assertEquals('', $req->getContent());
  362. $this->assertEquals('', $req->getContent());
  363. }
  364. public function testGetContentReturnsResource()
  365. {
  366. $req = new Request;
  367. $retval = $req->getContent(true);
  368. $this->assertInternalType('resource', $retval);
  369. $this->assertEquals("", fread($retval, 1));
  370. $this->assertTrue(feof($retval));
  371. }
  372. /**
  373. * @expectedException LogicException
  374. * @dataProvider getContentCantBeCalledTwiceWithResourcesProvider
  375. */
  376. public function testGetContentCantBeCalledTwiceWithResources($first, $second)
  377. {
  378. $req = new Request;
  379. $req->getContent($first);
  380. $req->getContent($second);
  381. }
  382. public function getContentCantBeCalledTwiceWithResourcesProvider()
  383. {
  384. return array(
  385. 'Resource then fetch' => array(true, false),
  386. 'Resource then resource' => array(true, true),
  387. 'Fetch then resource' => array(false, true),
  388. );
  389. }
  390. public function testCreateFromGlobals()
  391. {
  392. $_GET['foo1'] = 'bar1';
  393. $_POST['foo2'] = 'bar2';
  394. $_COOKIE['foo3'] = 'bar3';
  395. $_FILES['foo4'] = array('bar4');
  396. $_SERVER['foo5'] = 'bar5';
  397. $request = Request::createFromGlobals();
  398. $this->assertEquals('bar1', $request->query->get('foo1'), '::fromGlobals() uses values from $_GET');
  399. $this->assertEquals('bar2', $request->request->get('foo2'), '::fromGlobals() uses values from $_POST');
  400. $this->assertEquals('bar3', $request->cookies->get('foo3'), '::fromGlobals() uses values from $_COOKIE');
  401. $this->assertEquals(array('bar4'), $request->files->get('foo4'), '::fromGlobals() uses values from $_FILES');
  402. $this->assertEquals('bar5', $request->server->get('foo5'), '::fromGlobals() uses values from $_SERVER');
  403. unset($_GET['foo1'], $_POST['foo2'], $_COOKIE['foo3'], $_FILES['foo4'], $_SERVER['foo5']);
  404. }
  405. public function testOverrideGlobals()
  406. {
  407. $request = new Request();
  408. $request->initialize(array('foo' => 'bar'));
  409. // as the Request::overrideGlobals really work, it erase $_SERVER, so we must backup it
  410. $server = $_SERVER;
  411. $request->overrideGlobals();
  412. $this->assertEquals(array('foo' => 'bar'), $_GET);
  413. $request->initialize(array(), array('foo' => 'bar'));
  414. $request->overrideGlobals();
  415. $this->assertEquals(array('foo' => 'bar'), $_POST);
  416. $this->assertArrayNotHasKey('HTTP_X_FORWARDED_PROTO', $_SERVER);
  417. $request->headers->set('X_FORWARDED_PROTO', 'https');
  418. $this->assertTrue($request->isSecure());
  419. $request->overrideGlobals();
  420. $this->assertArrayHasKey('HTTP_X_FORWARDED_PROTO', $_SERVER);
  421. // restore initial $_SERVER array
  422. $_SERVER = $server;
  423. }
  424. public function testGetScriptName()
  425. {
  426. $request = new Request();
  427. $this->assertEquals('', $request->getScriptName());
  428. $server = array();
  429. $server['SCRIPT_NAME'] = '/index.php';
  430. $request->initialize(array(), array(), array(), array(), array(), $server);
  431. $this->assertEquals('/index.php', $request->getScriptName());
  432. $server = array();
  433. $server['ORIG_SCRIPT_NAME'] = '/frontend.php';
  434. $request->initialize(array(), array(), array(), array(), array(), $server);
  435. $this->assertEquals('/frontend.php', $request->getScriptName());
  436. $server = array();
  437. $server['SCRIPT_NAME'] = '/index.php';
  438. $server['ORIG_SCRIPT_NAME'] = '/frontend.php';
  439. $request->initialize(array(), array(), array(), array(), array(), $server);
  440. $this->assertEquals('/index.php', $request->getScriptName());
  441. }
  442. public function testGetBasePath()
  443. {
  444. $request = new Request();
  445. $this->assertEquals('', $request->getBasePath());
  446. $server = array();
  447. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  448. $request->initialize(array(), array(), array(), array(), array(), $server);
  449. $this->assertEquals('', $request->getBasePath());
  450. $server = array();
  451. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  452. $server['SCRIPT_NAME'] = '/index.php';
  453. $request->initialize(array(), array(), array(), array(), array(), $server);
  454. $this->assertEquals('', $request->getBasePath());
  455. $server = array();
  456. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  457. $server['PHP_SELF'] = '/index.php';
  458. $request->initialize(array(), array(), array(), array(), array(), $server);
  459. $this->assertEquals('', $request->getBasePath());
  460. $server = array();
  461. $server['SCRIPT_FILENAME'] = '/some/where/index.php';
  462. $server['ORIG_SCRIPT_NAME'] = '/index.php';
  463. $request->initialize(array(), array(), array(), array(), array(), $server);
  464. $this->assertEquals('', $request->getBasePath());
  465. }
  466. public function testGetPreferredLanguage()
  467. {
  468. $request = new Request();
  469. $this->assertEquals('', $request->getPreferredLanguage());
  470. $this->assertEquals('fr', $request->getPreferredLanguage(array('fr')));
  471. $this->assertEquals('fr', $request->getPreferredLanguage(array('fr', 'en')));
  472. $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'fr')));
  473. $this->assertEquals('fr-ch', $request->getPreferredLanguage(array('fr-ch', 'fr-fr')));
  474. $request = new Request();
  475. $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
  476. $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'en-us')));
  477. $request = new Request();
  478. $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
  479. $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
  480. }
  481. public function testIsXmlHttpRequest()
  482. {
  483. $request = new Request();
  484. $this->assertFalse($request->isXmlHttpRequest());
  485. $request->headers->set('X-Requested-With', 'XMLHttpRequest');
  486. $this->assertTrue($request->isXmlHttpRequest());
  487. $request->headers->remove('X-Requested-With');
  488. $this->assertFalse($request->isXmlHttpRequest());
  489. }
  490. public function testGetCharsets()
  491. {
  492. $request = new Request();
  493. $this->assertEquals(array(), $request->getCharsets());
  494. $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6');
  495. $this->assertEquals(array(), $request->getCharsets()); // testing caching
  496. $request = new Request();
  497. $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6');
  498. $this->assertEquals(array('ISO-8859-1', 'US-ASCII', 'UTF-8', 'ISO-10646-UCS-2'), $request->getCharsets());
  499. $request = new Request();
  500. $request->headers->set('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7');
  501. $this->assertEquals(array('ISO-8859-1', '*', 'utf-8'), $request->getCharsets());
  502. }
  503. public function testGetAcceptableContentTypes()
  504. {
  505. $request = new Request();
  506. $this->assertEquals(array(), $request->getAcceptableContentTypes());
  507. $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*');
  508. $this->assertEquals(array(), $request->getAcceptableContentTypes()); // testing caching
  509. $request = new Request();
  510. $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*');
  511. $this->assertEquals(array('multipart/mixed', '*/*', 'text/html', 'application/xhtml+xml', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/vnd.wap.wmlscriptc'), $request->getAcceptableContentTypes());
  512. }
  513. public function testGetLanguages()
  514. {
  515. $request = new Request();
  516. $this->assertEquals(array(), $request->getLanguages());
  517. $request = new Request();
  518. $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
  519. $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
  520. $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
  521. $request = new Request();
  522. $request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6');
  523. $this->assertEquals(array('zh', 'cherokee'), $request->getLanguages());
  524. }
  525. public function testGetRequestFormat()
  526. {
  527. $request = new Request();
  528. $this->assertEquals('html', $request->getRequestFormat());
  529. $request = new Request();
  530. $this->assertEquals(null, $request->getRequestFormat(null));
  531. $request = new Request();
  532. $this->assertEquals(null, $request->setRequestFormat('foo'));
  533. $this->assertEquals('foo', $request->getRequestFormat(null));
  534. }
  535. }