HttpTest.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Controller
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. // Call Zend_Controller_Request_HttpTest::main() if this source file is executed directly.
  23. if (!defined("PHPUnit_MAIN_METHOD")) {
  24. define("PHPUnit_MAIN_METHOD", "Zend_Controller_Request_HttpTest::main");
  25. }
  26. require_once dirname(__FILE__) . '/../../../TestHelper.php';
  27. require_once 'Zend/Controller/Request/Http.php';
  28. /**
  29. * @category Zend
  30. * @package Zend_Controller
  31. * @subpackage UnitTests
  32. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  33. * @license http://framework.zend.com/license/new-bsd New BSD License
  34. * @group Zend_Controller
  35. * @group Zend_Controller_Request
  36. */
  37. class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
  38. {
  39. /**
  40. * @var Zend_Controller_Request_Http
  41. */
  42. protected $_request;
  43. /**
  44. * Original $_SERVER
  45. * @var array
  46. */
  47. protected $_origServer;
  48. /**
  49. * Runs the test methods of this class.
  50. *
  51. * @access public
  52. * @static
  53. */
  54. public static function main()
  55. {
  56. $suite = new PHPUnit_Framework_TestSuite("Zend_Controller_Request_HttpTest");
  57. $result = PHPUnit_TextUI_TestRunner::run($suite);
  58. }
  59. public function setUp()
  60. {
  61. $this->_origServer = $_SERVER;
  62. $_GET = array();
  63. $_POST = array();
  64. $_SERVER = array(
  65. 'SCRIPT_FILENAME' => __FILE__,
  66. 'PHP_SELF' => __FILE__,
  67. );
  68. $this->_request = new Zend_Controller_Request_Http('http://framework.zend.com/news/3?var1=val1&var2=val2#anchor');
  69. }
  70. public function tearDown()
  71. {
  72. unset($this->_request);
  73. $_SERVER = $this->_origServer;
  74. }
  75. public function testSetGetControllerKey()
  76. {
  77. $this->_request->setControllerKey('controller');
  78. $this->assertEquals('controller', $this->_request->getControllerKey());
  79. $this->_request->setControllerKey('foo');
  80. $this->assertEquals('foo', $this->_request->getControllerKey());
  81. }
  82. public function testSetGetActionKey()
  83. {
  84. $this->_request->setActionKey('action');
  85. $this->assertEquals('action', $this->_request->getActionKey());
  86. $this->_request->setActionKey('foo');
  87. $this->assertEquals('foo', $this->_request->getActionKey());
  88. }
  89. public function testSetGetControllerName()
  90. {
  91. $this->_request->setControllerName('foo');
  92. $this->assertEquals('foo', $this->_request->getControllerName());
  93. $this->_request->setControllerName('bar');
  94. $this->assertEquals('bar', $this->_request->getControllerName());
  95. }
  96. public function testSetGetActionName()
  97. {
  98. $this->_request->setActionName('foo');
  99. $this->assertEquals('foo', $this->_request->getActionName());
  100. $this->_request->setActionName('bar');
  101. $this->assertEquals('bar', $this->_request->getActionName());
  102. }
  103. public function test__Get()
  104. {
  105. $_POST['baz'] = 'boo';
  106. $_COOKIE['bal'] = 'peen';
  107. $this->_request->setParam('foo', 'bar');
  108. foreach ($_ENV as $envKey => $expected) {
  109. if (isset($_ENV[$envKey]) && !empty($_ENV[$envKey])) {
  110. $expEnvKey = $envKey;
  111. break;
  112. }
  113. }
  114. $_SERVER['REQUEST_TIME'] = date('Y-m-d H:i:s');
  115. $this->assertEquals('bar', $this->_request->foo);
  116. $this->assertEquals('val1', $this->_request->var1);
  117. $this->assertEquals('boo', $this->_request->baz);
  118. $this->assertEquals('peen', $this->_request->bal);
  119. $this->assertEquals($_SERVER['REQUEST_TIME'], $this->_request->REQUEST_TIME);
  120. $this->assertEquals($this->_request->getPathInfo(), $this->_request->PATH_INFO, $this->_request->PATH_INFO);
  121. $this->assertEquals($this->_request->getRequestUri(), $this->_request->REQUEST_URI, $this->_request->REQUEST_URI);
  122. if (isset($expEnvKey)) {
  123. $this->assertEquals($expected, $this->_request->$expEnvKey);
  124. }
  125. }
  126. public function testGetIsAlias()
  127. {
  128. $this->assertEquals('val1', $this->_request->get('var1'));
  129. }
  130. public function testSetIsAlias()
  131. {
  132. try {
  133. $this->_request->set('foo', 'bar');
  134. $this->fail('set() should alias to __set(), and throw an exception');
  135. } catch (Exception $e) {
  136. // success
  137. }
  138. }
  139. public function test__Isset()
  140. {
  141. $_POST['baz'] = 'boo';
  142. $_COOKIE['bal'] = 'peen';
  143. $this->_request->setParam('foo', 'bar');
  144. foreach ($_ENV as $envKey => $expected) {
  145. if (isset($_ENV[$envKey]) && !empty($_ENV[$envKey])) {
  146. $expEnvKey = $envKey;
  147. break;
  148. }
  149. }
  150. $_SERVER['REQUEST_TIME'] = date('Y-m-d H:i:s');
  151. $this->assertTrue(isset($this->_request->foo));
  152. $this->assertTrue(isset($this->_request->var1));
  153. $this->assertTrue(isset($this->_request->baz));
  154. $this->assertTrue(isset($this->_request->bal));
  155. $this->assertTrue(isset($this->_request->REQUEST_TIME));
  156. $this->assertFalse(isset($this->_request->bogosity));
  157. if (isset($expEnvKey)) {
  158. $this->assertTrue(isset($this->_request->$expEnvKey));
  159. }
  160. }
  161. public function testHasIsAlias()
  162. {
  163. $this->assertTrue($this->_request->has('var1'));
  164. }
  165. public function test__SetThrowsException()
  166. {
  167. try {
  168. $this->_request->foo = 'bar';
  169. $this->fail('__set() should throw an exception');
  170. } catch (Exception $e) {
  171. // success
  172. }
  173. }
  174. public function testClearParams()
  175. {
  176. $this->_request->setParam('foo', 'bar');
  177. $this->_request->clearParams();
  178. $this->assertNull($this->_request->getParam('foo'));
  179. }
  180. public function testSetGetParam()
  181. {
  182. $this->_request->setParam('foo', 'bar');
  183. $this->assertEquals('bar', $this->_request->getParam('foo'));
  184. }
  185. public function testSetGetParams()
  186. {
  187. $params = array(
  188. 'foo' => 'bar',
  189. 'boo' => 'bah',
  190. 'fee' => 'fi'
  191. );
  192. $this->_request->setParams($params);
  193. $received = $this->_request->getParams();
  194. $this->assertSame($params, array_intersect_assoc($params, $received));
  195. }
  196. public function testGetParamsWithNoGetOrPost()
  197. {
  198. unset($_GET, $_POST);
  199. $params = array(
  200. 'foo' => 'bar',
  201. 'boo' => 'bah',
  202. 'fee' => 'fi'
  203. );
  204. $this->_request->setParams($params);
  205. $received = $this->_request->getParams();
  206. $this->assertSame($params, array_intersect_assoc($params, $received));
  207. }
  208. public function testGetParamsWithGetAndPost()
  209. {
  210. $_GET = array(
  211. 'get' => true
  212. );
  213. $_POST = array(
  214. 'post' => true
  215. );
  216. $params = array(
  217. 'foo' => 'bar',
  218. 'boo' => 'bah',
  219. 'fee' => 'fi'
  220. );
  221. $this->_request->setParams($params);
  222. $expected = $params + $_GET + $_POST;
  223. $received = $this->_request->getParams();
  224. $this->assertSame($params, array_intersect_assoc($params, $received));
  225. }
  226. /**
  227. * @group ZF-3750
  228. */
  229. public function testGetParamsWithGetOrPost()
  230. {
  231. $_GET = array(
  232. 'get' => true
  233. );
  234. $_POST = array(
  235. 'post' => true
  236. );
  237. $this->_request->setParamSources(array('_GET'));
  238. $params = $this->_request->getParams();
  239. $this->assertArrayHasKey('get', $params);
  240. $this->assertArrayNotHasKey('post', $params);
  241. $this->_request->setParamSources(array('_POST'));
  242. $params = $this->_request->getParams();
  243. $this->assertArrayHasKey('post', $params);
  244. $this->assertArrayNotHasKey('get', $params);
  245. }
  246. public function testConstructSetsRequestUri()
  247. {
  248. $_SERVER['REQUEST_URI'] = '/mycontroller/myaction?foo=bar';
  249. $request = new Zend_Controller_Request_Http();
  250. $this->assertEquals('/mycontroller/myaction?foo=bar', $request->getRequestUri());
  251. }
  252. public function testSetRequestUriDoesNotPassUriThroughUrldecode()
  253. {
  254. $request = new Zend_Controller_Request_Http();
  255. $request->setRequestUri('/foo/bar?foo=bar%20baz');
  256. $requestUri = $request->getRequestUri();
  257. $this->assertNotEquals('/foo/bar?foo=bar baz', $requestUri);
  258. $this->assertEquals('/foo/bar?foo=bar%20baz', $requestUri);
  259. }
  260. public function testGetMethod()
  261. {
  262. $_SERVER['REQUEST_METHOD'] = 'POST';
  263. $this->assertEquals('POST', $this->_request->getMethod());
  264. $_SERVER['REQUEST_METHOD'] = 'GET';
  265. $this->assertEquals('GET', $this->_request->getMethod());
  266. }
  267. public function testIsPost()
  268. {
  269. $_SERVER['REQUEST_METHOD'] = 'POST';
  270. $this->assertTrue($this->_request->isPost());
  271. $_SERVER['REQUEST_METHOD'] = 'GET';
  272. $this->assertFalse($this->_request->isPost());
  273. }
  274. public function testIsGet()
  275. {
  276. $_SERVER['REQUEST_METHOD'] = 'GET';
  277. $this->assertTrue($this->_request->isGet());
  278. $this->assertFalse($this->_request->isPost());
  279. }
  280. public function testIsPut()
  281. {
  282. $_SERVER['REQUEST_METHOD'] = 'PUT';
  283. $this->assertTrue($this->_request->isPut());
  284. $this->assertFalse($this->_request->isGet());
  285. }
  286. public function testIsDelete()
  287. {
  288. $_SERVER['REQUEST_METHOD'] = 'DELETE';
  289. $this->assertTrue($this->_request->isDelete());
  290. $this->assertFalse($this->_request->isGet());
  291. }
  292. public function testIsHead()
  293. {
  294. $_SERVER['REQUEST_METHOD'] = 'HEAD';
  295. $this->assertTrue($this->_request->isHead());
  296. $this->assertFalse($this->_request->isGet());
  297. }
  298. public function testIsOptions()
  299. {
  300. $_SERVER['REQUEST_METHOD'] = 'OPTIONS';
  301. $this->assertTrue($this->_request->isOptions());
  302. $this->assertFalse($this->_request->isGet());
  303. }
  304. public function testGetRawBodyReturnsFalseWithNoPost()
  305. {
  306. require_once 'Zend/AllTests/StreamWrapper/PhpInput.php';
  307. Zend_AllTests_StreamWrapper_PhpInput::mockInput('');
  308. $this->assertFalse($this->_request->getRawBody());
  309. stream_wrapper_restore('php');
  310. }
  311. public function testGetQuery()
  312. {
  313. $this->assertEquals('val1', $this->_request->getQuery('var1'));
  314. $this->assertEquals('foo', $this->_request->getQuery('BAR', 'foo'));
  315. $expected = array('var1' => 'val1', 'var2' => 'val2');
  316. $this->assertEquals( $expected, $this->_request->getQuery());
  317. }
  318. public function testGetPost()
  319. {
  320. $_POST['post1'] = 'val1';
  321. $this->assertEquals('val1', $this->_request->getPost('post1'));
  322. $this->assertEquals('foo', $this->_request->getPost('BAR', 'foo'));
  323. $_POST['post2'] = 'val2';
  324. $expected = array('post1' => 'val1', 'post2' => 'val2');
  325. $this->assertEquals($expected, $this->_request->getPost());
  326. }
  327. public function testGetPathInfo()
  328. {
  329. $this->assertEquals('/news/3', $this->_request->getPathInfo(), 'Base URL: ' . var_export($this->_request->getBaseUrl(), 1));
  330. }
  331. public function testSetPathInfo()
  332. {
  333. $this->_request->setPathInfo('/archives/past/4');
  334. $this->assertEquals('/archives/past/4', $this->_request->getPathInfo());
  335. }
  336. public function testPathInfoNeedingBaseUrl()
  337. {
  338. $request = new Zend_Controller_Request_Http('http://localhost/test/index.php/ctrl-name/act-name');
  339. $this->assertEquals('/test/index.php/ctrl-name/act-name', $request->getRequestUri());
  340. $request->setBaseUrl('/test/index.php');
  341. $this->assertEquals('/test/index.php', $request->getBaseUrl());
  342. $requestUri = $request->getRequestUri();
  343. $baseUrl = $request->getBaseUrl();
  344. $pathInfo = substr($requestUri, strlen($baseUrl));
  345. $this->assertTrue($pathInfo ? true : false);
  346. $this->assertEquals('/ctrl-name/act-name', $request->getPathInfo(), "Expected $pathInfo;");
  347. }
  348. public function testGetSetAlias()
  349. {
  350. $this->_request->setAlias('controller', 'var1');
  351. $this->assertEquals('var1', $this->_request->getAlias('controller'));
  352. }
  353. public function testGetAliases()
  354. {
  355. $this->_request->setAlias('controller', 'var1');
  356. $this->_request->setAlias('action', 'var2');
  357. $this->assertSame(array('controller' => 'var1', 'action' => 'var2'), $this->_request->getAliases());
  358. }
  359. public function testGetRequestUri()
  360. {
  361. $this->assertEquals('/news/3?var1=val1&var2=val2', $this->_request->getRequestUri());
  362. }
  363. public function testSetRequestUri()
  364. {
  365. $this->_request->setRequestUri('/archives/past/4?set=this&unset=that');
  366. $this->assertEquals('/archives/past/4?set=this&unset=that', $this->_request->getRequestUri());
  367. $this->assertEquals('this', $this->_request->getQuery('set'));
  368. $this->assertEquals('that', $this->_request->getQuery('unset'));
  369. }
  370. public function testGetBaseUrl()
  371. {
  372. $this->assertSame('', $this->_request->getBaseUrl());
  373. }
  374. /**
  375. * Dataprovider for testing prefix paths in the base url
  376. * @group ZF-10040
  377. */
  378. public function prefixProvider()
  379. {
  380. return array (
  381. array (null),
  382. array ('/public'),
  383. array ('/publicite'),
  384. array ('/foo'),
  385. );
  386. }
  387. /**
  388. * @dataProvider prefixProvider
  389. * @group ZF-10040
  390. */
  391. public function testBaseUrlSetsProperLocation($prefix)
  392. {
  393. $_SERVER['REQUEST_URI'] = $prefix . '/index.php/news/3?var1=val1&var2=val2';
  394. $_SERVER['QUERY_STRING'] = 'var1=val1&var2=val2';
  395. $_SERVER['SCRIPT_NAME'] = $prefix . '/index.php';
  396. $_SERVER['PHP_SELF'] = $prefix . '/index.php/news/3';
  397. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html' . $prefix . '/index.php';
  398. $_GET = array(
  399. 'var1' => 'val1',
  400. 'var2' => 'val2'
  401. );
  402. $request = new Zend_Controller_Request_Http();
  403. if (null !== $prefix) {
  404. $request->setBasePath($prefix);
  405. }
  406. $this->assertEquals($prefix, $request->getBasePath());
  407. $this->assertEquals($prefix . '/index.php', $request->getBaseUrl());
  408. unset ($request);
  409. }
  410. /*
  411. * Tests if an empty string gets returned when no basepath is set on the request.
  412. * This is important on windows, where before this fix '\' was returned instead of an empty string.
  413. * @group ZF-4810
  414. */
  415. public function testGetBasePathIsEmptyStringIfNoneSet()
  416. {
  417. $request = new Zend_Controller_Request_Http();
  418. $this->assertEquals('', $request->getBasePath());
  419. }
  420. public function testSetBaseUrl()
  421. {
  422. $this->_request->setBaseUrl('/news');
  423. $this->assertEquals('/news', $this->_request->getBaseUrl());
  424. }
  425. public function testSetBaseUrlUsingPhpSelf()
  426. {
  427. $_SERVER['REQUEST_URI'] = '/index.php/news/3?var1=val1&var2=val2';
  428. $_SERVER['SCRIPT_NAME'] = '/home.php';
  429. $_SERVER['PHP_SELF'] = '/index.php/news/3';
  430. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  431. $_GET = array(
  432. 'var1' => 'val1',
  433. 'var2' => 'val2'
  434. );
  435. $request = new Zend_Controller_Request_Http();
  436. $this->assertEquals('/index.php', $request->getBaseUrl());
  437. }
  438. public function testSetBaseUrlUsingOrigScriptName()
  439. {
  440. $_SERVER['REQUEST_URI'] = '/index.php/news/3?var1=val1&var2=val2';
  441. $_SERVER['SCRIPT_NAME'] = '/home.php';
  442. $_SERVER['PHP_SELF'] = '/home.php';
  443. $_SERVER['ORIG_SCRIPT_NAME']= '/index.php';
  444. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  445. $_GET = array(
  446. 'var1' => 'val1',
  447. 'var2' => 'val2'
  448. );
  449. $request = new Zend_Controller_Request_Http();
  450. $this->assertEquals('/index.php', $request->getBaseUrl());
  451. }
  452. public function testSetBaseUrlAutoDiscoveryUsingRequestUri()
  453. {
  454. $_SERVER['REQUEST_URI'] = '/index.php/news/3?var1=val1&var2=val2';
  455. $_SERVER['PHP_SELF'] = '/index.php/news/3';
  456. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  457. $_GET = array(
  458. 'var1' => 'val1',
  459. 'var2' => 'val2'
  460. );
  461. $request = new Zend_Controller_Request_Http();
  462. $this->assertEquals('/index.php', $request->getBaseUrl());
  463. }
  464. public function testSetBaseUrlAutoDiscoveryUsingXRewriteUrl()
  465. {
  466. unset($_SERVER['REQUEST_URI']);
  467. $_SERVER['HTTP_X_REWRITE_URL'] = '/index.php/news/3?var1=val1&var2=val2';
  468. $_SERVER['PHP_SELF'] = '/index.php/news/3';
  469. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  470. $_GET = array(
  471. 'var1' => 'val1',
  472. 'var2' => 'val2'
  473. );
  474. $request = new Zend_Controller_Request_Http();
  475. $this->assertEquals('/index.php', $request->getBaseUrl());
  476. }
  477. public function testSetBaseUrlAutoDiscoveryUsingOrigPathInfo()
  478. {
  479. unset($_SERVER['REQUEST_URI']);
  480. $_SERVER['ORIG_PATH_INFO'] = '/index.php/news/3';
  481. $_SERVER['QUERY_STRING'] = 'var1=val1&var2=val2';
  482. $_SERVER['PHP_SELF'] = '/index.php/news/3';
  483. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  484. $_GET = array(
  485. 'var1' => 'val1',
  486. 'var2' => 'val2'
  487. );
  488. $request = new Zend_Controller_Request_Http();
  489. $this->assertEquals('/index.php', $request->getBaseUrl());
  490. }
  491. /**
  492. * @group ZF-7824
  493. */
  494. public function testSetBaseUrlWithScriptNameAsGetParam()
  495. {
  496. $request = new Zend_Controller_Request_Http;
  497. $_SERVER['REQUEST_URI'] = '/article/archive?foo=index.php';
  498. $_SERVER['QUERY_STRING'] = 'foo=index.php';
  499. $_SERVER['SCRIPT_FILENAME'] = '/var/www/zftests/index.php';
  500. $this->assertEquals('/article/archive', $request->getPathInfo());
  501. }
  502. public function testGetSetBasePath()
  503. {
  504. $this->_request->setBasePath('/news');
  505. $this->assertEquals('/news', $this->_request->getBasePath());
  506. }
  507. public function testBasePathAutoDiscovery()
  508. {
  509. $_SERVER['REQUEST_URI'] = '/html/index.php/news/3?var1=val1&var2=val2';
  510. $_SERVER['PHP_SELF'] = '/html/index.php/news/3';
  511. $_SERVER['SCRIPT_FILENAME'] = '/var/web/html/index.php';
  512. $_GET = array(
  513. 'var1' => 'val1',
  514. 'var2' => 'val2'
  515. );
  516. $request = new Zend_Controller_Request_Http();
  517. $this->assertEquals('/html', $request->getBasePath(), $request->getBaseUrl());
  518. }
  519. public function testBasePathAutoDiscoveryWithPhpFile()
  520. {
  521. $_SERVER['REQUEST_URI'] = '/dir/action';
  522. $_SERVER['PHP_SELF'] = '/dir/index.php';
  523. $_SERVER['SCRIPT_FILENAME'] = '/var/web/dir/index.php';
  524. $request = new Zend_Controller_Request_Http();
  525. $this->assertEquals('/dir', $request->getBasePath(), $request->getBaseUrl());
  526. }
  527. public function testGetCookie()
  528. {
  529. $_COOKIE['foo'] = 'bar';
  530. $this->assertSame('bar', $this->_request->getCookie('foo'));
  531. $this->assertEquals('foo', $this->_request->getCookie('BAR', 'foo'));
  532. $this->assertEquals($_COOKIE, $this->_request->getCookie());
  533. }
  534. public function testGetServer()
  535. {
  536. if (isset($_SERVER['REQUEST_METHOD'])) {
  537. $this->assertEquals($_SERVER['REQUEST_METHOD'], $this->_request->getServer('REQUEST_METHOD'));
  538. }
  539. $this->assertEquals('foo', $this->_request->getServer('BAR', 'foo'));
  540. $this->assertEquals($_SERVER, $this->_request->getServer());
  541. }
  542. public function testGetEnv()
  543. {
  544. if (isset($_ENV['PATH'])) {
  545. $this->assertEquals($_ENV['PATH'], $this->_request->getEnv('PATH'));
  546. }
  547. $this->assertEquals('foo', $this->_request->getEnv('BAR', 'foo'));
  548. $this->assertEquals($_ENV, $this->_request->getEnv());
  549. }
  550. public function testGetHeader()
  551. {
  552. $_SERVER['HTTP_ACCEPT_ENCODING'] = 'UTF-8';
  553. $_SERVER['HTTP_CONTENT_TYPE'] = 'text/json';
  554. $this->assertEquals('UTF-8', $this->_request->getHeader('Accept-Encoding'));
  555. $this->assertEquals('text/json', $this->_request->getHeader('Content-Type'));
  556. $this->assertFalse($this->_request->getHeader('X-No-Such-Thing'));
  557. }
  558. public function testGetHeaderThrowsExceptionWithNoInput()
  559. {
  560. try {
  561. // Suppressing warning
  562. $header = @$this->_request->getHeader();
  563. $this->fail('getHeader() should fail with no arguments)');
  564. } catch (Exception $e) {
  565. // success
  566. }
  567. }
  568. public function testIsXmlHttpRequest()
  569. {
  570. $this->assertFalse($this->_request->isXmlHttpRequest());
  571. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
  572. $this->assertTrue($this->_request->isXmlHttpRequest());
  573. }
  574. public function testSetNullParamUnsetsKey()
  575. {
  576. $this->_request->setParam('foo', 'bar');
  577. $this->assertEquals('bar', $this->_request->getParam('foo'));
  578. $this->_request->setParam('foo', null);
  579. $params = $this->_request->getParams();
  580. $this->assertFalse(isset($params['foo']));
  581. }
  582. public function testSetNullParamsUnsetsKeys()
  583. {
  584. $this->_request->setParams(array('foo' => 'bar', 'bar' => 'baz'));
  585. $this->assertEquals('bar', $this->_request->getParam('foo'));
  586. $this->assertEquals('baz', $this->_request->getParam('bar'));
  587. $this->_request->setParams(array('foo' => null));
  588. $params = $this->_request->getParams();
  589. $this->assertFalse(isset($params['foo']));
  590. $this->assertTrue(isset($params['bar']));
  591. }
  592. public function testGetAliasedParamZF2455()
  593. {
  594. $this->_request->setParam('controller', 'value');
  595. $this->_request->setAlias('var1', 'controller');
  596. $this->assertEquals('value', $this->_request->getParam('controller'));
  597. $this->assertEquals('value', $this->_request->getParam('var1'));
  598. }
  599. public function testCanDetectFlashRequests()
  600. {
  601. $this->assertFalse($this->_request->isFlashRequest());
  602. $_SERVER['HTTP_USER_AGENT'] = 'Shockwave Flash';
  603. $this->assertTrue($this->_request->isFlashRequest());
  604. $_SERVER['HTTP_USER_AGENT'] = 'Adobe Flash Player 10';
  605. $this->assertTrue($this->_request->isFlashRequest());
  606. }
  607. /**
  608. * @group ZF-1798
  609. */
  610. public function testGetAndPostBothInDefaultParamSources()
  611. {
  612. $this->assertEquals(array('_GET', '_POST'), $this->_request->getParamSources());
  613. }
  614. /**
  615. * @group ZF-1798
  616. */
  617. public function testCanSetParamSources()
  618. {
  619. $this->testGetAndPostBothInDefaultParamSources();
  620. $this->_request->setParamSources(array());
  621. $this->assertSame(array(), $this->_request->getParamSources());
  622. $this->_request->setParamSources(array('_GET'));
  623. $this->assertSame(array('_GET'), $this->_request->getParamSources());
  624. }
  625. /**
  626. * @group ZF-1798
  627. */
  628. public function testParamSourcesHonoredByGetParam()
  629. {
  630. $_GET = array('foo' => 'bar');
  631. $_POST = array('foo' => 'baz');
  632. $this->_request->setParamSources(array('_POST'));
  633. $this->assertEquals('baz', $this->_request->getParam('foo'));
  634. }
  635. /**
  636. * @group ZF-3161
  637. * @group ZFI-233
  638. * @group ZF-5818
  639. */
  640. public function testStrippingHttpProtocolAndHostFromRequestUriOnlyWhenPresentAtBeginningOfUri()
  641. {
  642. $_SERVER['REQUEST_URI'] = 'http://foo.example.com/foo/bar?r=http://foo.example.com/bar/baz';
  643. $_SERVER['HTTP_HOST'] = 'foo.example.com';
  644. $request = new Zend_Controller_Request_Http();
  645. $test = $request->getRequestUri();
  646. $this->assertEquals('/foo/bar?r=http://foo.example.com/bar/baz', $test);
  647. $_SERVER['REQUEST_URI'] = '/foo/bar?r=http://foo.example.com/bar/baz';
  648. $_SERVER['HTTP_HOST'] = 'foo.example.com';
  649. $request = new Zend_Controller_Request_Http();
  650. $test = $request->getRequestUri();
  651. $this->assertEquals('/foo/bar?r=http://foo.example.com/bar/baz', $test);
  652. }
  653. /**
  654. * @group ZF-3161
  655. * @group ZFI-233
  656. * @group ZF-5818
  657. */
  658. public function testStrippingHttpsProtocolAndHostFromRequestUriOnlyWhenPresentAtBeginningOfUri()
  659. {
  660. $_SERVER['REQUEST_URI'] = 'https://foo.example.com/foo/bar?r=https://foo.example.com/bar/baz';
  661. $_SERVER['HTTP_HOST'] = 'foo.example.com';
  662. $_SERVER['HTTPS'] = 'on';
  663. $request = new Zend_Controller_Request_Http();
  664. $test = $request->getRequestUri();
  665. $this->assertEquals('/foo/bar?r=https://foo.example.com/bar/baz', $test);
  666. $_SERVER['REQUEST_URI'] = '/foo/bar?r=https://foo.example.com/bar/baz';
  667. $_SERVER['HTTP_HOST'] = 'foo.example.com';
  668. $_SERVER['HTTPS'] = 'on';
  669. $request = new Zend_Controller_Request_Http();
  670. $test = $request->getRequestUri();
  671. $this->assertEquals('/foo/bar?r=https://foo.example.com/bar/baz', $test);
  672. }
  673. /**
  674. * @group ZF-3161
  675. * @group ZFI-233
  676. * @group ZF-5818
  677. */
  678. public function testStrippingHttpProtocolHostAndNonStandardPortFromRequestUriOnlyWhenPresentAtBeginningOfUri()
  679. {
  680. $_SERVER['REQUEST_URI'] = 'http://foo.example.com:8888/foo/bar?r=http://foo.example.com:8888/bar/baz';
  681. $_SERVER['HTTP_HOST'] = '';
  682. $_SERVER['SERVER_NAME'] = 'foo.example.com';
  683. $_SERVER['SERVER_PORT'] = '8888';
  684. $request = new Zend_Controller_Request_Http();
  685. $test = $request->getRequestUri();
  686. $this->assertEquals('/foo/bar?r=http://foo.example.com:8888/bar/baz', $test);
  687. $_SERVER['REQUEST_URI'] = '/foo/bar?r=https://foo.example.com:8888/bar/baz';
  688. $_SERVER['HTTP_HOST'] = '';
  689. $_SERVER['SERVER_NAME'] = 'foo.example.com';
  690. $_SERVER['SERVER_PORT'] = '8888';
  691. $request = new Zend_Controller_Request_Http();
  692. $test = $request->getRequestUri();
  693. $this->assertEquals('/foo/bar?r=https://foo.example.com:8888/bar/baz', $test);
  694. }
  695. /**
  696. * @group ZF-7092
  697. */
  698. public function testGetClientIp()
  699. {
  700. $request = new Zend_Controller_Request_Http();
  701. $_SERVER['HTTP_CLIENT_IP'] = '192.168.1.10';
  702. $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.1.11';
  703. $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
  704. $this->assertEquals('192.168.1.10', $request->getClientIp());
  705. $_SERVER['HTTP_CLIENT_IP'] = '';
  706. $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.1.11';
  707. $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
  708. $this->assertEquals('192.168.1.11', $request->getClientIp());
  709. $_SERVER['HTTP_CLIENT_IP'] = '';
  710. $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
  711. $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
  712. $this->assertEquals('192.168.1.12', $request->getClientIp());
  713. }
  714. /**
  715. * @group ZF-7117
  716. */
  717. public function testGetClientIpNoProxyCheck()
  718. {
  719. $request = new Zend_Controller_Request_Http();
  720. $_SERVER['HTTP_CLIENT_IP'] = '192.168.1.10';
  721. $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.1.11';
  722. $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
  723. $this->assertEquals('192.168.1.12', $request->getClientIp(false));
  724. }
  725. /**
  726. * @group ZF-7756
  727. */
  728. public function testCallingGetRawBodyMultipleTimesShouldReturnSameValue()
  729. {
  730. require_once 'Zend/AllTests/StreamWrapper/PhpInput.php';
  731. Zend_AllTests_StreamWrapper_PhpInput::mockInput('foobar');
  732. $request = new Zend_Controller_Request_Http();
  733. $first = $request->getRawBody();
  734. $this->assertSame($first, $request->getRawBody());
  735. stream_wrapper_restore('php');
  736. }
  737. /**
  738. * @group ZF-5107
  739. */
  740. public function testGetParamsShouldHonorParamSourcesSetting()
  741. {
  742. $_GET = array('foo' => 'bar');
  743. $_POST = array('foo' => 'baz');
  744. $this->_request->setParamSources(array('_POST'));
  745. $params = $this->_request->getParams();
  746. $this->assertEquals(array('foo' => 'baz'), $params);
  747. }
  748. /**
  749. * @group ZF-9091
  750. */
  751. public function testSetPathInfoShouldNotStripBaseUrlIfBaseUrlNotInRequestUri()
  752. {
  753. $request = new Zend_Controller_Request_Http();
  754. $request->setBaseUrl('/app');
  755. $_SERVER['REQUEST_URI'] = '/index/index';
  756. $pathInfo = $request->getPathInfo();
  757. $this->assertEquals('/index/index', $pathInfo);
  758. }
  759. /**
  760. * @group ZF-10577
  761. */
  762. public function testGetHeaderWithEmptyValueReturnsEmptyString()
  763. {
  764. $_SERVER['HTTP_X_FOO'] = '';
  765. $this->assertSame('', $this->_request->getHeader('X-Foo'));
  766. }
  767. /**
  768. * @group ZF-3527
  769. */
  770. public function testGetRequestUriShouldReturnDecodedUri()
  771. {
  772. $request = new Zend_Controller_Request_Http();
  773. $request->setBaseUrl( '%7Euser' );
  774. $this->assertEquals( '~user', $request->getBaseUrl() );
  775. }
  776. /**
  777. * @group ZF-3527
  778. */
  779. public function testPathInfoShouldRespectEncodedBaseUrl()
  780. {
  781. $request = new Zend_Controller_Request_Http();
  782. $request->setBaseUrl( '%7Euser' );
  783. $_SERVER['REQUEST_URI'] = '~user/module/controller/action';
  784. $pathInfo = $request->getPathInfo();
  785. $this->assertEquals( '/module/controller/action', $pathInfo, $pathInfo);
  786. }
  787. /**
  788. * @group ZF-3527
  789. */
  790. public function testPathInfoShouldRespectNonEncodedBaseUrl()
  791. {
  792. $request = new Zend_Controller_Request_Http();
  793. $request->setBaseUrl( '~user' );
  794. $_SERVER['REQUEST_URI'] = '~user/module/controller/action';
  795. $pathInfo = $request->getPathInfo();
  796. $this->assertEquals( '/module/controller/action', $pathInfo, $pathInfo);
  797. }
  798. /**
  799. * @group ZF-3527
  800. */
  801. public function testPathInfoShouldRespectEncodedRequestUri()
  802. {
  803. $request = new Zend_Controller_Request_Http();
  804. $request->setBaseUrl( '~user' );
  805. $_SERVER['REQUEST_URI'] = '%7Euser/module/controller/action';
  806. $pathInfo = $request->getPathInfo();
  807. $this->assertEquals( '/module/controller/action', $pathInfo, $pathInfo);
  808. }
  809. /**
  810. * @group ZF-3527
  811. */
  812. public function testPathInfoShouldRespectNonEncodedRequestUri()
  813. {
  814. $request = new Zend_Controller_Request_Http();
  815. $request->setBaseUrl( '~user' );
  816. $_SERVER['REQUEST_URI'] = '~user/module/controller/action';
  817. $pathInfo = $request->getPathInfo();
  818. $this->assertEquals( '/module/controller/action', $pathInfo, $pathInfo);
  819. }
  820. /**
  821. * @group ZF-9899
  822. */
  823. public function testHostNameShouldBeEmpty()
  824. {
  825. $request = new Zend_Controller_Request_Http();
  826. $this->assertEquals('', $request->getHttpHost(), 'HttpHost should be :');
  827. }
  828. }
  829. // Call Zend_Controller_Request_HttpTest::main() if this source file is executed directly.
  830. if (PHPUnit_MAIN_METHOD == "Zend_Controller_Request_HttpTest::main") {
  831. Zend_Controller_Request_HttpTest::main();
  832. }