Source for file jRequest.class.php

Documentation is available at jRequest.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage core
  5. @author     Laurent Jouanneau
  6. @contributor Yannick Le Guédart
  7. @copyright  2005-2011 Laurent Jouanneau, 2010 Yannick Le Guédart
  8. @link        http://www.jelix.org
  9. @licence    GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10. */
  11.  
  12.  
  13. /**
  14.  * base class for object which retrieve all parameters of an http request. The
  15.  * process depends on the type of request (ex: xmlrpc..)
  16.  *
  17.  * @package  jelix
  18.  * @subpackage core
  19.  */
  20. abstract class jRequest {
  21.  
  22.    /**
  23.     * request parameters
  24.     * could set from $_GET, $_POST, or from data processing of $HTTP_RAW_POST_DATA
  25.     * @var array 
  26.     */
  27.     public $params;
  28.  
  29.     /**
  30.      * the request type code
  31.      * @var string 
  32.      */
  33.     public $type;
  34.  
  35.     /**
  36.      * the type of the default response
  37.      * @var string 
  38.      */
  39.     public $defaultResponseType = '';
  40.  
  41.     /**
  42.      * @var string the name of the base class for an allowed response for the current request
  43.      */
  44.     public $authorizedResponseClass = '';
  45.  
  46.     /**
  47.      * the path of the entry point in the url (basePath included)
  48.      * if the url is /foo/index.php/bar, its value is /foo/
  49.      * @var string 
  50.      */
  51.     public $urlScriptPath;
  52.  
  53.     /**
  54.      * the name of the entry point
  55.      * if the url is /foo/index.php/bar, its value is index.php
  56.      * @var string 
  57.      */
  58.     public $urlScriptName;
  59.  
  60.     /**
  61.      * the path to the entry point in the url (basePath included)
  62.      * if the url is /foo/index.php/bar, its value is /foo/index.php
  63.      * @var string 
  64.      */
  65.     public $urlScript;
  66.  
  67.     /**
  68.      * the pathinfo part of the url
  69.      * if the url is /foo/index.php/bar, its value is /bar
  70.      * @var string 
  71.      */
  72.     public $urlPathInfo;
  73.  
  74.     function __construct(){  }
  75.  
  76.     /**
  77.      * initialize the request : analyse of http request etc..
  78.      */
  79.     public function init(){
  80.         $this->_initUrlData();
  81.         $this->_initParams();
  82.     }
  83.  
  84.     /**
  85.      * analyse the http request and sets the params property
  86.      */
  87.     abstract protected function _initParams();
  88.  
  89.     /**
  90.      * init the url* properties
  91.      */
  92.     protected function _initUrlData(){
  93.         global $gJConfig;
  94.  
  95.         $this->urlScript = $gJConfig->urlengine['urlScript'];
  96.         $this->urlScriptPath = $gJConfig->urlengine['urlScriptPath'];
  97.         $this->urlScriptName = $gJConfig->urlengine['urlScriptName'];
  98.  
  99.         $piiqp $gJConfig->urlengine['pathInfoInQueryParameter'];
  100.         if ($piiqp{
  101.             if (isset($_GET[$piiqp])) {
  102.                 $pathinfo $_GET[$piiqp];
  103.                 unset($_GET[$piiqp]);
  104.             else
  105.                 $pathinfo '';
  106.         else if(isset($_SERVER['PATH_INFO'])){
  107.             $pathinfo $_SERVER['PATH_INFO'];
  108.         else if(isset($_SERVER['ORIG_PATH_INFO'])){
  109.             $pathinfo $_SERVER['ORIG_PATH_INFO'];
  110.         else
  111.             $pathinfo '';
  112.  
  113.         if($pathinfo == $this->urlScript{
  114.             //when php is used as cgi and if there isn't pathinfo in the url
  115.             $pathinfo '';
  116.         }
  117.  
  118.         if ($gJConfig->isWindows && $pathinfo && strpos($pathinfo$this->urlScript!== false){
  119.             //under IIS, we may get  /subdir/index.php/mypath/myaction as PATH_INFO, so we fix it
  120.             $pathinfo substr ($pathinfostrlen ($this->urlScript));
  121.         }
  122.  
  123.         $this->urlPathInfo = $pathinfo;
  124.     }
  125.  
  126.     /**
  127.     * Gets the value of a request parameter. If not defined, gets its default value.
  128.     * @param string  $name           the name of the request parameter
  129.     * @param mixed   $defaultValue   the default returned value if the parameter doesn't exists
  130.     * @param boolean $useDefaultIfEmpty true: says to return the default value if the parameter value is ""
  131.     * @return mixed the request parameter value
  132.     */
  133.     public function getParam($name$defaultValue=null$useDefaultIfEmpty=false){
  134.  
  135.         if(isset($this->params[$name])){
  136.             if($useDefaultIfEmpty && trim($this->params[$name]== ''){
  137.                 return $defaultValue;
  138.             }else{
  139.                 return $this->params[$name];
  140.             }
  141.         }else{
  142.             return $defaultValue;
  143.         }
  144.     }
  145.  
  146.     /**
  147.      * @param jResponse $response the response
  148.      * @return boolean true if the given class is allowed for the current request
  149.      */
  150.     public function isAllowedResponse($response){
  151.         return ($response instanceof $this->authorizedResponseClass);
  152.     }
  153.  
  154.     /**
  155.      * get a response object.
  156.      * @param string $name the name of the response type (ex: "html")
  157.      * @param boolean $useOriginal true:don't use the response object redefined by the application
  158.      * @return jResponse the response object
  159.      */
  160.     public function getResponse($type=''$useOriginal false){
  161.         global $gJCoord$gJConfig;
  162.         if($type == ''){
  163.             $type $this->defaultResponseType;
  164.         }
  165.  
  166.         if ($useOriginal)
  167.             $responses &$gJConfig->_coreResponses;
  168.         else
  169.             $responses &$gJConfig->responses;
  170.  
  171.         if(!isset($responses[$type])){
  172.             if ($gJCoord->action{
  173.                $action $gJCoord->action->resource;
  174.                $path $gJCoord->action->getPath();
  175.             }
  176.             else {
  177.                $action $gJCoord->moduleName.'~'.$gJCoord->actionName;
  178.                $path '';
  179.             }
  180.             if ($type == $this->defaultResponseType)
  181.                throw new jException('jelix~errors.default.response.type.unknown',array($action,$type));
  182.             else
  183.                throw new jException('jelix~errors.ad.response.type.unknown',array($action$type$path));
  184.         }
  185.  
  186.         $respclass $responses[$type];
  187.         $path $responses[$type.'.path'];
  188.  
  189.         if(!class_exists($respclass,false))
  190.             require($path);
  191.         $response new $respclass();
  192.  
  193.         if (!$this->isAllowedResponse($response)){
  194.             throw new jException('jelix~errors.ad.response.type.notallowed',array($gJCoord->action->resource$type$gJCoord->action->getPath()));
  195.         }
  196.  
  197.         $gJCoord->response $response;
  198.  
  199.         return $response;
  200.     }
  201.  
  202.     /**
  203.      * @return jResponse 
  204.      */
  205.     public function getErrorResponse($currentResponse{
  206.       try {
  207.          return $this->getResponse(''true);
  208.       }
  209.       catch(Exception $e{
  210.          require_once(JELIX_LIB_CORE_PATH.'response/jResponseText.class.php');
  211.          return new jResponseText();
  212.       }
  213.     }
  214.  
  215.     /**
  216.      * return the ip address of the user
  217.      * @return string the ip
  218.      */
  219.     function getIP({
  220.         if (isset ($_SERVER['HTTP_X_FORWARDED_FOR']&& $_SERVER['HTTP_X_FORWARDED_FOR']){
  221.             // it may content ips of all traversed proxies.
  222.             $list preg_split('/[\s,]+/'$_SERVER['HTTP_X_FORWARDED_FOR']);
  223.             $list array_reverse($list);
  224.             $lastIp '';
  225.             foreach($list as $ip{
  226.                 $ip trim($ip);
  227.                 if(preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/',$ip,$m)) {
  228.                     if ($m[1== '10' || $m[1== '010'
  229.                         || ($m[1== '172' && (intval($m[2]240 == 16))
  230.                         || ($m[1== '192' && $m[2== '168'))
  231.                         break// stop at first private address. we just want the last public address
  232.                     $lastIp $ip;
  233.                 }
  234.                 elseif (preg_match('/^(?:[a-f0-9]{1,4})(?::(?:[a-f0-9]{1,4})){7}$/i',$ip)) {
  235.                     $lastIp $ip;
  236.                 }
  237.             }
  238.             if ($lastIp)
  239.                 return $lastIp;
  240.         }
  241.  
  242.         if (isset ($_SERVER['HTTP_CLIENT_IP']&& $_SERVER['HTTP_CLIENT_IP']){
  243.             return  $_SERVER['HTTP_CLIENT_IP'];
  244.         }else{
  245.             return $_SERVER['REMOTE_ADDR'];
  246.         }
  247.     }
  248.  
  249.     /**
  250.      * return the protocol
  251.      * @return string  http:// or https://
  252.      * @since 1.2
  253.      */
  254.    function getProtocol({
  255.       return (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off' 'https://':'http://');
  256.    }
  257.  
  258.    /**
  259.     * says if this is an ajax request
  260.     * @return boolean true if it is an ajax request
  261.     * @since 1.3a1
  262.     */
  263.    function isAjax({
  264.       if (isset($_SERVER['HTTP_X_REQUESTED_WITH']))
  265.          return ($_SERVER['HTTP_X_REQUESTED_WITH'=== "XMLHttpRequest");
  266.       else
  267.          return false;
  268.    }
  269.  
  270.    /**
  271.     * return the application domain name
  272.     * @return string 
  273.     * @since 1.2.3
  274.     */
  275.    function getDomainName({
  276.       global $gJConfig;
  277.       if ($gJConfig->domainName != ''{
  278.          return $gJConfig->domainName;
  279.       }
  280.       elseif (isset($_SERVER['SERVER_NAME'])) {
  281.          return $_SERVER['SERVER_NAME'];
  282.       }
  283.       elseif (isset($_SERVER['HTTP_HOST'])) {
  284.          if (($pos strpos($_SERVER['HTTP_HOST']':')) !== false)
  285.             return substr($_SERVER['HTTP_HOST'],0$pos);
  286.          return $_SERVER['HTTP_HOST'];
  287.       }
  288.       return '';
  289.    }
  290.  
  291.    /**
  292.     * return the server URI of the application (protocol + server name + port)
  293.     * @return string the serveur uri
  294.     * @since 1.2.4
  295.     */
  296.    function getServerURI($forceHttps null{
  297.       $isHttps (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off');
  298.  
  299.       if ( ($forceHttps === null && $isHttps|| $forceHttps{
  300.          $uri 'https://';
  301.       }
  302.       else {
  303.          $uri 'http://';
  304.       }
  305.  
  306.       $uri .= $this->getDomainName();
  307.       $uri .= $this->getPort($forceHttps);
  308.       return $uri;
  309.    }
  310.  
  311.    /**
  312.     * return the server port of the application
  313.     * @return string the ":port" or empty string
  314.     * @since 1.2.4
  315.     */
  316.    function getPort($forceHttps null{
  317.       $isHttps (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off');
  318.  
  319.       if ($forceHttps === null)
  320.          $https $isHttps;
  321.       else
  322.          $https $forceHttps;
  323.  
  324.       global $gJConfig;
  325.       $forcePort ($https $gJConfig->forceHTTPSPort $gJConfig->forceHTTPPort);
  326.       if ($forcePort === true{
  327.          return '';
  328.       }
  329.       else if ($forcePort// a number
  330.          $port $forcePort;
  331.       }
  332.       else if($isHttps != $https{
  333.          // the asked protocol is different from the current protocol
  334.          // we use the standard port for the asked protocol
  335.          return '';
  336.       else {
  337.          $port $_SERVER['SERVER_PORT'];
  338.       }
  339.       if (($https && $port == '443' || (!$https && $port == '80' ))
  340.          return '';
  341.       return ':'.$port;
  342.    }
  343.  
  344.    /**
  345.     * call it when you want to read the content of the body of a request
  346.     * when the method is not GET or POST
  347.     * @return mixed    array of parameters or a single string when the content-type is unknown
  348.     * @since 1.2
  349.     */
  350.    public function readHttpBody({
  351.       $input file_get_contents("php://input");
  352.       $values array();
  353.  
  354.       if (strpos($_SERVER["CONTENT_TYPE"]"application/x-www-url-encoded"== 0{
  355.          parse_str($input$values);
  356.          return $values;
  357.       }
  358.       else if (strpos($_SERVER["CONTENT_TYPE"]"multipart/form-data"== 0{
  359.  
  360.          if (!preg_match("/boundary=([a-zA-Z0-9]+)/"$_SERVER["CONTENT_TYPE"]$m))
  361.             return $input;
  362.  
  363.          $parts explode('--'.$m[1]$input);
  364.          foreach($parts as $part{
  365.             if (trim($part== '' || $part == '--')
  366.                continue;
  367.             list($header$valueexplode("\r\n\r\n"$part);
  368.             if (preg_match('/content\-disposition\:(?: *)form\-data\;(?: *)name="([^"]+)"(\;(?: *)filename="([^"]+)")?/i'$header$m)) {
  369.                if (isset($m[2]&& $m[3!= '')
  370.                   $return[$m[1]] array$m[3]$value);
  371.                else
  372.                   $return[$m[1]] $value;
  373.             }
  374.          }
  375.          if (count($values))
  376.             return $values;
  377.          else
  378.             return $input;
  379.       }
  380.       else {
  381.          return $input;
  382.       }
  383.    }
  384.  
  385.    private $_headers null;
  386.  
  387.    private function _generateHeaders({
  388.       if (is_null($this->_headers)) {
  389.          if (function_exists('apache_response_headers')) {
  390.             $this->_headers apache_request_headers();
  391.          }
  392.          else {
  393.             $this->_headers array();
  394.  
  395.             foreach($_SERVER as $key => $value{
  396.                if (substr($key,0,5== "HTTP_"{
  397.                   $key str_replace(" ""-",
  398.                           ucwords(strtolower(str_replace('_'' 'substr($key,5)))));
  399.                   $this->_headers[$key$value;
  400.                }
  401.             }
  402.          }
  403.       }
  404.    }
  405.  
  406.    public function header($name{
  407.       $this->_generateHeaders();
  408.       if (isset($this->_headers[$name])) {
  409.          return $this->_headers[$name];
  410.       }
  411.       return null;
  412.    }
  413.  
  414.    public function headers({
  415.       $this->_generateHeaders();
  416.       return $this->_headers;
  417.    }
  418.  
  419.  
  420. }

Documentation generated on Mon, 19 Sep 2011 14:13:19 +0200 by phpDocumentor 1.4.3