00001 <?php
00002
00003
00004
00005
00006
00007
00008 class RequestInfo {
00009 const ABSOLUTE = 'absolute';
00010 const RELATIVE = 'relative';
00011
00012
00013
00014
00015
00016
00017 private static $_current = null;
00018 protected $data = array();
00019
00020 public function __construct($server_array) {
00021 $this->data = $server_array;
00022 }
00023
00024
00025
00026
00027
00028
00029 public static function current() {
00030 if (self::$_current === null) {
00031 self::$_current = new RequestInfo($_SERVER);
00032 }
00033 return clone(self::$_current);
00034 }
00035
00036
00037
00038
00039
00040
00041
00042 public static function create($data_array) {
00043 return new RequestInfo($data_array);
00044 }
00045
00046
00047
00048
00049
00050
00051 public function is_ssl() {
00052 $https = Arr::get_item($this->data, 'HTTPS', false);
00053 if ($https === false) {
00054
00055 return (Arr::get_item($this->data, 'SERVER_PORT', '') == '443');
00056 } else {
00057 return $https != 'off';
00058 }
00059 }
00060
00061
00062
00063
00064
00065
00066 public function is_console() {
00067 $protocol = Arr::get_item($_SERVER, 'SERVER_PROTOCOL', false);
00068 return empty($protocol);
00069 }
00070
00071
00072
00073
00074
00075
00076 public function url_invoked($type = self::ABSOLUTE) {
00077 $ret = '';
00078 if ($this->is_console()) {
00079 $ret = $this->compute_cl_invoked($type);
00080 }
00081 else {
00082 $ret = $this->compute_url_invoked($type);
00083 }
00084 return $ret;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093 protected function compute_url_invoked($type) {
00094 $ret = '';
00095
00096
00097 $ret .= Arr::get_item($this->data, 'HTTP_X_REWRITE_URL', '');
00098 if ($ret === '') {
00099
00100 $ret .= Arr::get_item($this->data, 'REQUEST_URI', '');
00101 }
00102 if ($ret === '') {
00103
00104 $ret .= Arr::get_item($this->data, 'SCRIPT_NAME', '');
00105 if ($ret === '') {
00106 $ret .= Arr::get_item($this->data, 'PHP_SELF', '');
00107 }
00108 $query = Arr::get_item($this->data, 'QUERY_STRING', '');
00109 if ($query !== '') {
00110 $ret .= '?' . $query;
00111 }
00112 }
00113 if ($type == self::ABSOLUTE) {
00114 $prefix = $this->is_ssl() ? 'https://' : 'http://';
00115
00116 $prefix .= Arr::get_item(
00117 $_SERVER, 'HTTP_X_FORWARDED_HOST', Arr::get_item(
00118 $_SERVER, 'HTTP_HOST', Config::get_value(Config::URL_DOMAIN)
00119 )
00120 );
00121 $ret = $prefix . $ret;
00122 }
00123 return $ret;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132 protected function compute_cl_invoked($type) {
00133 $ret = 'http://local/php ';
00134 $ret .= implode(' ', Arr::get_item($_SERVER, 'argv', array()));
00135 return $ret;
00136 }
00137
00138
00139
00140
00141
00142
00143 public function method() {
00144 return strtoupper(Arr::get_item($this->data, 'REQUEST_METHOD', 'GET'));
00145 }
00146
00147
00148
00149
00150
00151
00152 public function remote_address() {
00153 $ret = '';
00154
00155 $in = Arr::get_item($this->data, 'HTTP_X_FORWARDED_FOR', Arr::get_item($this->data, 'REMOTE_ADDR', ''));
00156 if ($in) {
00157
00158 $arr_ips = explode(',', $in);
00159 foreach($arr_ips as $ip) {
00160 if (Validation::is_ip($ip)) {
00161 $ret = $ip;
00162 break;
00163 }
00164 }
00165 }
00166 return $ret;
00167 }
00168
00169
00170
00171
00172
00173
00174 public function remote_host() {
00175 $ret = '';
00176 if (!isset($this->data['HTTP_X_FORWARDED_FOR'])) {
00177 $ret = Arr::get_item($this->data, 'REMOTE_HOST', '');
00178 }
00179 if ($ret === '') {
00180 $ret = $this->remote_address();
00181 if ($ret) {
00182 $ret = @gethostbyaddr($ret);
00183 }
00184 }
00185 return $ret;
00186 }
00187
00188
00189
00190
00191
00192
00193 public function user_agent() {
00194 return Arr::get_item($this->data, 'HTTP_USER_AGENT', '');
00195 }
00196 }