/** * @param ReactRequest $reactRequest * @return resource */ private function createBodyStream(ReactRequest $reactRequest) { $body = fopen('php://temp', 'w+'); fwrite($body, $reactRequest->getBody()); fseek($body, 0); return $body; }
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()); }
public function transformFromReact(ReactRequest $request) { $this->baseUrl = ''; $this->requestUri = $request->getPath(); $this->content = $request->getBody(); // Request Headers $this->headers = new HeaderBag($request->getHeaders()); // Server informations ($_SERVER) $this->server = new ServerBag($this->buildServerBag($request)); // Request body parameters ($_POST). if (0 === strpos($this->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') && in_array(strtoupper($this->server->get('REQUEST_METHOD', 'GET')), ['POST', 'PUT', 'DELETE', 'PATCH'])) { $this->request = new ParameterBag($request->getPost()); } // Query string parameters ($_GET). $this->query = new ParameterBag($request->getQuery()); // Request attributes $this->attributes = new ParameterBag([]); // Cookies $this->cookies = new ParameterBag($this->buildCookieBag()); // Files uploads $this->files = new FileBag($this->buildFileBag($request)); }
protected function finishParsing() { $this->emit('headers', array($this->request, $this->request->getBody())); $this->removeAllListeners(); $this->request = null; }
/** * 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()); }
private function generateMessage(Request $request) { $data = $request->getPost(); $data = empty($data) ? $request->getBody() : $data; return sprintf("I just received a webhook. Here's the content: `%s`", json_encode($data)); }
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 StreamInterface */ private function transformBody(ReactRequest $reactRequest) { $body = $this->psr7Factory->createStream(); $body->write((string) $reactRequest->getBody()); $body->rewind(); return $body; }