private function buildFileBag(ReactRequest $request) { $files = []; foreach ($request->getFiles() as $file) { $path = tempnam(sys_get_temp_dir(), "php"); $result = file_put_contents($path, $file['stream']); $error = $result === false ? UPLOAD_ERR_NO_FILE : UPLOAD_ERR_OK; $files[] = new UploadedFile($path, $file['name'], $file['type'], filesize($path), $error); } return $files; }
/** * Manages a request, made to the Http server. * * @param \React\Http\Request $request * @param \React\Http\Response $response */ public function manageRequest($request, $response) { $requestData = [$request->getHeaders()['Host'] . $request->getPath(), $request->getMethod(), array_merge($request->getQuery(), $request->getPost()), [], $request->getFiles(), []]; $contentType = isset($request->getHeaders()['Content-Type']) ? $request->getHeaders()['Content-Type'] : 'application/x-www-form-urlencoded'; if (strtolower($contentType) == 'application/x-www-form-urlencoded') { $requestData[] = http_build_query($request->getPost()); } else { $requestData[] = $request->getBody(); } //Creates the Symfony Request from the React Request. $sRequest = Request::create(...$requestData); /** @var Response $sResponse */ $sResponse = $this->kernel->handle($sRequest); $response->writeHead($sResponse->getStatusCode()); $response->end($sResponse->getContent()); }
public function prepare(reactRequest $request, reactResponse $response, $output) { static $serverSoftware, $settings; if ($serverSoftware === null) { $serverSoftware = 'MPCMF Async PHP ' . phpversion(); $settings = ['document_root' => APP_ROOT . '/htdocs']; } $_SERVER = []; $now = microtime(true); $_SERVER['REQUEST_TIME'] = (int) $now; $_SERVER['REQUEST_TIME_FLOAT'] = $now; $GLOBALS['MPCMF_START_TIME'] = $now; /** @var Uri $requestUrl */ $requestUrl = $request->getUrl(); $path = $requestUrl->getPath(); if ($path === '/favicon.ico') { $response->writeHead(404); $response->end('FAVICON NOT FOUND! :)'); //MPCMF_DEBUG && $output->writeln("<info>[CHILD:{$this->port}]</info> Connection closed by favicon catch"); return false; } $realpath = realpath($settings['document_root'] . $path); if ($realpath !== false && strpos($realpath, $settings['document_root']) !== false && (file_exists($realpath) && !is_dir($realpath))) { $response->writeHead(200, ['Content-type' => \GuzzleHttp\Psr7\mimetype_from_filename($realpath), 'Content-length' => filesize($realpath)]); $response->end(file_get_contents($realpath)); //MPCMF_DEBUG && $output->writeln("<info>[CHILD:{$this->port}]</info> Connection closed by static"); return false; } $_FILES = []; foreach ($request->getFiles() as $filename => $fileData) { $tmpname = tempnam('/tmp/mpcmf/', 'upl'); file_put_contents($tmpname, stream_get_contents($fileData['stream'])); $_FILES[$filename] = ['name' => $filename, 'type' => $fileData['type'], 'tmp_name' => $tmpname, 'error' => $fileData['error'], 'size' => $fileData['size']]; } $_SERVER['DOCUMENT_ROOT'] = $settings['document_root']; $_SERVER['REMOTE_ADDR'] = $request->getRemoteAddress(); $_SERVER['REMOTE_PORT'] = 0; $_SERVER['SERVER_SOFTWARE'] = $serverSoftware; $_SERVER['SERVER_PROTOCOL'] = "HTTP/{$request->getHttpVersion()}"; $_SERVER['SERVER_NAME'] = $this->childHost; $_SERVER['SERVER_PORT'] = $this->port; $path = $requestUrl->getPath(); $queryString = $requestUrl->getQuery(); $_SERVER['REQUEST_URI'] = $path . (!empty($queryString) ? "?{$queryString}" : ''); $_SERVER['REQUEST_METHOD'] = mb_strtoupper($request->getMethod()); $_SERVER['SCRIPT_NAME'] = '/'; $_SERVER['SCRIPT_FILENAME'] = __FILE__; $_SERVER['PATH_INFO'] = $path; $_SERVER['PHP_SELF'] = $path; $headers = $request->getHeaders(); foreach ($headers as $headerKey => $headerValue) { $_SERVER['HTTP_' . strtoupper(preg_replace('/[\\-\\s]/', '_', $headerKey))] = $headerValue; } if (isset($_SERVER['HTTP_X_REAL_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP']; } $_SERVER['QUERY_STRING'] = $queryString; //@todo remove on pull request merge https://github.com/reactphp/http/pull/34 $_GET = $request->getQuery(); $_POST = $request->getPost(); parse_str($queryString, $parsedGET); parse_str($request->getBody(), $parsedPOST); $_GET = array_replace($_GET, $parsedGET); $_POST = array_replace($_POST, $parsedPOST); if (isset($_SERVER['HTTP_COOKIE'])) { parse_str($_SERVER['HTTP_COOKIE'], $_COOKIE); } else { $_COOKIE = []; } $_REQUEST = array_merge($_GET, $_POST); return true; }
/** * @param ReactRequest $reactRequest * * @return array */ private function transformUpladedFiles(ReactRequest $reactRequest) { $factory = function (array $fileInfo) use(&$factory) { $files = array(); foreach ($fileInfo as $name => &$attr) { if (is_array($attr) && isset($attr['stream'])) { $files[$name] = $this->psr7Factory->createUploadedFile($attr['stream'], $attr['size'], $attr['error'], $attr['name'], $attr['type']); } elseif (is_array($attr)) { $files[$name] = $factory($attr); } else { throw new \InvalidArgumentException('Invalid value in files specification'); } } return $files; }; return $factory($reactRequest->getFiles()); }
/** * @param ReactRequest * @return DiactorosRequest */ private function marshalPsr7Request(ReactRequest $reactRequest) { return new DiactorosRequest($_SERVER, $reactRequest->getFiles(), $reactRequest->getUrl(), $reactRequest->getMethod(), $this->createBodyStream($reactRequest), $reactRequest->getHeaders(), [], $reactRequest->getQuery(), $reactRequest->getPost(), $reactRequest->getHttpVersion()); }