diff --git a/Request.inc.php b/Request.inc.php index b5895ee..e9906ec 100644 --- a/Request.inc.php +++ b/Request.inc.php @@ -2,9 +2,7 @@ namespace wellrested; -/******************************************************************************* - * Request - * +/** * A Request instance contains information relating to the current HTTP request * a client sent to the server. * @@ -12,58 +10,69 @@ namespace wellrested; * request, the class exposes the static getRequest() method for obtaining a * singleton Request instance. * - * @package WellRESTed - * - ******************************************************************************/ - -/** * @property string body Entity body of the request * @property array headers Associative array of HTTP headers * @property string method HTTP method or verb for the request * @property string path Path component of the URI for the request * @property string pathParts Fragments of the path, delimited by slashes * @property array query Associative array of query parameters + * + * @package WellRESTed */ - class Request { +class Request { /** * Entity body of the request + * * @var string */ protected $body; /** * Associative array of HTTP headers + * * @var array */ protected $headers; /** * HTTP method or verb for the request + * * @var string */ protected $method; /** * Path component of the URI for the request + * * @var string */ protected $path; /** * Array of fragments of the path, delimited by slashes + * * @var array */ protected $pathParts; /** * Associative array of query parameters + * * @var array */ protected $query; + /** + * The full URI of the request + * + * @var string + */ + protected $uri; + /** * Singleton instance derived from reading info from Apache. + * * @var Request * @static */ @@ -73,27 +82,57 @@ namespace wellrested; // ------------------------------------------------------------------------- // !Accessors + /** + * @param string $name + * @return array|string + * @throws \Exception + */ public function __get($name) { switch ($name) { - case 'body': - return $this->getBody(); - case 'headers': - return $this->getHeaders(); - case 'method': - return $this->getMethod(); - case 'path': - return $this->getPath(); - case 'pathParts': - return $this->getPathParts(); - case 'query': - return $this->getQuery(); - default: - throw new \Exception('Property ' . $name . ' does not exist.'); + case 'body': + return $this->getBody(); + case 'headers': + return $this->getHeaders(); + case 'method': + return $this->getMethod(); + case 'path': + return $this->getPath(); + case 'pathParts': + return $this->getPathParts(); + case 'query': + return $this->getQuery(); + case 'uri': + return $this->getUri(); + default: + throw new \Exception('Property ' . $name . ' does not exist.'); } } // __get() + /** + * @param string $name + * @param mixed $value + * @throws \Exception + */ + public function __set($name, $value) { + + switch ($name) { + case 'path': + $this->setPath($value); + return; + case 'query': + $this->setQuery($value); + return; + case 'uri': + $this->setUri($value); + return; + default: + throw new \Exception('Property ' . $name . 'does not exist.'); + } + + } + public function getBody() { return $this->body; } @@ -118,6 +157,73 @@ namespace wellrested; return $this->query; } + public function getUri() { + return $this->uri; + } + + /** + * Set the path and pathParts members. + * + * @param string $path + */ + public function setPath($path) { + + $this->path = $path; + $this->pathParts = explode('/', substr($path, 1)); + + } + + /** + * @param string|array $query + * @throws \InvalidArgumentException + */ + public function setQuery($query) { + + if (is_string($query)) { + $qs = $query; + parse_str($qs, $query); + } + + if (is_array($query)) { + $this->query = $query; + } else { + throw new \InvalidArgumentException('Unable to parse query string.'); + } + + } + + /** + * Set the URI for the Request. This method also sets the path, pathParts, + * and query. + * + * @param string $uri + */ + public function setUri($uri) { + + /* + * TODO, eventually do all of these: + http + host + port + user + pass + path + query - after the question mark ? + fragment - after the hashmark # + */ + + $this->uri = $uri; + $parsed = parse_url($uri); + + $path = isset($parsed['path']) ? $parsed['path'] : ''; + $this->setPath($path); + + $query = isset($parsed['query']) ? $parsed['query'] : ''; + $this->setQuery($query); + + } + + // ------------------------------------------------------------------------- /** @@ -126,17 +232,9 @@ namespace wellrested; protected function readHttpRequest() { $this->body = file_get_contents("php://input"); - $this->headers = apache_request_headers(); - $this->method = $_SERVER['REQUEST_METHOD']; - - $uri = parse_url($_SERVER['REQUEST_URI']); - $this->path = $uri['path']; - - $this->pathParts = explode('/', substr($this->path, 1)); - - $this->query = $_GET; + $this->setUri($_SERVER['REQUEST_URI']); } // readHttpRequest() diff --git a/Response.inc.php b/Response.inc.php index d76c02e..7bc98fb 100644 --- a/Response.inc.php +++ b/Response.inc.php @@ -38,10 +38,9 @@ class Response { // ------------------------------------------------------------------------- - public function __construct($statusCode=500, $body='', $headers=null) { + public function __construct($statusCode=500, $body=null, $headers=null) { $this->statusCode = $statusCode; - $this->body = $body; if (is_array($headers)) { $this->headers = $headers; @@ -49,6 +48,10 @@ class Response { $this->headers = array(); } + if (!is_null($body)) { + $this->body = $body; + } + } // __construct() // ------------------------------------------------------------------------- diff --git a/Router.inc.php b/Router.inc.php index b49c458..dbb77f4 100644 --- a/Router.inc.php +++ b/Router.inc.php @@ -3,6 +3,7 @@ namespace wellrested; require_once(dirname(__FILE__) . '/Request.inc.php'); +require_once(dirname(__FILE__) . '/Response.inc.php'); require_once(dirname(__FILE__) . '/Route.inc.php'); /******************************************************************************* @@ -35,18 +36,17 @@ class Router { } // addRoute() /** - * @param string $requestPath - * @return Handler + * @param Request $request + * @return Response */ - public function getRequestHandler($requestPath=null) { + public function getResponse($request=null) { - if (is_null($requestPath)) { + if (is_null($request)) { $request = Request::getRequest(); - $path = $request->path; - } else { - $path = $requestPath; } + $path = $request->path; + foreach ($this->routes as $route) { if (preg_match($route->pattern, $path, $matches)) { @@ -57,17 +57,29 @@ class Router { require_once($route->handlerPath); } - // TODO: Need to rethink this plan. May not have a $request yet. - return $handler = new $klass($request, $matches); + $handler = new $klass($request, $matches); + return $handler->response; } } - return false; + return $this->getNoRouteResponse($request); } // getRequestHandler() + /** + * @param Request $request + * @return Response + */ + protected function getNoRouteResponse(Request $request) { + + $response = new Response(404); + $response->body = 'No resource at ' . $request->uri; + return $response; + + } + } // Router ?>