application = $application; } /** * @param ResponseCollector $responseCollector */ public function setResponseCollector(ResponseCollector $responseCollector) { $this->responseCollector = $responseCollector; } /** * @param Request $request * * @return Response * @throws \Exception */ public function doRequest($request) { $inputStream = fopen('php://memory', 'r+'); $content = $request->getContent(); if ($content !== null) { fwrite($inputStream, $content); rewind($inputStream); } $queryParams = []; $postParams = []; $queryString = parse_url($request->getUri(), PHP_URL_QUERY); if ($queryString != '') { parse_str($queryString, $queryParams); } if ($request->getMethod() !== 'GET') { $postParams = $request->getParameters(); } $serverParams = $request->getServer(); if (!isset($serverParams['SCRIPT_NAME'])) { //required by WhoopsErrorHandler $serverParams['SCRIPT_NAME'] = 'Codeception'; } $zendRequest = new ServerRequest( $serverParams, $this->convertFiles($request->getFiles()), $request->getUri(), $request->getMethod(), $inputStream, $this->extractHeaders($request) ); $zendRequest = $zendRequest->withCookieParams($request->getCookies()) ->withQueryParams($queryParams) ->withParsedBody($postParams); $cwd = getcwd(); chdir(codecept_root_dir()); $this->application->run($zendRequest); chdir($cwd); $this->request = $zendRequest; $response = $this->responseCollector->getResponse(); $this->responseCollector->clearResponse(); return new Response( $response->getBody(), $response->getStatusCode(), $response->getHeaders() ); } private function convertFiles(array $files) { $fileObjects = []; foreach ($files as $fieldName => $file) { if ($file instanceof UploadedFile) { $fileObjects[$fieldName] = $file; } elseif (!isset($file['tmp_name']) && !isset($file['name'])) { $fileObjects[$fieldName] = $this->convertFiles($file); } else { $fileObjects[$fieldName] = new UploadedFile( $file['tmp_name'], $file['size'], $file['error'], $file['name'], $file['type'] ); } } return $fileObjects; } private function extractHeaders(BrowserKitRequest $request) { $headers = []; $server = $request->getServer(); $contentHeaders = ['Content-Length' => true, 'Content-Md5' => true, 'Content-Type' => true]; foreach ($server as $header => $val) { $header = html_entity_decode(implode('-', array_map('ucfirst', explode('-', strtolower(str_replace('_', '-', $header))))), ENT_NOQUOTES); if (strpos($header, 'Http-') === 0) { $headers[substr($header, 5)] = $val; } elseif (isset($contentHeaders[$header])) { $headers[$header] = $val; } } return $headers; } }