annotate vendor/symfony/http-kernel/Client.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
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@0 15 use Symfony\Component\BrowserKit\Request as DomRequest;
Chris@0 16 use Symfony\Component\BrowserKit\Response as DomResponse;
Chris@0 17 use Symfony\Component\BrowserKit\History;
Chris@0 18 use Symfony\Component\BrowserKit\CookieJar;
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@0 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@0 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@0 42 public function __construct(HttpKernelInterface $kernel, array $server = array(), 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@0 52 * Sets whether to catch exceptions when the kernel is handling a request.
Chris@0 53 *
Chris@0 54 * @param bool $catchExceptions Whether to catch exceptions
Chris@0 55 */
Chris@0 56 public function catchExceptions($catchExceptions)
Chris@0 57 {
Chris@0 58 $this->catchExceptions = $catchExceptions;
Chris@0 59 }
Chris@0 60
Chris@0 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@0 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@0 84 $kernel = str_replace("'", "\\'", serialize($this->kernel));
Chris@0 85 $request = str_replace("'", "\\'", serialize($request));
Chris@0 86 $errorReporting = error_reporting();
Chris@0 87
Chris@0 88 $requires = '';
Chris@0 89 foreach (get_declared_classes() as $class) {
Chris@0 90 if (0 === strpos($class, 'ComposerAutoloaderInit')) {
Chris@0 91 $r = new \ReflectionClass($class);
Chris@0 92 $file = dirname(dirname($r->getFileName())).'/autoload.php';
Chris@0 93 if (file_exists($file)) {
Chris@0 94 $requires .= "require_once '".str_replace("'", "\\'", $file)."';\n";
Chris@0 95 }
Chris@0 96 }
Chris@0 97 }
Chris@0 98
Chris@0 99 if (!$requires) {
Chris@0 100 throw new \RuntimeException('Composer autoloader not found.');
Chris@0 101 }
Chris@0 102
Chris@0 103 $code = <<<EOF
Chris@0 104 <?php
Chris@0 105
Chris@0 106 error_reporting($errorReporting);
Chris@0 107
Chris@0 108 $requires
Chris@0 109
Chris@0 110 \$kernel = unserialize('$kernel');
Chris@0 111 \$request = unserialize('$request');
Chris@0 112 EOF;
Chris@0 113
Chris@0 114 return $code.$this->getHandleScript();
Chris@0 115 }
Chris@0 116
Chris@0 117 protected function getHandleScript()
Chris@0 118 {
Chris@0 119 return <<<'EOF'
Chris@0 120 $response = $kernel->handle($request);
Chris@0 121
Chris@0 122 if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) {
Chris@0 123 $kernel->terminate($request, $response);
Chris@0 124 }
Chris@0 125
Chris@0 126 echo serialize($response);
Chris@0 127 EOF;
Chris@0 128 }
Chris@0 129
Chris@0 130 /**
Chris@0 131 * Converts the BrowserKit request to a HttpKernel request.
Chris@0 132 *
Chris@0 133 * @return Request A Request instance
Chris@0 134 */
Chris@0 135 protected function filterRequest(DomRequest $request)
Chris@0 136 {
Chris@0 137 $httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $request->getServer(), $request->getContent());
Chris@0 138
Chris@0 139 foreach ($this->filterFiles($httpRequest->files->all()) as $key => $value) {
Chris@0 140 $httpRequest->files->set($key, $value);
Chris@0 141 }
Chris@0 142
Chris@0 143 return $httpRequest;
Chris@0 144 }
Chris@0 145
Chris@0 146 /**
Chris@0 147 * Filters an array of files.
Chris@0 148 *
Chris@0 149 * This method created test instances of UploadedFile so that the move()
Chris@0 150 * method can be called on those instances.
Chris@0 151 *
Chris@0 152 * If the size of a file is greater than the allowed size (from php.ini) then
Chris@0 153 * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE.
Chris@0 154 *
Chris@0 155 * @see UploadedFile
Chris@0 156 *
Chris@0 157 * @return array An array with all uploaded files marked as already moved
Chris@0 158 */
Chris@0 159 protected function filterFiles(array $files)
Chris@0 160 {
Chris@0 161 $filtered = array();
Chris@0 162 foreach ($files as $key => $value) {
Chris@0 163 if (is_array($value)) {
Chris@0 164 $filtered[$key] = $this->filterFiles($value);
Chris@0 165 } elseif ($value instanceof UploadedFile) {
Chris@0 166 if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) {
Chris@0 167 $filtered[$key] = new UploadedFile(
Chris@0 168 '',
Chris@0 169 $value->getClientOriginalName(),
Chris@0 170 $value->getClientMimeType(),
Chris@0 171 0,
Chris@0 172 UPLOAD_ERR_INI_SIZE,
Chris@0 173 true
Chris@0 174 );
Chris@0 175 } else {
Chris@0 176 $filtered[$key] = new UploadedFile(
Chris@0 177 $value->getPathname(),
Chris@0 178 $value->getClientOriginalName(),
Chris@0 179 $value->getClientMimeType(),
Chris@0 180 $value->getClientSize(),
Chris@0 181 $value->getError(),
Chris@0 182 true
Chris@0 183 );
Chris@0 184 }
Chris@0 185 }
Chris@0 186 }
Chris@0 187
Chris@0 188 return $filtered;
Chris@0 189 }
Chris@0 190
Chris@0 191 /**
Chris@0 192 * Converts the HttpKernel response to a BrowserKit response.
Chris@0 193 *
Chris@0 194 * @return DomResponse A DomResponse instance
Chris@0 195 */
Chris@0 196 protected function filterResponse($response)
Chris@0 197 {
Chris@0 198 // this is needed to support StreamedResponse
Chris@0 199 ob_start();
Chris@0 200 $response->sendContent();
Chris@0 201 $content = ob_get_clean();
Chris@0 202
Chris@0 203 return new DomResponse($content, $response->getStatusCode(), $response->headers->all());
Chris@0 204 }
Chris@0 205 }