Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

InlineFragmentRendererTest.php 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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\Component\HttpKernel\Tests\Fragment;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\EventDispatcher\EventDispatcher;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Controller\ControllerReference;
  17. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  18. use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
  19. use Symfony\Component\HttpKernel\HttpKernel;
  20. use Symfony\Component\HttpKernel\KernelEvents;
  21. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  22. class InlineFragmentRendererTest extends TestCase
  23. {
  24. public function testRender()
  25. {
  26. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  27. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  28. }
  29. public function testRenderWithControllerReference()
  30. {
  31. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  32. $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', [], []), Request::create('/'))->getContent());
  33. }
  34. public function testRenderWithObjectsAsAttributes()
  35. {
  36. $object = new \stdClass();
  37. $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
  38. $subRequest->attributes->replace(['object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en']);
  39. $subRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  40. $subRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  41. $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  42. $subRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  43. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
  44. $this->assertSame('foo', $strategy->render(new ControllerReference('main_controller', ['object' => $object], []), Request::create('/'))->getContent());
  45. }
  46. public function testRenderWithTrustedHeaderDisabled()
  47. {
  48. Request::setTrustedProxies([], 0);
  49. $expectedSubRequest = Request::create('/');
  50. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  51. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  52. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  53. $this->assertSame('foo', $strategy->render('/', Request::create('/'))->getContent());
  54. Request::setTrustedProxies([], -1);
  55. }
  56. /**
  57. * @expectedException \RuntimeException
  58. */
  59. public function testRenderExceptionNoIgnoreErrors()
  60. {
  61. $dispatcher = $this->getMockBuilder(EventDispatcherInterface::class)->getMock();
  62. $dispatcher->expects($this->never())->method('dispatch');
  63. $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
  64. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  65. }
  66. public function testRenderExceptionIgnoreErrors()
  67. {
  68. $exception = new \RuntimeException('foo');
  69. $kernel = $this->getKernel($this->throwException($exception));
  70. $request = Request::create('/');
  71. $expectedEvent = new ExceptionEvent($kernel, $request, $kernel::SUB_REQUEST, $exception);
  72. $dispatcher = $this->getMockBuilder(EventDispatcherInterface::class)->getMock();
  73. $dispatcher->expects($this->once())->method('dispatch')->with($expectedEvent, KernelEvents::EXCEPTION);
  74. $strategy = new InlineFragmentRenderer($kernel, $dispatcher);
  75. $this->assertEmpty($strategy->render('/', $request, ['ignore_errors' => true])->getContent());
  76. }
  77. public function testRenderExceptionIgnoreErrorsWithAlt()
  78. {
  79. $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
  80. $this->throwException(new \RuntimeException('foo')),
  81. $this->returnValue(new Response('bar'))
  82. )));
  83. $this->assertEquals('bar', $strategy->render('/', Request::create('/'), ['ignore_errors' => true, 'alt' => '/foo'])->getContent());
  84. }
  85. private function getKernel($returnValue)
  86. {
  87. $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
  88. $kernel
  89. ->expects($this->any())
  90. ->method('handle')
  91. ->will($returnValue)
  92. ;
  93. return $kernel;
  94. }
  95. public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
  96. {
  97. $controllerResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
  98. $controllerResolver
  99. ->expects($this->once())
  100. ->method('getController')
  101. ->willReturn(function () {
  102. ob_start();
  103. echo 'bar';
  104. throw new \RuntimeException();
  105. })
  106. ;
  107. $argumentResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface')->getMock();
  108. $argumentResolver
  109. ->expects($this->once())
  110. ->method('getArguments')
  111. ->willReturn([])
  112. ;
  113. $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
  114. $renderer = new InlineFragmentRenderer($kernel);
  115. // simulate a main request with output buffering
  116. ob_start();
  117. echo 'Foo';
  118. // simulate a sub-request with output buffering and an exception
  119. $renderer->render('/', Request::create('/'), ['ignore_errors' => true]);
  120. $this->assertEquals('Foo', ob_get_clean());
  121. }
  122. public function testLocaleAndFormatAreIsKeptInSubrequest()
  123. {
  124. $expectedSubRequest = Request::create('/');
  125. $expectedSubRequest->attributes->set('_format', 'foo');
  126. $expectedSubRequest->setLocale('fr');
  127. if (Request::HEADER_X_FORWARDED_FOR & Request::getTrustedHeaderSet()) {
  128. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  129. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  130. }
  131. $expectedSubRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  132. $expectedSubRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  133. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  134. $request = Request::create('/');
  135. $request->attributes->set('_format', 'foo');
  136. $request->setLocale('fr');
  137. $strategy->render('/', $request);
  138. }
  139. public function testESIHeaderIsKeptInSubrequest()
  140. {
  141. $expectedSubRequest = Request::create('/');
  142. $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  143. if (Request::HEADER_X_FORWARDED_FOR & Request::getTrustedHeaderSet()) {
  144. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  145. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  146. }
  147. $expectedSubRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  148. $expectedSubRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  149. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  150. $request = Request::create('/');
  151. $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  152. $strategy->render('/', $request);
  153. }
  154. public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
  155. {
  156. Request::setTrustedProxies([], Request::HEADER_FORWARDED);
  157. $this->testESIHeaderIsKeptInSubrequest();
  158. Request::setTrustedProxies([], -1);
  159. }
  160. public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
  161. {
  162. $expectedSubRequest = Request::create('/');
  163. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  164. $expectedSubRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  165. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  166. $expectedSubRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  167. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  168. $request = Request::create('/', 'GET', [], [], [], ['HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*']);
  169. $strategy->render('/', $request);
  170. }
  171. public function testFirstTrustedProxyIsSetAsRemote()
  172. {
  173. Request::setTrustedProxies(['1.1.1.1'], -1);
  174. $expectedSubRequest = Request::create('/');
  175. $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  176. $expectedSubRequest->server->set('REMOTE_ADDR', '127.0.0.1');
  177. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  178. $expectedSubRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  179. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  180. $expectedSubRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  181. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  182. $request = Request::create('/');
  183. $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  184. $strategy->render('/', $request);
  185. Request::setTrustedProxies([], -1);
  186. }
  187. public function testIpAddressOfRangedTrustedProxyIsSetAsRemote()
  188. {
  189. $expectedSubRequest = Request::create('/');
  190. $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  191. $expectedSubRequest->server->set('REMOTE_ADDR', '127.0.0.1');
  192. $expectedSubRequest->headers->set('x-forwarded-for', ['127.0.0.1']);
  193. $expectedSubRequest->headers->set('forwarded', ['for="127.0.0.1";host="localhost";proto=http']);
  194. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  195. $expectedSubRequest->server->set('HTTP_FORWARDED', 'for="127.0.0.1";host="localhost";proto=http');
  196. Request::setTrustedProxies(['1.1.1.1/24'], -1);
  197. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  198. $request = Request::create('/');
  199. $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  200. $strategy->render('/', $request);
  201. Request::setTrustedProxies([], -1);
  202. }
  203. /**
  204. * Creates a Kernel expecting a request equals to $request
  205. * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
  206. */
  207. private function getKernelExpectingRequest(Request $request, $strict = false)
  208. {
  209. $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
  210. $kernel
  211. ->expects($this->once())
  212. ->method('handle')
  213. ->with($this->equalTo($request, 1))
  214. ->willReturn(new Response('foo'));
  215. return $kernel;
  216. }
  217. }
  218. class Bar
  219. {
  220. public $bar = 'bar';
  221. public function getBar()
  222. {
  223. return $this->bar;
  224. }
  225. }