* @license MIT, http://flightphp.com/license */ 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 */ class Request { /** * @var string URL being requested */ public $url; /** * @var string Parent subdirectory of the URL */ public $base; /** * @var string Request method (GET, POST, PUT, DELETE) */ public $method; /** * @var string Referrer URL */ public $referrer; /** * @var string IP address of the client */ public $ip; /** * @var bool Whether the request is an AJAX request */ public $ajax; /** * @var string Server protocol (http, https) */ public $scheme; /** * @var string Browser information */ public $user_agent; /** * @var mixed Raw data from the request body */ public $body; /** * @var string Content type */ public $type; /** * @var int Content length */ public $length; /** * @var \flight\util\Collection Query string parameters */ public $query; /** * @var \flight\util\Collection Post parameters */ public $data; /** * @var \flight\util\Collection Cookie parameters */ public $cookies; /** * @var \flight\util\Collection Uploaded files */ public $files; /** * @var bool Whether the connection is secure */ public $secure; /** * @var string HTTP accept parameters */ public $accept; /** * @var string Proxy IP address of the client */ public $proxy_ip; /** * Constructor. * * @param array $config Request configuration */ public function __construct($config = array()) { // Default properties if (empty($config)) { $config = array( 'url' => $this->server('REQUEST_URI', '/'), 'base' => str_replace(array('\\',' '), array('/','%20'), dirname($this->server('SCRIPT_NAME'))), 'method' => $this->server('REQUEST_METHOD', 'GET'), 'referrer' => $this->server('HTTP_REFERER'), 'ip' => $this->server('REMOTE_ADDR'), 'ajax' => $this->server('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest', 'scheme' => $this->server('SERVER_PROTOCOL', 'HTTP/1.1'), 'user_agent' => $this->server('HTTP_USER_AGENT'), 'body' => file_get_contents('php://input'), 'type' => $this->server('CONTENT_TYPE'), 'length' => $this->server('CONTENT_LENGTH', 0), 'query' => new Collection($_GET), 'data' => new Collection($_POST), 'cookies' => new Collection($_COOKIE), 'files' => new Collection($_FILES), 'secure' => $this->server('HTTPS', 'off') != 'off', 'accept' => $this->server('HTTP_ACCEPT'), 'proxy_ip' => $this->getProxyIpAddress() ); } $this->init($config); } /** * Initialize request properties. * * @param array $properties Array of request properties */ public function init($properties = array()) { foreach ($properties as $name => $value) { $this->$name = $value; } if ($this->base != '/' && strlen($this->base) > 0 && 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); } } /** * Parse query parameters from a URL. * * @param string $url URL string * @return array Query parameters */ public static function parseQuery($url) { $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 getProxyIpAddress() { static $forwarded = array( 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED' ); $flags = \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE; foreach ($forwarded as $key) { if (array_key_exists($key, $_SERVER)) { sscanf($_SERVER[$key], '%[^,]', $ip); if (filter_var($ip, \FILTER_VALIDATE_IP, $flags) !== false) { return $ip; } } } return ''; } /** * Get variable from $_SERVER using $default if not provided * * @param string $var Variable name * @param string $default Default value to substitute * @return string Server variable value */ private function server($var, $default='') { return isset($_SERVER[$var]) ? $_SERVER[$var] : $default; } }