You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
flight-core/flight/net/Request.php

137 lines
3.9 KiB

14 years ago
<?php
/**
* Flight: An extensible micro-framework.
14 years ago
*
* @copyright Copyright (c) 2011, Mike Cao <mike@mikecao.com>
* @license http://www.opensource.org/licenses/mit-license.php
*/
namespace flight\net;
use flight\util\Collection;
/**
* The Request class represents an HTTP request. Data from
* all the super globals $_GET, $_POST, $_COOKIE, and $_FILES
* are stored and accessible via the Request object.
*
* The default request properties are:
* url - The URL being requested
* base - The parent subdirectory of the URL
* method - The request method (GET, POST, PUT, DELETE)
* referrer - The referrer URL
* ip - IP address of the client
* ajax - Whether the request is an AJAX request
* scheme - The server protocol (http, https)
* user_agent - Browser information
* body - Raw data from the request body
* type - The content type
* length - The content length
* query - Query string parameters
* data - Post parameters
* cookies - Cookie parameters
* files - Uploaded files
*/
14 years ago
class Request {
/**
* Constructor.
*
* @param array $config Request configuration
*/
public function __construct($config = array()) {
// Default properties
if (empty($config)) {
$config = array(
12 years ago
'url' => getenv('REQUEST_URI') ?: '/',
'base' => str_replace('\\', '/', dirname(getenv('SCRIPT_NAME'))),
'method' => getenv('REQUEST_METHOD') ?: 'GET',
'referrer' => getenv('HTTP_REFERER') ?: '',
'ip' => $this->getIpAddress(),
12 years ago
'ajax' => getenv('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest',
'scheme' => getenv('SERVER_PROTOCOL') ?: 'HTTP/1.1',
'user_agent' => getenv('HTTP_USER_AGENT') ?: '',
'body' => file_get_contents('php://input'),
12 years ago
'type' => getenv('CONTENT_TYPE') ?: '',
'length' => getenv('CONTENT_LENGTH') ?: 0,
'query' => new Collection($_GET),
'data' => new Collection($_POST),
'cookies' => new Collection($_COOKIE),
'files' => new Collection($_FILES)
14 years ago
);
}
$this->init($config);
14 years ago
}
/**
* Initialize request properties.
*
* @param array $properties Array of request properties
*/
public function init($properties) {
foreach ($properties as $name => $value) {
$this->$name = $value;
14 years ago
}
if ($this->base != '/' && strpos($this->url, $this->base) === 0) {
$this->url = substr($this->url, strlen($this->base));
}
if (empty($this->url)) {
$this->url = '/';
}
else {
$_GET = self::parseQuery($this->url);
$this->query->setData($_GET);
}
14 years ago
}
/**
* Parse query parameters from a URL.
*
* @param string $url URL string
* @return array Query parameters
14 years ago
*/
public static function parseQuery($url) {
14 years ago
$params = array();
$args = parse_url($url);
if (isset($args['query'])) {
parse_str($args['query'], $params);
}
return $params;
}
/**
* Gets the real remote IP address.
*
* @return string IP address
*/
private function getIpAddress() {
static $vars = array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR'
);
foreach ($vars as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
return $ip;
}
}
}
}
12 years ago
return $_SERVER['REMOTE_ADDR'];
}
14 years ago
}
?>