public function parseHeader($header) { $request = new Request(); $header = new Text($header); $lines = $header->lines(); $first = array_shift($lines); $parts = explode(' ', $first); foreach ($parts as $index => $value) { switch ($index) { case 0: $request->setMethod($value); break; case 1: $path = parse_url($value, PHP_URL_PATH); $query = parse_url($value, PHP_URL_QUERY); $request->setUri($path); $request->setPath($path); $request->setQueryString($query); break; case 2: list($protocol, $version) = explode('/', trim($value)); $request->setProtocol($protocol); $request->setProtocolVersion($version); break; } } foreach ($lines as $line) { if (!$line->trim()->isEmpty()) { list($name, $value) = explode(':', $line, 2); $request->setHeader(trim($name), trim($value)); } } return $request; }
/** * @param \SplFileInfo $path * @param Request $request * @param array $env * * @return array */ protected function createEnvVars(\SplFileInfo $path, Request $request, array $env = []) { $env = array_merge($env, ['REQUEST_URI' => $request->getUri() . ($request->getQueryString() ? '?' . $request->getQueryString() : ''), 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => $request->getServerPort(), 'QUERY_STRING' => $request->getQueryString(), 'SCRIPT_NAME' => $request->getPath(), 'SCRIPT_FILENAME' => $path->getRealPath(), 'REQUEST_METHOD' => $request->getMethod(), 'REDIRECT_STATUS' => 200, 'SERVER_SOFTWARE' => 'Coupe/PHP ' . PHP_VERSION . ' Development Server', 'REMOTE_ADDR' => $request->getRemoteAddr(), 'REMOTE_PORT' => $request->getRemotePort()]); if ($request->getPathInfo()) { $env['PATH_INFO'] = $request->getPathInfo(); } if ($request->getHeader('Content-Length')) { $env['CONTENT_LENGTH'] = $request->getHeader('Content-Length'); $env['CONTENT_TYPE'] = $request->getHeader('Content-Type'); } if ($request->getHeader('Https')) { $env['HTTPS'] = 1; } foreach ($request->getHeaders() as $name => $value) { $variable = 'HTTP_' . str_replace('-', '_', strtoupper($name)); $env[$variable] = $value; } return $env; }
/** * @param Request $request * * @return \SplFileInfo * @throws ResourceNotFoundException */ protected function findFile(Request $request) { $path = $this->joinPath($this->options['docroot'], $request->getUri()); $file = new \SplFileInfo($path); if ($file->isDir()) { // find indexes foreach ($this->options['indexes'] as $index) { $fixedPath = $this->joinPath($path, $index); $fixedFile = new \SplFileInfo($fixedPath); if ($fixedFile->isFile()) { return $fixedFile; } } } if ($file->isFile()) { if (substr($path, -1) == '/') { $request->setPathInfo('/'); } return $file; } if (preg_match('{(^[^\\.]*?\\.[^/]+)(/.*?$)}', $request->getUri(), $matches)) { $file = new \SplFileInfo($this->joinPath($this->options['docroot'], $matches[1])); if ($file->isFile()) { $request->setPathInfo($matches[2]); $request->setPath($matches[1]); return $file; } } // find fallback $path = $this->joinPath($this->options['docroot'], $this->options['fallback']); $file = new \SplFileInfo($path); if ($file->isFile()) { return $file; } throw new ResourceNotFoundException(); }
/** * @param Request $request * @param ProtectedStreamSocket $socket * * @return Response|void */ protected function handleRequest(Request $request, ProtectedStreamSocket $socket) { $request->setHeader('Https', 1); return parent::handleRequest($request, $socket); }