annotate vendor/symfony/http-kernel/Client.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\HttpKernel;
Chris@0 13
Chris@0 14 use Symfony\Component\BrowserKit\Client as BaseClient;
Chris@17 15 use Symfony\Component\BrowserKit\CookieJar;
Chris@17 16 use Symfony\Component\BrowserKit\History;
Chris@0 17 use Symfony\Component\BrowserKit\Request as DomRequest;
Chris@0 18 use Symfony\Component\BrowserKit\Response as DomResponse;
Chris@0 19 use Symfony\Component\HttpFoundation\File\UploadedFile;
Chris@0 20 use Symfony\Component\HttpFoundation\Request;
Chris@0 21 use Symfony\Component\HttpFoundation\Response;
Chris@0 22
Chris@0 23 /**
Chris@0 24 * Client simulates a browser and makes requests to a Kernel object.
Chris@0 25 *
Chris@0 26 * @author Fabien Potencier <fabien@symfony.com>
Chris@0 27 *
Chris@14 28 * @method Request|null getRequest() A Request instance
Chris@0 29 * @method Response|null getResponse() A Response instance
Chris@0 30 */
Chris@0 31 class Client extends BaseClient
Chris@0 32 {
Chris@0 33 protected $kernel;
Chris@14 34 private $catchExceptions = true;
Chris@0 35
Chris@0 36 /**
Chris@0 37 * @param HttpKernelInterface $kernel An HttpKernel instance
Chris@0 38 * @param array $server The server parameters (equivalent of $_SERVER)
Chris@0 39 * @param History $history A History instance to store the browser history
Chris@0 40 * @param CookieJar $cookieJar A CookieJar instance to store the cookies
Chris@0 41 */
Chris@17 42 public function __construct(HttpKernelInterface $kernel, array $server = [], History $history = null, CookieJar $cookieJar = null)
Chris@0 43 {
Chris@0 44 // These class properties must be set before calling the parent constructor, as it may depend on it.
Chris@0 45 $this->kernel = $kernel;
Chris@0 46 $this->followRedirects = false;
Chris@0 47
Chris@0 48 parent::__construct($server, $history, $cookieJar);
Chris@0 49 }
Chris@0 50
Chris@0 51 /**
Chris@14 52 * Sets whether to catch exceptions when the kernel is handling a request.
Chris@14 53 *
Chris@14 54 * @param bool $catchExceptions Whether to catch exceptions
Chris@14 55 */
Chris@14 56 public function catchExceptions($catchExceptions)
Chris@14 57 {
Chris@14 58 $this->catchExceptions = $catchExceptions;
Chris@14 59 }
Chris@14 60
Chris@14 61 /**
Chris@0 62 * Makes a request.
Chris@0 63 *
Chris@0 64 * @return Response A Response instance
Chris@0 65 */
Chris@0 66 protected function doRequest($request)
Chris@0 67 {
Chris@14 68 $response = $this->kernel->handle($request, HttpKernelInterface::MASTER_REQUEST, $this->catchExceptions);
Chris@0 69
Chris@0 70 if ($this->kernel instanceof TerminableInterface) {
Chris@0 71 $this->kernel->terminate($request, $response);
Chris@0 72 }
Chris@0 73
Chris@0 74 return $response;
Chris@0 75 }
Chris@0 76
Chris@0 77 /**
Chris@0 78 * Returns the script to execute when the request must be insulated.
Chris@0 79 *
Chris@0 80 * @return string
Chris@0 81 */
Chris@0 82 protected function getScript($request)
Chris@0 83 {
Chris@17 84 $kernel = var_export(serialize($this->kernel), true);
Chris@17 85 $request = var_export(serialize($request), true);
Chris@17 86
Chris@14 87 $errorReporting = error_reporting();
Chris@0 88
Chris@14 89 $requires = '';
Chris@14 90 foreach (get_declared_classes() as $class) {
Chris@14 91 if (0 === strpos($class, 'ComposerAutoloaderInit')) {
Chris@14 92 $r = new \ReflectionClass($class);
Chris@17 93 $file = \dirname(\dirname($r->getFileName())).'/autoload.php';
Chris@14 94 if (file_exists($file)) {
Chris@17 95 $requires .= 'require_once '.var_export($file, true).";\n";
Chris@14 96 }
Chris@14 97 }
Chris@14 98 }
Chris@14 99
Chris@14 100 if (!$requires) {
Chris@14 101 throw new \RuntimeException('Composer autoloader not found.');
Chris@14 102 }
Chris@0 103
Chris@0 104 $code = <<<EOF
Chris@0 105 <?php
Chris@0 106
Chris@0 107 error_reporting($errorReporting);
Chris@0 108
Chris@14 109 $requires
Chris@0 110
Chris@17 111 \$kernel = unserialize($kernel);
Chris@17 112 \$request = unserialize($request);
Chris@0 113 EOF;
Chris@0 114
Chris@0 115 return $code.$this->getHandleScript();
Chris@0 116 }
Chris@0 117
Chris@0 118 protected function getHandleScript()
Chris@0 119 {
Chris@0 120 return <<<'EOF'
Chris@0 121 $response = $kernel->handle($request);
Chris@0 122
Chris@0 123 if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) {
Chris@0 124 $kernel->terminate($request, $response);
Chris@0 125 }
Chris@0 126
Chris@0 127 echo serialize($response);
Chris@0 128 EOF;
Chris@0 129 }
Chris@0 130
Chris@0 131 /**
Chris@0 132 * Converts the BrowserKit request to a HttpKernel request.
Chris@0 133 *
Chris@0 134 * @return Request A Request instance
Chris@0 135 */
Chris@0 136 protected function filterRequest(DomRequest $request)
Chris@0 137 {
Chris@0 138 $httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $request->getServer(), $request->getContent());
Chris@0 139
Chris@0 140 foreach ($this->filterFiles($httpRequest->files->all()) as $key => $value) {
Chris@0 141 $httpRequest->files->set($key, $value);
Chris@0 142 }
Chris@0 143
Chris@0 144 return $httpRequest;
Chris@0 145 }
Chris@0 146
Chris@0 147 /**
Chris@0 148 * Filters an array of files.
Chris@0 149 *
Chris@0 150 * This method created test instances of UploadedFile so that the move()
Chris@0 151 * method can be called on those instances.
Chris@0 152 *
Chris@0 153 * If the size of a file is greater than the allowed size (from php.ini) then
Chris@0 154 * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE.
Chris@0 155 *
Chris@0 156 * @see UploadedFile
Chris@0 157 *
Chris@0 158 * @return array An array with all uploaded files marked as already moved
Chris@0 159 */
Chris@0 160 protected function filterFiles(array $files)
Chris@0 161 {
Chris@17 162 $filtered = [];
Chris@0 163 foreach ($files as $key => $value) {
Chris@17 164 if (\is_array($value)) {
Chris@0 165 $filtered[$key] = $this->filterFiles($value);
Chris@0 166 } elseif ($value instanceof UploadedFile) {
Chris@0 167 if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) {
Chris@0 168 $filtered[$key] = new UploadedFile(
Chris@0 169 '',
Chris@0 170 $value->getClientOriginalName(),
Chris@0 171 $value->getClientMimeType(),
Chris@0 172 0,
Chris@0 173 UPLOAD_ERR_INI_SIZE,
Chris@0 174 true
Chris@0 175 );
Chris@0 176 } else {
Chris@0 177 $filtered[$key] = new UploadedFile(
Chris@0 178 $value->getPathname(),
Chris@0 179 $value->getClientOriginalName(),
Chris@0 180 $value->getClientMimeType(),
Chris@0 181 $value->getClientSize(),
Chris@0 182 $value->getError(),
Chris@0 183 true
Chris@0 184 );
Chris@0 185 }
Chris@0 186 }
Chris@0 187 }
Chris@0 188
Chris@0 189 return $filtered;
Chris@0 190 }
Chris@0 191
Chris@0 192 /**
Chris@0 193 * Converts the HttpKernel response to a BrowserKit response.
Chris@0 194 *
Chris@0 195 * @return DomResponse A DomResponse instance
Chris@0 196 */
Chris@0 197 protected function filterResponse($response)
Chris@0 198 {
Chris@0 199 // this is needed to support StreamedResponse
Chris@0 200 ob_start();
Chris@0 201 $response->sendContent();
Chris@0 202 $content = ob_get_clean();
Chris@0 203
Chris@14 204 return new DomResponse($content, $response->getStatusCode(), $response->headers->all());
Chris@0 205 }
Chris@0 206 }