root/trunk/lib/SGL/Request.php

Revision 4422, 9.6 kB (checked in by demian, 3 years ago)

to force a browser request, add GET param force_sgl_browser_request=1

  • Property svn:eol-style set to native
Line 
1 <?php
2 /* Reminder: always indent with 4 spaces (no tabs). */
3 // +---------------------------------------------------------------------------+
4 // | Copyright (c) 2010, Demian Turner                                         |
5 // | All rights reserved.                                                      |
6 // |                                                                           |
7 // | Redistribution and use in source and binary forms, with or without        |
8 // | modification, are permitted provided that the following conditions        |
9 // | are met:                                                                  |
10 // |                                                                           |
11 // | o Redistributions of source code must retain the above copyright          |
12 // |   notice, this list of conditions and the following disclaimer.           |
13 // | o Redistributions in binary form must reproduce the above copyright       |
14 // |   notice, this list of conditions and the following disclaimer in the     |
15 // |   documentation and/or other materials provided with the distribution.    |
16 // | o The names of the authors may not be used to endorse or promote          |
17 // |   products derived from this software without specific prior written      |
18 // |   permission.                                                             |
19 // |                                                                           |
20 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
21 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
22 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
23 // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
24 // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
25 // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
26 // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
27 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
28 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
29 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
30 // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
31 // |                                                                           |
32 // +---------------------------------------------------------------------------+
33 // | Seagull 1.0                                                               |
34 // +---------------------------------------------------------------------------+
35 // | Request.php                                                               |
36 // +---------------------------------------------------------------------------+
37 // | Author:   Demian Turner <demian@phpkitchen.com>                           |
38 // +---------------------------------------------------------------------------+
39 // $Id: Permissions.php,v 1.5 2005/02/03 11:29:01 demian Exp $
40
41 define('SGL_REQUEST_BROWSER',   1);
42 define('SGL_REQUEST_CLI',       2);
43 define('SGL_REQUEST_AJAX',      3);
44 define('SGL_REQUEST_XMLRPC',    4);
45 define('SGL_REQUEST_AMF',       5);
46
47 /**
48  * Loads Request driver, provides a number of filtering methods.
49  *
50  * @package SGL
51  * @author  Demian Turner <demian@phpkitchen.com>
52  * @version $Revision: 1.36 $
53  */
54 class SGL_Request
55 {
56     var $aProps;
57
58     function init($type = null)
59     {
60         if ($this->isEmpty()) {
61             $type = (is_null($type))
62                 ? $this->_getRequestType()
63                 : $type;
64             $typeName = $this->constantToString($type);
65             $file = SGL_CORE_DIR . '/Request/' . $typeName . '.php';
66             if (!is_file($file)) {
67               return PEAR::raiseError('Request driver could not be located',
68                   SGL_ERROR_NOFILE);
69             }
70             require_once $file;
71             $class = 'SGL_Request_' . $typeName;
72             if (!class_exists($class)) {
73               return PEAR::raiseError('Request driver class does not exist',
74                   SGL_ERROR_NOCLASS);
75             }
76             $obj = new $class();
77             error_log('##########   Req type: '.$class);
78             return $obj;
79         }
80     }
81
82     function constantToString($constant)
83     {
84         switch($constant) {
85         case SGL_REQUEST_BROWSER:
86             $ret = 'Browser';
87             if (SGL_Config::get('site.inputUrlHandlers') == 'Horde_Routes') {
88                 $ret = 'Browser2';
89             }
90             break;
91
92         case SGL_REQUEST_CLI:
93             $ret = 'Cli';
94             break;
95
96         case SGL_REQUEST_AJAX:
97             $ret = 'Ajax';
98             if (SGL_Config::get('site.inputUrlHandlers') == 'Horde_Routes') {
99                 $ret = 'Ajax2';
100             }
101             break;
102
103         case SGL_REQUEST_AMF:
104             $ret = 'Amf';
105             break;
106         }
107         return $ret;
108     }
109
110     /**
111      * Used internally to determine request type before Request strategy instantiated.
112      *
113      * @return integer
114      */
115     function _getRequestType()
116     {
117         if (SGL::runningFromCLI()) {
118             $ret = SGL_REQUEST_CLI;
119
120         } elseif (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
121                         $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && empty($_GET['force_sgl_browser_request'])) {
122             $ret = SGL_REQUEST_AJAX;
123
124         } elseif (isset($_SERVER['CONTENT_TYPE']) &&
125             $_SERVER['CONTENT_TYPE'] == 'application/x-amf') {
126             $ret = SGL_REQUEST_AMF;
127
128         } else {
129             $ret = SGL_REQUEST_BROWSER;
130         }
131         return $ret;
132     }
133
134     /**
135      * Returns a singleton Request instance.
136      *
137      * example usage:
138      * $req =  SGL_Request::singleton();
139      * warning: in order to work correctly, the request
140      * singleton must be instantiated statically and
141      * by reference
142      *
143      * @access  public
144      * @static
145      * @return  mixed           reference to Request object
146      */
147     function singleton($forceNew = false, $type = null)
148     {
149         static $instance;
150
151         if (!isset($instance) || $forceNew) {
152             $obj = new SGL_Request();
153             $instance = $obj->init($type);
154         }
155         return $instance;
156     }
157
158     function isEmpty()
159     {
160         return count($this->aProps) ? false : true;
161     }
162
163     /**
164      * Returns constant representing request type.
165      *
166      * @return integer
167      */
168     function getType()
169     {
170         return $this->type;
171     }
172
173     function merge($aHash)
174     {
175         $firstKey = key($aHash);
176         if (!array_key_exists($firstKey, $this->aProps)) {
177             $this->aProps = array_merge_recursive($this->aProps, $aHash);
178         }
179     }
180
181     /**
182      * Retrieves values from Request object.
183      *
184      * @access  public
185      * @param   mixed   $paramName  Request param name
186      * @param   boolean $allowTags  If html/php tags are allowed or not
187      * @return  mixed               Request param value or null if not exists
188      */
189     function get($key, $allowTags = false)
190     {
191         if (isset($this->aProps[$key])) {
192
193             //  don't operate on reference to avoid segfault :-(
194             $copy = $this->aProps[$key];
195
196             //  if html not allowed, run an enhanced strip_tags()
197             if (!$allowTags) {
198                 $clean = SGL_String::clean($copy);
199
200             //  if html is allowed, at least remove javascript
201             } else {
202                 $clean = SGL_String::removeJs($copy);
203             }
204             $this->set($key, $clean);
205             return $this->aProps[$key];
206
207         } else {
208             return null;
209         }
210     }
211
212     /**
213      * Set a value for Request object.
214      *
215      * @access  public
216      * @param   mixed   $name   Request param name
217      * @param   mixed   $value  Request param value
218      * @return  void
219      */
220     function set($key, $value)
221     {
222         $this->aProps[$key] = $value;
223     }
224
225     function add($aParams)
226     {
227         $this->aProps = array_merge_recursive($this->aProps, $aParams);
228     }
229
230     function reset()
231     {
232         unset($this->aProps);
233         $this->aProps = array();
234     }
235     /**
236      * Return an array of all Request properties.
237      *
238      * @return array
239      */
240     function getAll()
241     {
242         return $this->aProps;
243     }
244
245     function getModuleName()
246     {
247         if (isset($this->aProps['managerName'])) {
248             $ret = $this->aProps['moduleName'];
249         } else {
250             $ret = SGL_Config::get('site.defaultModule');
251         }
252         return $ret;
253     }
254
255     function getManagerName()
256     {
257         if (isset( $this->aProps['managerName'])) {
258             $ret = $this->aProps['managerName'];
259         } else {
260             $ret = 'default';
261         }
262         return $ret;
263     }
264
265     function getActionName()
266     {
267         if ( isset($this->aProps['action'])) {
268             $ret = $this->aProps['action'];
269         } else {
270             $ret = 'default';
271         }
272         return $ret;
273     }
274
275     function getUri()
276     {
277         $uri = '';
278         $sglSessionName = SGL_Config::get('cookie.name');
279
280         foreach ($this->aProps as $key => $value) {
281             if (is_array($value)) {
282                 continue;
283             }
284             if (!empty($value) && $key != 'lang' && strpos($key, $sglSessionName) === false) {
285                 $uri .= ($key == 'moduleName' || $key == 'managerName')
286                     ? $value . '/'
287                     : $key . '/' . $value . '/';
288             }
289         }
290         // remove trailing slash
291         $uri = preg_replace('/\/$/','',$uri);
292
293         return $uri;
294     }
295
296     function debug()
297     {
298         $c = SGL_Config::singleton();
299         $c->set('site', array('blocksEnabled' => 0));
300         print '<pre>';
301         print_r($this->aProps);
302     }
303 }
304 ?>
Note: See TracBrowser for help on using the browser.