1 <?php rcs_id('$Id: Request.php,v 1.1 2001-09-18 19:16:23 dairiki Exp $');
3 // FIXME: write log entry.
9 $this->_fix_magic_quotes_gpc();
11 switch($this->get('REQUEST_METHOD')) {
14 $this->args = &$GLOBALS['HTTP_GET_VARS'];
17 $this->args = &$GLOBALS['HTTP_POST_VARS'];
20 $this->args = array();
24 $this->session = new Request_SessionVars;
25 $this->cookies = new Request_CookieVars;
27 $this->_log_entry = new Request_AccessLogEntry($this);
33 $vars = &$GLOBALS['HTTP_SERVER_VARS'];
35 if (isset($vars[$key]))
40 $addr = $vars['REMOTE_ADDR'];
41 if (defined('ENABLE_REVERSE_DNS') && ENABLE_REVERSE_DNS)
42 return $vars[$key] = gethostbyaddr($addr);
50 function getArg($key) {
51 if (isset($this->args[$key]))
52 return $this->args[$key];
56 function setArg($key, $val) {
57 $this->args[$key] = $val;
61 function redirect($url) {
62 header("Location: $url");
63 $this->_log_entry->setStatus(302);
66 function compress_output() {
67 if (function_exists('ob_gzhandler')) {
68 ob_start('ob_gzhandler');
69 $this->_is_compressing_output = true;
74 if (!empty($this->_is_compressing_output))
79 function getSessionVar($key) {
80 return $this->session->get($key);
82 function setSessionVar($key, $val) {
83 return $this->session->set($key, $val);
85 function deleteSessionVar($key) {
86 return $this->session->delete($key);
89 function getCookieVar($key) {
90 return $this->cookies->get($key);
92 function setCookieVar($key, $val, $lifetime_in_days = false) {
93 return $this->cookies->set($key, $val, $lifetime_in_days);
95 function deleteCookieVar($key) {
96 return $this->cookies->delete($key);
99 function getUploadedFile($key) {
100 return Request_UploadedFile::getUploadedFile($key);
104 function _fix_magic_quotes_gpc() {
105 $needs_fix = array('HTTP_POST_VARS',
112 if (get_magic_quotes_gpc()) {
113 foreach ($needs_fix as $vars)
114 $this->_stripslashes($GLOBALS[$vars]);
118 function _stripslashes(&$var) {
119 if (is_array($var)) {
120 foreach ($var as $key => $val)
121 $this->_stripslashes($var[$key]);
123 elseif (is_string($var))
124 $var = stripslashes($var);
128 class Request_SessionVars {
129 function Request_SessionVars() {
134 $vars = &$GLOBALS['HTTP_SESSION_VARS'];
135 if (isset($vars[$key]))
140 function set($key, $val) {
141 $vars = &$GLOBALS['HTTP_SESSION_VARS'];
142 if (ini_get('register_globals')) {
143 // This is funky but necessary, at least in some PHP's
144 $GLOBALS[$key] = $val;
147 session_register($key);
150 function delete($key) {
151 $vars = &$GLOBALS['HTTP_SESSION_VARS'];
152 if (ini_get('register_globals'))
153 unset($GLOBALS[$key]);
155 session_unregister($key);
159 class Request_CookieVars {
162 $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
163 if (isset($vars[$key])) {
164 @$val = unserialize($vars[$key]);
171 function set($key, $val, $persist_days = false) {
172 $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
174 if (is_numeric($persist_days)) {
175 $expires = time() + (24 * 3600) * $persist_days;
181 $packedval = serialize($val);
182 $vars[$key] = $packedval;
183 setcookie($key, $packedval, $expires, '/');
186 function delete($key) {
187 $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
193 class Request_UploadedFile {
194 function getUploadedFile($postname) {
195 global $HTTP_POST_FILES;
197 if (!isset($HTTP_POST_FILES[$postname]))
200 $fileinfo = &$HTTP_POST_FILES[$postname];
201 if (!is_uploaded_file($fileinfo['temp_name']))
202 return false; // possible malicious attack.
204 return new Request_UploadedFile($fileinfo);
207 function Request_UploadedFile($fileinfo) {
208 $this->_info = $fileinfo;
212 return $this->_info['size'];
216 return $this->_info['name'];
220 return $this->_info['type'];
224 if ( ($fd = fopen($this->_info['tmp_name'], "rb")) ) {
225 // Dump http headers.
226 while ( ($header = fgets($fd, 4096)) )
227 if (trim($header) == '')
233 function getContents() {
235 $data = fread($fd, $this->getSize());
241 class Request_AccessLogEntry
243 function AccessLogEntry ($request) {
244 $this->host = $req->get('REMOTE_HOST');
245 $this->ident = $req->get('REMOTE_IDENT');
249 $this->time = time();
250 $this->request = join(' ', array($req->get('REQUEST_METHOD'),
251 $req->get('REQUEST_URI'),
252 $req->get('SERVER_PROTOCOL')));
255 $this->referer = (string) $req->get('HTTP_REFERER');
256 $this->user_agent = (string) $req->get('HTTP_USER_AGENT');
260 // Returns zone offset, like "-0800" for PST.
262 function _zone_offset () {
263 $offset = date("Z", $this->time);
269 $offhours = floor($offset / 3600);
270 $offmins = $offset / 60 - $offhours * 60;
271 return sprintf("%s%02d%02d", $negoffset, $offhours, $offmins);
274 // Format time into NCSA format.
275 function _ncsa_time($time = false) {
279 return date("d/M/Y:H:i:s", $time) .
280 " " . $this->_zone_offset();
283 function write($logfile) {
284 $entry = sprintf('%s %s %s [%s] "%s" %d %d "%s" "%s"',
285 $this->host, $this->ident, $this->user,
286 $this->_ncsa_time($this->time),
287 $this->request, $this->status, $this->size,
288 $this->referer, $this->user_agent);
290 //Error log doesn't provide locking.
291 //error_log("$entry\n", 3, $logfile);
294 if (($fp = fopen($logfile, "a")))
297 fputs($fp, "$entry\n");
307 // c-hanging-comment-ender-p: nil
308 // indent-tabs-mode: nil