Esempio n. 1
0
 /**
  * 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;
 }
Esempio n. 2
0
 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());
 }
Esempio n. 3
0
 /**
  * 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);
 }
Esempio n. 4
0
 /**
  * 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);
 }
Esempio n. 5
0
 /**
  * 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);
 }
Esempio n. 6
0
 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());
 }
Esempio n. 7
0
 public static function fromHttpRequest(HttpRequest $request)
 {
     return new RequestHeaders($request->getMethod(), $request->getPath(), $request->getQuery(), $request->getHttpVersion(), $request->getHeaders());
 }
Esempio n. 8
0
 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;
 }
Esempio n. 9
0
 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]);
     });
 }
Esempio n. 10
0
 /**
  * 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();
 }