Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 /**
  * 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());
 }
Esempio n. 3
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;
 }
 /**
  * @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());
 }
Esempio n. 5
0
 /**
  * @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());
 }