HttpTest.php 32 KB

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