public function dispatch(Pebble_Http_Request $request) { $response = new Pebble_Http_Response(); if ($methodName = $this->_getRoute($request)) { $response->setStatusCode(Pebble_Http_Response::HTTP_STATUS_200); try { ob_start(); $statusCode = $this->{$methodName}($request); $responseBody = ob_get_contents(); ob_end_clean(); $response->setBody($responseBody); if ($statusCode !== null) { $response->setStatusCode($statusCode); } } catch (Exception $e) { $this->_500($response, $e); } return $response; } else { if (file_exists(getcwd() . $request->getUrl())) { $filename = getcwd() . $request->getUrl(); if (is_file($filename)) { $file = file_get_contents($file); $response->setBody($file); $response->setStatusCode(Pebble_Http_Response::HTTP_STATUS_200); } else { $this->_404($response); } } else { if (file_exists(PEBBLE_ROOT . '/resources' . $request->getUrl())) { $filename = PEBBLE_ROOT . '/resources' . $request->getUrl(); if (!is_file($filename)) { $this->_404($response); } else { $file = file_get_contents($filename); $response->setBody($file); $response->setStatusCode(Pebble_Http_Response::HTTP_STATUS_200); } } else { $this->_404($response); } } } return $response; }
public static function serve() { $options = self::$_options; $sock = self::$_socket; $bound = socket_bind($sock, $options['bind_address'], $options['listen_port']); if (!$bound) { return; } socket_listen($sock); echo "Server is listening on port " . $options['listen_port'] . PHP_EOL; while (self::$_continue) { $childSocket = socket_accept($sock); $input = socket_read($childSocket, 1024); if ($input) { $request = new Pebble_Http_Request($input); if ($options['verbose']) { echo $request; } try { $response = self::$_dispatcher->dispatch($request); } catch (Exception $e) { echo "Uncaught Exception: " . $e->getMessage() . PHP_EOL; $response = new Pebble_Http_Response(); $response->setStatusCode(Pebble_Http_Response::HTTP_STATUS_SERVER_ERROR); } if ($options['verbose']) { echo " (" . $response->getStatusCode() . ")" . PHP_EOL; } socket_write($childSocket, $response->__toString()); socket_close($childSocket); unset($childSocket); } else { echo "Socket Error: " . socket_last_error($childSocket) . "\n"; } } socket_close(self::$_socket); }