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-2013 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
  62.      * if the url is /foo/index.php/bar, its value is /foo/index.php.
  63.      * Warning: if the app is behind a proxy, the path includes the backendBasePath,
  64.      * not the basePath. Use urlScriptPath and urlScriptName to have the
  65.      * "public" url, as needed for the frontend HTTP server
  66.      * @var string 
  67.      */
  68.     public $urlScript;
  69.  
  70.     /**
  71.      * the pathinfo part of the url
  72.      * if the url is /foo/index.php/bar, its value is /bar
  73.      * @var string 
  74.      */
  75.     public $urlPathInfo;
  76.  
  77.     /**
  78.      * the module name
  79.      * @var string 
  80.      */
  81.     public $module = '';
  82.  
  83.     /**
  84.      * the action name ("controller:method")
  85.      * @var string 
  86.      */
  87.     public $action = '';
  88.  
  89.     function __construct(){  }
  90.  
  91.     /**
  92.      * initialize the request : analyse of http request etc..
  93.      */
  94.     public function init(){
  95.         $this->_initUrlData();
  96.         $this->_initParams();
  97.     }
  98.  
  99.     /**
  100.      * analyse the http request and sets the params property
  101.      */
  102.     abstract protected function _initParams();
  103.  
  104.     /**
  105.      * init the url* properties
  106.      */
  107.     protected function _initUrlData(){
  108.         global $gJConfig;
  109.  
  110.         $this->urlScript = $gJConfig->urlengine['urlScript'];
  111.         $this->urlScriptPath = $gJConfig->urlengine['urlScriptPath'];
  112.         $this->urlScriptName = $gJConfig->urlengine['urlScriptName'];
  113.  
  114.         $piiqp $gJConfig->urlengine['pathInfoInQueryParameter'];
  115.         if ($piiqp{
  116.             if (isset($_GET[$piiqp])) {
  117.                 $pathinfo $_GET[$piiqp];
  118.                 unset($_GET[$piiqp]);
  119.             else
  120.                 $pathinfo '';
  121.         else if(isset($_SERVER['PATH_INFO'])){
  122.             $pathinfo $_SERVER['PATH_INFO'];
  123.         else if(isset($_SERVER['ORIG_PATH_INFO'])){
  124.             $pathinfo $_SERVER['ORIG_PATH_INFO'];
  125.         else
  126.             $pathinfo '';
  127.  
  128.         if($pathinfo == $this->urlScript{
  129.             //when php is used as cgi and if there isn't pathinfo in the url
  130.             $pathinfo '';
  131.         }
  132.  
  133.         if ($gJConfig->isWindows && $pathinfo && strpos($pathinfo$this->urlScript!== false){
  134.             //under IIS, we may get  /subdir/index.php/mypath/myaction as PATH_INFO, so we fix it
  135.             $pathinfo substr ($pathinfostrlen ($this->urlScript));
  136.         }
  137.  
  138.         $this->urlPathInfo = $pathinfo;
  139.     }
  140.  
  141.     /**
  142.      * retrieve module and action
  143.      * fills also $module and $action properties
  144.      */
  145.     public function getModuleAction({
  146.         global $gJConfig;
  147.  
  148.         if (isset($this->params['module']&& trim($this->params['module']!= ''{
  149.             $this->module = $this->params['module'];
  150.         }
  151.         else {
  152.             $this->module = $gJConfig->startModule;
  153.         }
  154.  
  155.         if (isset($this->params['action']&& trim($this->params['action']!= ''{
  156.             $this->action = $this->params['action'];
  157.         }
  158.         else {
  159.             if($this->module == $gJConfig->startModule)
  160.                 $this->action = $gJConfig->startAction;
  161.             else {
  162.                 $this->action = 'default:index';
  163.             }
  164.         }
  165.         return array($this->module$this->action);
  166.     }
  167.  
  168.     /**
  169.     * Gets the value of a request parameter. If not defined, gets its default value.
  170.     * @param string  $name           the name of the request parameter
  171.     * @param mixed   $defaultValue   the default returned value if the parameter doesn't exists
  172.     * @param boolean $useDefaultIfEmpty true: says to return the default value if the parameter value is ""
  173.     * @return mixed the request parameter value
  174.     */
  175.     public function getParam($name$defaultValue=null$useDefaultIfEmpty=false){
  176.  
  177.         if(isset($this->params[$name])){
  178.             if($useDefaultIfEmpty && trim($this->params[$name]== ''){
  179.                 return $defaultValue;
  180.             }else{
  181.                 return $this->params[$name];
  182.             }
  183.         }else{
  184.             return $defaultValue;
  185.         }
  186.     }
  187.  
  188.     /**
  189.      * @param jResponse $response the response
  190.      * @return boolean true if the given class is allowed for the current request
  191.      */
  192.     public function isAllowedResponse($response){
  193.         return ( ($response instanceof $this->authorizedResponseClass)
  194.                 || ($c get_class($response)) == 'jResponseRedirect'
  195.                 || $c == 'jResponseRedirectUrl'
  196.                 );
  197.     }
  198.  
  199.     /**
  200.      * get a response object.
  201.      * @param string $name the name of the response type (ex: "html")
  202.      * @param boolean $useOriginal true:don't use the response object redefined by the application
  203.      * @return jResponse the response object
  204.      */
  205.     public function getResponse($type=''$useOriginal false){
  206.         global $gJCoord$gJConfig;
  207.         if($type == ''){
  208.             $type $this->defaultResponseType;
  209.         }
  210.  
  211.         if ($useOriginal)
  212.             $responses &$gJConfig->_coreResponses;
  213.         else
  214.             $responses &$gJConfig->responses;
  215.  
  216.         if(!isset($responses[$type])){
  217.             if ($gJCoord->action{
  218.                $action $gJCoord->action->resource;
  219.                $path $gJCoord->action->getPath();
  220.             }
  221.             else {
  222.                $action $gJCoord->moduleName.'~'.$gJCoord->actionName;
  223.                $path '';
  224.             }
  225.             if ($type == $this->defaultResponseType)
  226.                throw new jException('jelix~errors.default.response.type.unknown',array($action,$type));
  227.             else
  228.                throw new jException('jelix~errors.ad.response.type.unknown',array($action$type$path));
  229.         }
  230.  
  231.         $respclass $responses[$type];
  232.         $path $responses[$type.'.path'];
  233.  
  234.         if(!class_exists($respclass,false))
  235.             require($path);
  236.         $response new $respclass();
  237.  
  238.         if (!$this->isAllowedResponse($response)){
  239.             throw new jException('jelix~errors.ad.response.type.notallowed',array($gJCoord->action->resource$type$gJCoord->action->getPath()));
  240.         }
  241.  
  242.         $gJCoord->response $response;
  243.  
  244.         return $response;
  245.     }
  246.  
  247.     /**
  248.      * @return jResponse 
  249.      */
  250.     public function getErrorResponse($currentResponse{
  251.       try {
  252.          return $this->getResponse(''true);
  253.       }
  254.       catch(Exception $e{
  255.          require_once(JELIX_LIB_CORE_PATH.'response/jResponseText.class.php');
  256.          return new jResponseText();
  257.       }
  258.     }
  259.  
  260.     /**
  261.      * return the ip address of the user
  262.      * @return string the ip
  263.      */
  264.     function getIP({
  265.         if (isset ($_SERVER['HTTP_X_FORWARDED_FOR']&& $_SERVER['HTTP_X_FORWARDED_FOR']){
  266.             // it may content ips of all traversed proxies.
  267.             $list preg_split('/[\s,]+/'$_SERVER['HTTP_X_FORWARDED_FOR']);
  268.             $list array_reverse($list);
  269.             $lastIp '';
  270.             foreach($list as $ip{
  271.                 $ip trim($ip);
  272.                 if(preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/',$ip,$m)) {
  273.                     if ($m[1== '10' || $m[1== '010'
  274.                         || ($m[1== '172' && (intval($m[2]240 == 16))
  275.                         || ($m[1== '192' && $m[2== '168'))
  276.                         break// stop at first private address. we just want the last public address
  277.                     $lastIp $ip;
  278.                 }
  279.                 elseif (preg_match('/^(?:[a-f0-9]{1,4})(?::(?:[a-f0-9]{1,4})){7}$/i',$ip)) {
  280.                     $lastIp $ip;
  281.                 }
  282.             }
  283.             if ($lastIp)
  284.                 return $lastIp;
  285.         }
  286.  
  287.         if (isset ($_SERVER['HTTP_CLIENT_IP']&& $_SERVER['HTTP_CLIENT_IP']){
  288.             return  $_SERVER['HTTP_CLIENT_IP'];
  289.         }else{
  290.             return $_SERVER['REMOTE_ADDR'];
  291.         }
  292.     }
  293.  
  294.     /**
  295.      * return the protocol
  296.      * @return string  http:// or https://
  297.      * @since 1.2
  298.      */
  299.    function getProtocol({
  300.       return (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off' 'https://':'http://');
  301.    }
  302.  
  303.    /**
  304.     * says if this is an ajax request
  305.     * @return boolean true if it is an ajax request
  306.     * @since 1.3a1
  307.     */
  308.    function isAjax({
  309.       if (isset($_SERVER['HTTP_X_REQUESTED_WITH']))
  310.          return ($_SERVER['HTTP_X_REQUESTED_WITH'=== "XMLHttpRequest");
  311.       else
  312.          return false;
  313.    }
  314.  
  315.    /**
  316.     * return the application domain name
  317.     * @return string 
  318.     * @since 1.2.3
  319.     */
  320.    function getDomainName({
  321.       global $gJConfig;
  322.       if ($gJConfig->domainName != ''{
  323.          return $gJConfig->domainName;
  324.       }
  325.       elseif (isset($_SERVER['SERVER_NAME'])) {
  326.          return $_SERVER['SERVER_NAME'];
  327.       }
  328.       elseif (isset($_SERVER['HTTP_HOST'])) {
  329.          if (($pos strpos($_SERVER['HTTP_HOST']':')) !== false)
  330.             return substr($_SERVER['HTTP_HOST'],0$pos);
  331.          return $_SERVER['HTTP_HOST'];
  332.       }
  333.       return '';
  334.    }
  335.  
  336.    /**
  337.     * return the server URI of the application (protocol + server name + port)
  338.     * @return string the serveur uri
  339.     * @since 1.2.4
  340.     */
  341.    function getServerURI($forceHttps null{
  342.       $isHttps (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off');
  343.  
  344.       if ( ($forceHttps === null && $isHttps|| $forceHttps{
  345.          $uri 'https://';
  346.       }
  347.       else {
  348.          $uri 'http://';
  349.       }
  350.  
  351.       $uri .= $this->getDomainName();
  352.       $uri .= $this->getPort($forceHttps);
  353.       return $uri;
  354.    }
  355.  
  356.    /**
  357.     * return the server port of the application
  358.     * @return string the ":port" or empty string
  359.     * @since 1.2.4
  360.     */
  361.    function getPort($forceHttps null{
  362.       $isHttps (isset($_SERVER['HTTPS']&& $_SERVER['HTTPS'&& $_SERVER['HTTPS'!= 'off');
  363.  
  364.       if ($forceHttps === null)
  365.          $https $isHttps;
  366.       else
  367.          $https $forceHttps;
  368.  
  369.       global $gJConfig;
  370.       $forcePort ($https $gJConfig->forceHTTPSPort $gJConfig->forceHTTPPort);
  371.       if ($forcePort === true{
  372.          return '';
  373.       }
  374.       else if ($forcePort// a number
  375.          $port $forcePort;
  376.       }
  377.       else if($isHttps != $https || !isset($_SERVER['SERVER_PORT'])) {
  378.          // the asked protocol is different from the current protocol
  379.          // we use the standard port for the asked protocol
  380.          return '';
  381.       else {
  382.          $port $_SERVER['SERVER_PORT'];
  383.       }
  384.       if (($port === NULL|| ($port == ''|| ($https && $port == '443' || (!$https && $port == '80' ))
  385.          return '';
  386.       return ':'.$port;
  387.    }
  388.  
  389.    /**
  390.     * call it when you want to read the content of the body of a request
  391.     * when the method is not GET or POST
  392.     * @return mixed    array of parameters or a single string when the content-type is unknown
  393.     * @since 1.2
  394.     */
  395.    public function readHttpBody({
  396.       $input file_get_contents("php://input");
  397.       $values array();
  398.  
  399.       if (strpos($_SERVER["CONTENT_TYPE"]"application/x-www-form-urlencoded"=== 0{
  400.          parse_str($input$values);
  401.          return $values;
  402.       }
  403.       else if (strpos($_SERVER["CONTENT_TYPE"]"multipart/form-data"=== 0{
  404.  
  405.          if (!preg_match("/boundary=([a-zA-Z0-9]+)/"$_SERVER["CONTENT_TYPE"]$m))
  406.             return $input;
  407.  
  408.          $parts explode('--'.$m[1]$input);
  409.          foreach($parts as $part{
  410.             if (trim($part== '' || $part == '--')
  411.                continue;
  412.             list($header$valueexplode("\r\n\r\n"$part);
  413.             if (preg_match('/content\-disposition\:(?: *)form\-data\;(?: *)name="([^"]+)"(\;(?: *)filename="([^"]+)")?/i'$header$m)) {
  414.                if (isset($m[2]&& $m[3!= '')
  415.                   $return[$m[1]] array$m[3]$value);
  416.                else
  417.                   $return[$m[1]] $value;
  418.             }
  419.          }
  420.          if (count($values))
  421.             return $values;
  422.          else
  423.             return $input;
  424.       }
  425.       else {
  426.          return $input;
  427.       }
  428.    }
  429.  
  430.    private $_headers null;
  431.  
  432.    private function _generateHeaders({
  433.       if (is_null($this->_headers)) {
  434.          if (function_exists('apache_response_headers')) {
  435.             $this->_headers apache_request_headers();
  436.          }
  437.          else {
  438.             $this->_headers array();
  439.  
  440.             foreach($_SERVER as $key => $value{
  441.                if (substr($key,0,5== "HTTP_"{
  442.                   $key str_replace(" ""-",
  443.                           ucwords(strtolower(str_replace('_'' 'substr($key,5)))));
  444.                   $this->_headers[$key$value;
  445.                }
  446.             }
  447.          }
  448.       }
  449.    }
  450.  
  451.    public function header($name{
  452.       $this->_generateHeaders();
  453.       if (isset($this->_headers[$name])) {
  454.          return $this->_headers[$name];
  455.       }
  456.       return null;
  457.    }
  458.  
  459.    public function headers({
  460.       $this->_generateHeaders();
  461.       return $this->_headers;
  462.    }
  463.  
  464.  
  465. }

Documentation generated on Wed, 24 Sep 2014 22:01:13 +0200 by phpDocumentor 1.4.3