]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/Request.php
Jeff's hacks II.
[SourceForge/phpwiki.git] / lib / Request.php
1 <?php rcs_id('$Id: Request.php,v 1.1 2001-09-18 19:16:23 dairiki Exp $');
2
3 // FIXME: write log entry.
4
5 class Request {
6         
7     function Request() {
8         
9         $this->_fix_magic_quotes_gpc();
10
11         switch($this->get('REQUEST_METHOD')) {
12         case 'GET':
13         case 'HEAD':
14             $this->args = &$GLOBALS['HTTP_GET_VARS'];
15             break;
16         case 'POST':
17             $this->args = &$GLOBALS['HTTP_POST_VARS'];
18             break;
19         default:
20             $this->args = array();
21             break;
22         }
23         
24         $this->session = new Request_SessionVars;
25         $this->cookies = new Request_CookieVars;
26
27         $this->_log_entry = new Request_AccessLogEntry($this);
28         
29         $TheRequest = $this;
30     }
31
32     function get($key) {
33         $vars = &$GLOBALS['HTTP_SERVER_VARS'];
34
35         if (isset($vars[$key]))
36             return $vars[$key];
37
38         switch ($key) {
39         case 'REMOTE_HOST':
40             $addr = $vars['REMOTE_ADDR'];
41             if (defined('ENABLE_REVERSE_DNS') && ENABLE_REVERSE_DNS)
42                 return $vars[$key] = gethostbyaddr($addr);
43             else
44                 return $addr;
45         default:
46             return false;
47         }
48     }
49
50     function getArg($key) {
51         if (isset($this->args[$key]))
52             return $this->args[$key];
53         return false;
54     }
55
56     function setArg($key, $val) {
57         $this->args[$key] = $val;
58     }
59
60     
61     function redirect($url) {
62         header("Location: $url");
63         $this->_log_entry->setStatus(302);
64     }
65
66     function compress_output() {
67         if (function_exists('ob_gzhandler')) {
68             ob_start('ob_gzhandler');
69             $this->_is_compressing_output = true;
70         }
71     }
72
73     function finish() {
74         if (!empty($this->_is_compressing_output))
75             ob_end_flush();
76     }
77     
78
79     function getSessionVar($key) {
80         return $this->session->get($key);
81     }
82     function setSessionVar($key, $val) {
83         return $this->session->set($key, $val);
84     }
85     function deleteSessionVar($key) {
86         return $this->session->delete($key);
87     }
88
89     function getCookieVar($key) {
90         return $this->cookies->get($key);
91     }
92     function setCookieVar($key, $val, $lifetime_in_days = false) {
93         return $this->cookies->set($key, $val, $lifetime_in_days);
94     }
95     function deleteCookieVar($key) {
96         return $this->cookies->delete($key);
97     }
98     
99     function getUploadedFile($key) {
100         return Request_UploadedFile::getUploadedFile($key);
101     }
102     
103
104     function _fix_magic_quotes_gpc() {
105         $needs_fix = array('HTTP_POST_VARS',
106                            'HTTP_GET_VARS',
107                            'HTTP_COOKIE_VARS',
108                            'HTTP_SERVER_VARS',
109                            'HTTP_POST_FILES');
110         
111         // Fix magic quotes.
112         if (get_magic_quotes_gpc()) {
113             foreach ($needs_fix as $vars)
114                 $this->_stripslashes($GLOBALS[$vars]);
115         }
116     }
117
118     function _stripslashes(&$var) {
119         if (is_array($var)) {
120             foreach ($var as $key => $val)
121                 $this->_stripslashes($var[$key]);
122         }
123         elseif (is_string($var))
124             $var = stripslashes($var);
125     }
126 }
127
128 class Request_SessionVars {
129     function Request_SessionVars() {
130         session_start();
131     }
132
133     function get($key) {
134         $vars = &$GLOBALS['HTTP_SESSION_VARS'];
135         if (isset($vars[$key]))
136             return $vars[$key];
137         return false;
138     }
139
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;
145         }
146         $vars[$key] = $val;
147         session_register($key);
148     }
149     
150     function delete($key) {
151         $vars = &$GLOBALS['HTTP_SESSION_VARS'];
152         if (ini_get('register_globals'))
153             unset($GLOBALS[$key]);
154         unset($vars[$key]);
155         session_unregister($key);
156     }
157 }
158
159 class Request_CookieVars {
160
161     function get($key) {
162         $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
163         if (isset($vars[$key])) {
164             @$val = unserialize($vars[$key]);
165             if (!empty($val))
166                 return $val;
167         }
168         return false;
169     }
170         
171     function set($key, $val, $persist_days = false) {
172         $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
173
174         if (is_numeric($persist_days)) {
175             $expires = time() + (24 * 3600) * $persist_days;
176         }
177         else {
178             $expires = 0;
179         }
180         
181         $packedval = serialize($val);
182         $vars[$key] = $packedval;
183         setcookie($key, $packedval, $expires, '/');
184     }
185
186     function delete($key) {
187         $vars = &$GLOBALS['HTTP_COOKIE_VARS'];
188         setcookie($key);
189         unset($vars[$key]);
190     }
191 }
192
193 class Request_UploadedFile {
194     function getUploadedFile($postname) {
195         global $HTTP_POST_FILES;
196
197         if (!isset($HTTP_POST_FILES[$postname]))
198             return false;
199         
200         $fileinfo = &$HTTP_POST_FILES[$postname];
201         if (!is_uploaded_file($fileinfo['temp_name']))
202             return false;       // possible malicious attack.
203
204         return new Request_UploadedFile($fileinfo);
205     }
206     
207     function Request_UploadedFile($fileinfo) {
208         $this->_info = $fileinfo;
209     }
210
211     function getSize() {
212         return $this->_info['size'];
213     }
214
215     function getName() {
216         return $this->_info['name'];
217     }
218
219     function getType() {
220         return $this->_info['type'];
221     }
222
223     function open() {
224         if ( ($fd = fopen($this->_info['tmp_name'], "rb")) ) {
225             // Dump http headers.
226             while ( ($header = fgets($fd, 4096)) )
227                 if (trim($header) == '')
228                     break;
229         }
230         return $fd;
231     }
232
233     function getContents() {
234         $fd = $this->open();
235         $data = fread($fd, $this->getSize());
236         fclose($fd);
237         return $data;
238     }
239 }
240
241 class Request_AccessLogEntry
242 {
243    function AccessLogEntry ($request) {
244       $this->host = $req->get('REMOTE_HOST');
245       $this->ident = $req->get('REMOTE_IDENT');
246       if (!$this->ident)
247           $this->ident = '-';
248       $this->user = '-';
249       $this->time = time();
250       $this->request = join(' ', array($req->get('REQUEST_METHOD'),
251                                        $req->get('REQUEST_URI'),
252                                        $req->get('SERVER_PROTOCOL')));
253       $this->status = 200;
254       $this->size = 0;
255       $this->referer = (string) $req->get('HTTP_REFERER');
256       $this->user_agent = (string) $req->get('HTTP_USER_AGENT');
257    }
258
259    //
260    // Returns zone offset, like "-0800" for PST.
261    //
262    function _zone_offset () {
263       $offset = date("Z", $this->time);
264       if ($offset < 0)
265       {
266          $negoffset = "-";
267          $offset = -$offset;
268       }
269       $offhours = floor($offset / 3600);
270       $offmins = $offset / 60 - $offhours * 60;
271       return sprintf("%s%02d%02d", $negoffset, $offhours, $offmins);
272    }
273   
274    // Format time into NCSA format.
275    function _ncsa_time($time = false) {
276       if (!$time)
277          $time = time();
278
279       return date("d/M/Y:H:i:s", $time) .
280          " " . $this->_zone_offset();
281    }
282
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);
289       
290       //Error log doesn't provide locking.
291       //error_log("$entry\n", 3, $logfile);
292
293       // Alternate method 
294       if (($fp = fopen($logfile, "a")))
295       {
296          flock($fp, LOCK_EX);
297          fputs($fp, "$entry\n");
298          fclose($fp);
299       }
300    }
301 }
302
303 // Local Variables:
304 // mode: php
305 // tab-width: 8
306 // c-basic-offset: 4
307 // c-hanging-comment-ender-p: nil
308 // indent-tabs-mode: nil
309 // End:   
310 ?>