public function testOwnRequest() { $request = new Request([], [], [], [], [], []); $this->assertEquals('/', $request->getUri()); // By default it's / $this->assertEquals(Request::GET, $request->getMethod()); $request = new Request(['param1' => 5], ['post1' => 5, 'post2' => "test string"], ['REQUEST_URI' => '/testuri'], [], [], []); $this->assertEquals('/testuri', $request->getUri()); $this->assertEquals(Request::GET, $request->getMethod()); $this->assertSame(5, $request->getParam('param1')); $this->assertSame(5, $request->getPost('post1')); $this->assertSame("test string", $request->getPost('post2')); }
/** * 响应请求,依次执行添加的中间件逻辑. * * @param \Owl\Http\Request $request * @param \Owl\Http\Response $response */ public function execute(\Owl\Http\Request $request, \Owl\Http\Response $response) { $exception_handler = $this->getExceptionHandler(); $method = $request->getMethod(); try { if (!in_array($method, ['HEAD', 'OPTIONS', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH'])) { throw \Owl\Http\Exception::factory(501); } $this->middleware->execute([$request, $response]); } catch (\Exception $exception) { call_user_func($exception_handler, $exception, $request, $response); } catch (\Throwable $error) { call_user_func($exception_handler, $error, $request, $response); } if (!TEST) { $response->end(); } if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } }
/** * @param \Owl\Http\Request $request * @param \Owl\Http\Response $response * @return \Owl\Http\Response $response * * @throws \Owl\Http\Exception 404 * @throws \Owl\Http\Exception 501 */ protected function respond(\Owl\Http\Request $request, \Owl\Http\Response $response) { App::log('debug', 'router respond', ['url' => (string) $request->getUri(), 'method' => $request->getMethod()]); $path = $this->getRequestPath($request); list($class, $parameters) = $this->byRewrite($path) ?: $this->byPath($path); App::log('debug', 'router dispatch', ['class' => $class, 'parameters' => $parameters]); if (!class_exists($class)) { throw \Owl\Http\Exception::factory(404); } $controller = new $class($request, $response); $controller->request = $request; $controller->response = $response; // 如果__beforeExecute()返回了内容就直接返回内容 if (method_exists($controller, '__beforeExecute') && ($data = call_user_func_array([$controller, '__beforeExecute'], $parameters))) { if ($data instanceof \Psr\Http\Message\StreamInterface) { $response->withBody($data); } elseif (!$data instanceof \Owl\Http\Response) { $response->write($data); } return $response; } $method = $request->getMethod(); if ($method === 'HEAD') { $method = 'GET'; } if (!in_array($method, ['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH'])) { throw \Owl\Http\Exception::factory(501); } if (!is_callable([$controller, $method])) { throw \Owl\Http\Exception::factory(405); } $data = call_user_func_array([$controller, $method], $parameters); if ($data instanceof \Psr\Http\Message\StreamInterface) { $response->withBody($data); } elseif ($data !== null && !$data instanceof \Owl\Http\Response) { $response->write($data); } if (method_exists($controller, '__afterExecute')) { $controller->__afterExecute($request, $response); } return $response; }