RequestTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.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(null, 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(null, null, array('foo' => 'bar'));
  33. $this->assertEquals('bar', $request->attributes->get('foo'), '->initialize() takes an array of attributes as its thrid argument');
  34. $request->initialize(null, null, null, null, null, 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:80/foo?bar=baz', $request->getUri());
  44. $this->assertEquals('/foo', $request->getPathInfo());
  45. $this->assertEquals('bar=baz', $request->getQueryString());
  46. $request = Request::create('test.com:90/foo');
  47. $this->assertEquals('http://test.com:90/foo', $request->getUri());
  48. $this->assertEquals('/foo', $request->getPathInfo());
  49. $this->assertEquals('test.com', $request->getHost());
  50. $this->assertEquals(90, $request->getPort());
  51. }
  52. /**
  53. * @covers Symfony\Component\HttpFoundation\Request::duplicate
  54. */
  55. public function testDuplicate()
  56. {
  57. $request = new Request(array('foo' => 'bar'), array('foo' => 'bar'), array('foo' => 'bar'), array(), array(), array('HTTP_FOO' => 'bar'));
  58. $dup = $request->duplicate();
  59. $this->assertEquals($request->query->all(), $dup->query->all(), '->duplicate() duplicates a request an copy the current query parameters');
  60. $this->assertEquals($request->request->all(), $dup->request->all(), '->duplicate() duplicates a request an copy the current request parameters');
  61. $this->assertEquals($request->attributes->all(), $dup->attributes->all(), '->duplicate() duplicates a request an copy the current attributes');
  62. $this->assertEquals($request->headers->all(), $dup->headers->all(), '->duplicate() duplicates a request an copy the current HTTP headers');
  63. $dup = $request->duplicate(array('foo' => 'foobar'), array('foo' => 'foobar'), array('foo' => 'foobar'), array(), array(), array('HTTP_FOO' => 'foobar'));
  64. $this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided');
  65. $this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided');
  66. $this->assertEquals(array('foo' => 'foobar'), $dup->attributes->all(), '->duplicate() overrides the attributes if provided');
  67. $this->assertEquals(array('foo' => array('foobar')), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided');
  68. }
  69. /**
  70. * @covers Symfony\Component\HttpFoundation\Request::getFormat
  71. */
  72. public function testGetFormat()
  73. {
  74. $request = new Request();
  75. $this->assertNull($request->getFormat(null), '->getFormat() returns null when mime-type is null');
  76. $this->assertNull($request->getFormat('unexistant-mime-type'), '->getFormat() returns null when mime-type is unknown');
  77. $this->assertEquals('txt', $request->getFormat('text/plain'), '->getFormat() returns correct format when mime-type have one format only');
  78. $this->assertEquals('js', $request->getFormat('application/javascript'), '->getFormat() returns correct format when format have multiple mime-type (first)');
  79. $this->assertEquals('js', $request->getFormat('application/x-javascript'), '->getFormat() returns correct format when format have multiple mime-type');
  80. $this->assertEquals('js', $request->getFormat('text/javascript'), '->getFormat() returns correct format when format have multiple mime-type (last)');
  81. }
  82. /**
  83. * @covers Symfony\Component\HttpFoundation\Request::getQueryString
  84. */
  85. public function testGetQueryString()
  86. {
  87. $request = new Request();
  88. $request->server->set('QUERY_STRING', 'foo');
  89. $this->assertEquals('foo', $request->getQueryString(), '->getQueryString() works with valueless parameters');
  90. $request->server->set('QUERY_STRING', 'foo=');
  91. $this->assertEquals('foo=', $request->getQueryString(), '->getQueryString() includes a dangling equal sign');
  92. $request->server->set('QUERY_STRING', 'bar=&foo=bar');
  93. $this->assertEquals('bar=&foo=bar', $request->getQueryString(), '->getQueryString() works when empty parameters');
  94. $request->server->set('QUERY_STRING', 'foo=bar&bar=');
  95. $this->assertEquals('bar=&foo=bar', $request->getQueryString(), '->getQueryString() sorts keys alphabetically');
  96. $request->server->set('QUERY_STRING', 'him=John%20Doe&her=Jane+Doe');
  97. $this->assertEquals('her=Jane+Doe&him=John+Doe', $request->getQueryString(), '->getQueryString() normalizes encoding');
  98. $request->server->set('QUERY_STRING', 'foo[]=1&foo[]=2');
  99. $this->assertEquals('foo%5B%5D=1&foo%5B%5D=2', $request->getQueryString(), '->getQueryString() allows array notation');
  100. $request->server->set('QUERY_STRING', 'foo=1&foo=2');
  101. $this->assertEquals('foo=1&foo=2', $request->getQueryString(), '->getQueryString() allows repeated parameters');
  102. }
  103. /**
  104. * @covers Symfony\Component\HttpFoundation\Request::getHost
  105. */
  106. public function testGetHost()
  107. {
  108. $request = new Request();
  109. $request->initialize(array('foo' => 'bar'));
  110. $this->assertEquals('', $request->getHost(), '->getHost() return empty string if not initialized');
  111. $request->initialize(null, null, null, null, null, array('HTTP_HOST' => 'www.exemple.com'));
  112. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from Host Header');
  113. // Host header with port number.
  114. $request->initialize(null, null, null, null, null, array('HTTP_HOST' => 'www.exemple.com:8080'));
  115. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from Host Header with port number');
  116. // Server values.
  117. $request->initialize(null, null, null, null, null, array('SERVER_NAME' => 'www.exemple.com'));
  118. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from server name');
  119. // X_FORWARDED_HOST.
  120. $request->initialize(null, null, null, null, null, array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com'));
  121. $this->assertEquals('www.exemple.com', $request->getHost(), '->getHost() from X_FORWARDED_HOST');
  122. // X_FORWARDED_HOST
  123. $request->initialize(null, null, null, null, null, array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com, www.second.com'));
  124. $this->assertEquals('www.second.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST use last value');
  125. // X_FORWARDED_HOST with port number
  126. $request->initialize(null, null, null, null, null, array('HTTP_X_FORWARDED_HOST' => 'www.exemple.com, www.second.com:8080'));
  127. $this->assertEquals('www.second.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST with port number');
  128. $request->initialize(null, null, null, null, null, array('HTTP_HOST' => 'www.exemple.com', 'HTTP_X_FORWARDED_HOST' => 'www.forward.com'));
  129. $this->assertEquals('www.forward.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST has priority over Host');
  130. $request->initialize(null, null, null, null, null, array('SERVER_NAME' => 'www.exemple.com', 'HTTP_X_FORWARDED_HOST' => 'www.forward.com'));
  131. $this->assertEquals('www.forward.com', $request->getHost(), '->getHost() value from X_FORWARDED_HOST has priority over SERVER_NAME ');
  132. $request->initialize(null, null, null, null, null, array('SERVER_NAME' => 'www.exemple.com', 'HTTP_HOST' => 'www.host.com'));
  133. $this->assertEquals('www.host.com', $request->getHost(), '->getHost() value from Host header has priority over SERVER_NAME ');
  134. }
  135. /**
  136. * @covers Symfony\Component\HttpFoundation\Request::setMethod
  137. * @covers Symfony\Component\HttpFoundation\Request::getMethod
  138. */
  139. public function testGetSetMethod()
  140. {
  141. $request = new Request();
  142. $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns GET if no method is defined');
  143. $request->setMethod('get');
  144. $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns an uppercased string');
  145. $request->setMethod('PURGE');
  146. $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method even if it is not a standard one');
  147. $request->setMethod('POST');
  148. $this->assertEquals('POST', $request->getMethod(), '->getMethod() returns the method POST if no _method is defined');
  149. $request->setMethod('POST');
  150. $request->request->set('_method', 'purge');
  151. $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method from _method if defined and POST');
  152. }
  153. public function testInitializeConvertsUploadedFiles()
  154. {
  155. $tmpFile = $this->createTempFile();
  156. $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
  157. $request = Request::create('', 'get', array(), array(), array('file' => array(
  158. 'name' => basename($tmpFile),
  159. 'type' => 'text/plain',
  160. 'tmp_name' => $tmpFile,
  161. 'error' => 0,
  162. 'size' => 100
  163. )));
  164. $this->assertEquals($file, $request->files->get('file'));
  165. }
  166. public function testInitializeDoesNotConvertEmptyUploadedFiles()
  167. {
  168. $request = Request::create('', 'get', array(), array(), array('file' => array(
  169. 'name' => '',
  170. 'type' => '',
  171. 'tmp_name' => '',
  172. 'error' => UPLOAD_ERR_NO_FILE,
  173. 'size' => 0
  174. )));
  175. $this->assertEquals(null, $request->files->get('file'));
  176. }
  177. public function testInitializeConvertsUploadedFilesWithPhpBug()
  178. {
  179. $tmpFile = $this->createTempFile();
  180. $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
  181. $request = Request::create('', 'get', array(), array(), array(
  182. 'child' => array(
  183. 'name' => array(
  184. 'file' => basename($tmpFile),
  185. ),
  186. 'type' => array(
  187. 'file' => 'text/plain',
  188. ),
  189. 'tmp_name' => array(
  190. 'file' => $tmpFile,
  191. ),
  192. 'error' => array(
  193. 'file' => 0,
  194. ),
  195. 'size' => array(
  196. 'file' => 100,
  197. ),
  198. )
  199. ));
  200. $files = $request->files->all();
  201. $this->assertEquals($file, $files['child']['file']);
  202. }
  203. public function testInitializeConvertsNestedUploadedFilesWithPhpBug()
  204. {
  205. $tmpFile = $this->createTempFile();
  206. $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
  207. $request = Request::create('', 'get', array(), array(), array(
  208. 'child' => array(
  209. 'name' => array(
  210. 'sub' => array('file' => basename($tmpFile))
  211. ),
  212. 'type' => array(
  213. 'sub' => array('file' => 'text/plain')
  214. ),
  215. 'tmp_name' => array(
  216. 'sub' => array('file' => $tmpFile)
  217. ),
  218. 'error' => array(
  219. 'sub' => array('file' => 0)
  220. ),
  221. 'size' => array(
  222. 'sub' => array('file' => 100)
  223. ),
  224. )
  225. ));
  226. $files = $request->files->all();
  227. $this->assertEquals($file, $files['child']['sub']['file']);
  228. }
  229. protected function createTempFile()
  230. {
  231. return tempnam(sys_get_temp_dir(), 'FormTest');
  232. }
  233. }