/** * Extract the server parameters ($_SERVER). * * @param ReactRequest $request * * @return array */ private function extractServer(ReactRequest $request) { $server = ['SERVER_PROTOCOL' => 'HTTP/' . $request->getHttpVersion(), 'REQUEST_METHOD' => $request->getMethod(), 'REQUEST_URI' => $request->getPath(), 'REQUEST_TIME' => time()]; // headers foreach ($request->getHeaders() as $key => $value) { $name = mb_strtoupper($key, 'UTF-8'); $name = str_replace('-', '_', $name); $server[$name] = $value; } return $server; }
protected function fixHeaderNames(Request $request) { $headers = $request->getHeaders(); foreach ($headers as $name => $v) { $newName = str_replace(' ', '-', ucwords(strtolower(str_replace('-', ' ', $name)))); $headers[$newName] = $headers[$name]; } if (isset($headers['Content-Type'])) { $headers['Content-Type'] = explode(';', $headers['Content-Type'])[0]; } $request->__construct($request->getMethod(), $request->getUrl(), $request->getQuery(), $request->getHttpVersion(), $headers, $request->getBody()); }
/** * Creates a new request object from the data of a reactPHP request object * * @param \React\Http\Request $request ReactPHP native request object * * @return \Slim\Http\Request */ public static function createFromReactRequest(\React\Http\Request $request) { $slimHeads = new Headers(); foreach ($request->getHeaders() as $reactHeadKey => $reactHead) { $slimHeads->add($reactHeadKey, $reactHead); if ($reactHeadKey === 'Host') { $host = explode(':', $reactHead); if (count($host) === 1) { $host[1] = '80'; } } } $slimUri = new Uri('http', $host[0], (int) $host[1], $request->getPath(), $request->getQuery()); $cookies = []; $serverParams = $_SERVER; $serverParams['SERVER_PROTOCOL'] = 'HTTP/' . $request->getHttpVersion(); $slimBody = new RequestBody(); return new self($request->getMethod(), $slimUri, $slimHeads, $cookies, $serverParams, $slimBody); }
/** * Creates a new request object from the data of a reactPHP request object * * @param \React\Http\Request $request ReactPHP native request object * @param string $body Content of received call * * @return \Slim\Http\Request */ public static function createFromReactRequest(\React\Http\Request $request, $body = '') { $slimHeads = new Headers(); $cookies = []; $host = ['', 80]; foreach ($request->getHeaders() as $reactHeadKey => $reactHead) { $slimHeads->add($reactHeadKey, $reactHead); switch ($reactHeadKey) { case 'Host': $host = static::getHost($reactHead); break; case 'Cookie': $cookies = Cookies::parseHeader($reactHead); break; } } $slimUri = new Uri('http', $host[0], (int) $host[1], $request->getPath(), $request->getQuery()); $serverParams = $_SERVER; $serverParams['SERVER_PROTOCOL'] = 'HTTP/' . $request->getHttpVersion(); $slimBody = static::getBody($body); return new Request($request->getMethod(), $slimUri, $slimHeads, $cookies, $serverParams, $slimBody); }
/** * Log a request * * @param OutputInterface $output Output * @param string $responseCode Response code * @param Request $request Request */ public static function logRequest(OutputInterface $output, $responseCode, Request $request) { $wrapOpen = ''; $wrapClose = ''; if ($responseCode < 400) { $wrapOpen = ''; $wrapClose = ''; } elseif ($responseCode >= 400) { $wrapOpen = '<comment>'; $wrapClose = '</comment>'; } $output->writeln($wrapOpen . sprintf('[%s] "%s %s HTTP/%s" %s', date("d/M/Y H:i:s"), $request->getMethod(), $request->getPath(), $request->getHttpVersion(), $responseCode) . $wrapClose); }
private function convertFromReactToPsrRequest(ReactRequest $request, $requestData) { $bodyStream = new Stream('php://temp', 'rw'); $bodyStream->write($requestData); return new ServerRequest(['REMOTE_ADDR' => $request->remoteAddress, 'HTTP_VERSION' => $request->getHttpVersion()], [], $this->getUriFromRequest($request), $request->getMethod(), $bodyStream, $request->getHeaders()); }
public static function fromHttpRequest(HttpRequest $request) { return new RequestHeaders($request->getMethod(), $request->getPath(), $request->getQuery(), $request->getHttpVersion(), $request->getHeaders()); }
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; }
protected function setupResponseLogging(\React\Http\Request $request, HttpResponse $response) { $timeLocal = date('d/M/Y:H:i:s O'); $response->on('end', function () use($request, $response, $timeLocal) { $requestString = $request->getMethod() . ' ' . $request->getPath() . ' HTTP/' . $request->getHttpVersion(); $statusCode = $response->getStatusCode(); if ($response->getStatusCode() < 400) { $requestString = "<info>{$requestString}</info>"; $statusCode = "<info>{$statusCode}</info>"; } $message = str_replace(['$remote_addr', '$remote_user', '$time_local', '$request', '$status', '$bytes_sent', '$http_referer', '$http_user_agent'], [$_SERVER['REMOTE_ADDR'], '-', $timeLocal, $requestString, $statusCode, $response->getBytesSent(), isset($request->getHeaders()['Referer']) ? $request->getHeaders()['Referer'] : '-', isset($request->getHeaders()['User-Agent']) ? $request->getHeaders()['User-Agent'] : '-'], $this->logFormat); if ($response->getStatusCode() >= 400) { $message = "<error>{$message}</error>"; } $this->sendMessage($this->controller, 'log', ['message' => $message]); }); }
/** * Handle HTTP request * * @param Request $request * @param Response $response */ public function handleRequest(Request $request, Response $response) { $this->logger->debug(sprintf("Inbound request: %s %s HTTP/%s", $request->getMethod(), $request->getPath(), $request->getHttpVersion()), ['request' => $request, 'response' => $response]); $request->pause(); $resolver = new RequestResolver($request, $response, $this->dispatcher); $resolver->resolve(); $response->on('end', 'gc_collect_cycles'); $request->resume(); }