developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #831: server_name_significant.2.diff

File server_name_significant.2.diff, 16.6 KB (added by pulsation, 12 years ago)

This patch doesn't modify jCoordinator, and fixes bugs of the first one.

  • plugins/urls/significant/jSignificantUrlsCompiler.class.php

     
    8989        $createUrlContent="<?php \n";
    9090        $defaultEntrypoints=array();
    9191
     92        $serverNames = array();
     93       
    9294        foreach($xml->children() as $name=>$tag){
    9395           if(!preg_match("/^(.*)entrypoint$/", $name,$m)){
    9496               //TODO : erreur
     
    107109           // alors on indique une regle supplementaire que matcherons
    108110           // toutes les urls qui ne correspondent pas aux autres rêgles
    109111           if($isDefault){
    110              $createUrlInfos['@'.$requestType]=array(2,$entryPoint, $isHttps);
     112             $createUrlInfos['@'.$requestType]=array(2,FALSE, $entryPoint, $isHttps);
    111113           }
    112114
    113115           $parseContent = "<?php \n";
    114116           foreach($tag->url as $url){
    115117               $module = (string)$url['module'];
     118               
     119               if (isset($url['servername'])) {
     120                   $servername  = (string)$url['servername'];
     121               } else {
     122                   $servername  = FALSE;
     123               }
     124
    116125               if(isset($url['https'])){
    117126                   $urlhttps=(((string)$url['https']) == 'true');
    118127               }else{
     
    127136               // si il y a juste un module indiqué alors on sait que toutes les actions
    128137               // concernant ce module passeront par ce point d'entrée.
    129138               if(!$isDefault && !isset($url['action']) && !isset($url['handler'])){
    130                  $parseInfos[]=array($module, '', '/.*/', array(), array(), array(), false );
    131                  $createUrlInfos[$module.'~*@'.$requestType] = array(3,$urlep, $urlhttps);
     139                 $parseInfos[]=array($servername, $module, '', '/.*/', array(), array(), array(), false );
     140                 $createUrlInfos[$module.'~*@'.$requestType] = array(3,$servername, $urlep, $urlhttps);
    132141                 continue;
    133142               }
    134143
     
    167176                    $action = '*';
    168177                  }
    169178                  $createUrlContent.="include_once('".$s->getPath()."');\n";
    170                   $parseInfos[]=array($module, $action, $selclass, $actionOverride );
    171                   $createUrlInfos[$module.'~'.$action.'@'.$requestType] = array(0,$urlep, $urlhttps, $selclass);
     179                  $parseInfos[]=array($servername, $module, $action, $selclass, $actionOverride );
     180                  $createUrlInfos[$module.'~'.$action.'@'.$requestType] = array(0,$servername, $urlep, $urlhttps, $selclass);
    172181                  if($actionOverride){
    173182                     foreach($actionOverride as $ao){
    174                         $createUrlInfos[$module.'~'.$ao.'@'.$requestType] = array(0,$urlep,$urlhttps, $selclass);
     183                        $createUrlInfos[$module.'~'.$ao.'@'.$requestType] = array(0,$servername, $urlep,$urlhttps, $selclass);
    175184                     }
    176185                  }
    177186                  continue;
    178187               }
    179 
     188                                if ($servername)
     189                        $serverNames[$servername] = Array(      'module'        => $module,
     190                                                                                                'action'        => $action);
     191               
    180192               $listparam=array();
    181193               $escapes = array();
    182194               if(isset($url['pathinfo'])){
     
    234246                        $regexppath.='\/?';
    235247                    }
    236248               }
    237 
     249               
    238250               $liststatics = array();
    239251               foreach($url->static as $var){
    240252                  $liststatics[(string)$var['name']] =(string)$var['value'];
    241253               }
    242                $parseInfos[]=array($module, $action, '!^'.$regexppath.'$!', $listparam, $escapes, $liststatics, $actionOverride );
     254               $parseInfos[]=array($servername, $module, $action, '!^'.$regexppath.'$!', $listparam, $escapes, $liststatics, $actionOverride );
    243255               $cuisel = $module.'~'.$action.'@'.$requestType;
    244                $arr = array(1,$urlep, $urlhttps, $listparam, $escapes,$path, false, $liststatics);
     256               $arr = array(1,$servername,$urlep, $urlhttps, $listparam, $escapes,$path, false, $liststatics);
    245257               if(isset($createUrlInfos[$cuisel])){
    246258                    if($createUrlInfos[$cuisel][0] == 4){
    247259                        $createUrlInfos[$cuisel][] = $arr;
     
    254266               if($actionOverride){
    255267                  foreach($actionOverride as $ao){
    256268                     $cuisel = $module.'~'.$ao.'@'.$requestType;
    257                      $arr = array(1,$urlep, $urlhttps, $listparam, $escapes,$path, true, $liststatics);
     269                     $arr = array(1,$servername, $urlep, $urlhttps, $listparam, $escapes,$path, true, $liststatics);
    258270                     if(isset($createUrlInfos[$cuisel])){
    259271                        if($createUrlInfos[$cuisel][0] == 4){
    260272                            $createUrlInfos[$cuisel][] = $arr;
     
    267279                  }
    268280               }
    269281           }
    270 
     282           
    271283           $parseContent.='$GLOBALS[\'SIGNIFICANT_PARSEURL\'][\''.rawurlencode($entryPoint).'\'] = '.var_export($parseInfos, true).";\n?>";
    272284
    273285           jFile::write(JELIX_APP_TEMP_PATH.'compiled/urlsig/'.$aSelector->file.'.'.rawurlencode($entryPoint).'.entrypoint.php',$parseContent);
    274286        }
     287       
     288        $createUrlContent       .=      "\$GLOBALS['SIGNIFICANT_SERVERNAMES'] = "
     289                                                .       var_export($serverNames, true)
     290                                                .       ";\n";
     291       
    275292        $createUrlContent .='$GLOBALS[\'SIGNIFICANT_CREATEURL\'] ='.var_export($createUrlInfos, true).";\n?>";
    276293        jFile::write(JELIX_APP_TEMP_PATH.'compiled/urlsig/'.$aSelector->file.'.creationinfos.php',$createUrlContent);
     294       
    277295        return true;
    278296    }
    279297
  • plugins/urls/significant/significant.urls.php

     
    7171 */
    7272class significantUrlEngine implements jIUrlEngine {
    7373
     74        /*
     75         * url info array keys
     76         */
     77    const       URLINFO_TYPE            = 0;
     78    const       URLINFO_SERVERNAME      = 1;
     79    const       URLINFO_ENTRYPOINT      = 2;
     80    const       URLINFO_HTTPS           = 3;
     81    const       URLINFO_PARAMS          = 4;
     82    const       URLINFO_ESCAPES         = 5;
     83    const       URLINFO_SHAPE           = 6;
     84    const       URLINFO_OVERLOADING     = 7;
     85    const       URLINFO_STATICVALS      = 8;   
     86   
     87    const       INFOPARSING_SERVER      = 0;
     88    const       INFOPARSING_MODULE      = 1;
     89    const       INFOPARSING_ACTION      = 2;
     90    const       INFOPARSING_REGEXP      = 3;
     91    const       INFOPARSING_HANDLER     = 3;
     92    const       INFOPARSING_SECACT1     = 4;
     93        const   INFOPARSING_DYNVAL      = 4;
     94        const   INFOPARSING_ESCAPES     = 5;
     95        const   INFOPARSING_STATIC      = 6;   
     96        const   INFOPARSING_SECACT2     = 7;   
     97       
     98                /* on a un tableau du style
     99                array( 0=>'module', 1=>'action', 2=>'regexp_pathinfo',
     100                3=>array('annee','mois'), // tableau des valeurs dynamiques, classées par ordre croissant
     101                4=>array(true, false), // tableau des valeurs escapes
     102                5=>array('bla'=>'cequejeveux' ) // tableau des valeurs statiques
     103                6=>false ou array('act','act'...) // autres actions secondaires autorisées
     104                */
     105   
    74106    /**
    75107    * data to create significant url
    76108    * @var array
     
    149181    }
    150182
    151183    /**
     184     *
     185     * Checks if urls.xml's server name matches the current server name
     186     * @param string $serverName
     187     */
     188    function checkServerName($serverName) {
     189        return !$serverName || ($_SERVER['HTTP_HOST'] == $serverName);
     190    }
     191   
     192    /**
    152193    *
    153194    * @param string $scriptNamePath    /path/index.php
    154195    * @param string $pathinfo          the path info part of the url (part between script name and query)
     
    173214                continue;
    174215            }
    175216
    176             if(count($infoparsing) < 5){
     217            if(count($infoparsing) < 6){
    177218                // on a un tableau du style
    178219                // array( 0=> 'module', 1=>'action', 2=>'selecteur handler', 3=>array('actions','secondaires'))
    179                 $s = new jSelectorUrlHandler($infoparsing[2]);
     220                $s = new jSelectorUrlHandler($infoparsing[self::INFOPARSING_HANDLER]);
    180221                $c =$s->className.'UrlsHandler';
    181222                $handler =new $c();
    182223
    183                 $url->params['module']=$infoparsing[0];
     224                $url->params['module']=$infoparsing[self::INFOPARSING_MODULE];
    184225
    185226                // si une action est présente dans l'url actuelle
    186227                // et qu'elle fait partie des actions secondaires, alors on la laisse
    187228                // sinon on prend celle indiquée dans la conf
    188                 if ($infoparsing[3] && isset($params['action'])) {
     229                if ($infoparsing[self::INFOPARSING_SECACT1] && isset($params['action'])) {
    189230                    if(strpos($params['action'], ':') === false) {
    190231                        $params['action'] = 'default:'.$params['action'];
    191232                    }
    192                     if(in_array($params['action'], $infoparsing[3]))
     233                    if(in_array($params['action'], $infoparsing[self::INFOPARSING_SECACT1]))
    193234                        $url->params['action']=$params['action']; // action peut avoir été écrasé par une itération précédente
    194235                    else
    195                         $url->params['action']=$infoparsing[1];
     236                        $url->params['action']=$infoparsing[self::INFOPARSING_ACTION];
    196237                }else{
    197                     $url->params['action']=$infoparsing[1];
     238                    $url->params['action']=$infoparsing[self::INFOPARSING_ACTION];
    198239                }
    199240                // appel au handler
    200241                if($urlact = $handler->parse($url)){
     
    208249                5=>array('bla'=>'cequejeveux' ) // tableau des valeurs statiques
    209250                6=>false ou array('act','act'...) // autres actions secondaires autorisées
    210251                */
    211                 if(preg_match ($infoparsing[2], $pathinfo, $matches)){
    212                     if($infoparsing[0] !='')
    213                         $params['module']=$infoparsing[0];
     252                if($this->checkServerName($infoparsing[self::INFOPARSING_SERVER]) && preg_match ($infoparsing[self::INFOPARSING_REGEXP], $pathinfo, $matches)){
     253                    if($infoparsing[self::INFOPARSING_MODULE] !='')
     254                        $params['module']=$infoparsing[self::INFOPARSING_MODULE];
    214255
    215256                    // si une action est présente dans l'url actuelle
    216257                    // et qu'elle fait partie des actions secondaires, alors on la laisse
    217258                    // sinon on prend celle indiquée dans la conf
    218259
    219                     if($infoparsing[6] && isset($params['action']) ) {
     260                    if($infoparsing[self::INFOPARSING_SECACT2] && isset($params['action']) ) {
    220261                        if(strpos($params['action'], ':') === false) {
    221262                            $params['action'] = 'default:'.$params['action'];
    222263                        }
    223                         if(!in_array($params['action'], $infoparsing[6]) && $infoparsing[1] !='') {
    224                             $params['action']=$infoparsing[1];
     264                        if(!in_array($params['action'], $infoparsing[self::INFOPARSING_SECACT2]) && $infoparsing[self::INFOPARSING_ACTION] !='') {
     265                            $params['action']=$infoparsing[self::INFOPARSING_ACTION];
    225266                        }
    226267
    227268                    } else {
    228                         if($infoparsing[1] !='')
    229                             $params['action']=$infoparsing[1];
     269                        if($infoparsing[self::INFOPARSING_ACTION] !='')
     270                            $params['action']=$infoparsing[self::INFOPARSING_ACTION];
    230271                    }
    231272
    232273                    // on fusionne les parametres statiques
    233                     if ($infoparsing[5]) {
    234                         $params = array_merge ($params, $infoparsing[5]);
     274                    if ($infoparsing[self::INFOPARSING_STATIC]) {
     275                        $params = array_merge ($params, $infoparsing[self::INFOPARSING_STATIC]);
    235276                    }
    236277
    237278                    if(count($matches)){
    238279                        array_shift($matches);
    239                         foreach($infoparsing[3] as $k=>$name){
     280                        foreach($infoparsing[self::INFOPARSING_DYNVAL] as $k=>$name){
    240281                            if(isset($matches[$k])){
    241                                 if($infoparsing[4][$k]){
     282                                if($infoparsing[self::INFOPARSING_ESCAPES][$k]){
    242283                                    $params[$name] = jUrl::unescape($matches[$k]);
    243284                                }else{
    244285                                    $params[$name] = $matches[$k];
     
    266307        }
    267308        return $urlact;
    268309    }
    269 
    270 
     310   
    271311    /**
    272312    * Create a jurl object with the given action data
    273313    * @param jUrlAction $url  information about the action
     
    334374            array(3,'entrypoint', https true/false); pour les clés du type "module~@request"
    335375            array(4, array(1,..), array(1,..)...);
    336376        */
    337         if($urlinfo[0]==4){
     377        if($urlinfo[self::URLINFO_TYPE]==4){
    338378            $l = count($urlinfo);
    339379            $urlinfofound = null;
    340380            for($i=1; $i < $l; $i++){
    341381                $ok = true;
    342                 foreach($urlinfo[$i][7] as $n=>$v){
     382                foreach($urlinfo[$i][self::URLINFO_STATICVALS] as $n=>$v){
    343383                    if($url->getParam($n,'') != $v){
    344384                        $ok = false;
    345385                        break;
     
    353393            if($urlinfofound !== null){
    354394                $urlinfo = $urlinfofound;
    355395            }else{
    356                 $urlinfo = $urlinfo[1];
     396                $urlinfo = $urlinfo[self::URLINFO_ENTRYPOINT];
    357397            }
    358398        }
    359399
    360         $url->scriptName = $GLOBALS['gJConfig']->urlengine['basePath'].$urlinfo[1];
    361         if($urlinfo[2])
    362             $url->scriptName = 'https://'.$_SERVER['HTTP_HOST'].$url->scriptName;
    363 
    364         if($urlinfo[1] && !$GLOBALS['gJConfig']->urlengine['multiview']){
     400        $url->scriptName        = $GLOBALS['gJConfig']->urlengine['basePath'].$urlinfo[self::URLINFO_ENTRYPOINT];
     401                $server_name            = $urlinfo[self::URLINFO_SERVERNAME];
     402        if ($urlinfo[self::URLINFO_HTTPS]) {
     403            $url->scriptName = 'https://'.($server_name == '' ? $_SERVER['HTTP_HOST'] : $server_name) . $url->scriptName;
     404        } else if ($server_name != '') {
     405                        $url->scriptName = 'http://' . $server_name . $url->scriptName;
     406                }
     407               
     408        if($urlinfo[self::URLINFO_ENTRYPOINT] && !$GLOBALS['gJConfig']->urlengine['multiview']){
    365409            $url->scriptName.=$GLOBALS['gJConfig']->urlengine['entrypointExtension'];
    366410        }
    367         // pour certains types de requete, les paramètres ne sont pas dans l'url
     411        // pour certains types de requêtes, les paramètres ne sont pas dans l'url
    368412        // donc on les supprime
    369413        // c'est un peu crade de faire ça en dur ici, mais ce serait lourdingue
    370414        // de charger la classe request pour savoir si on peut supprimer ou pas
     
    373417            return $url;
    374418        }
    375419
    376         if($urlinfo[0]==0){
    377             $s = new jSelectorUrlHandler($urlinfo[3]);
     420        if($urlinfo[self::URLINFO_TYPE]==0){
     421            $s = new jSelectorUrlHandler($urlinfo[self::URLINFO_PARAMS]);
    378422            $c =$s->resource.'UrlsHandler';
    379423            $handler =new $c();
    380424            $handler->create($urlact, $url);
    381         }elseif($urlinfo[0]==1){
    382             $pi = $urlinfo[5];
    383             foreach ($urlinfo[3] as $k=>$param){
    384                 if($urlinfo[4][$k]){
     425        }elseif($urlinfo[self::URLINFO_TYPE]==1){
     426            $pi = $urlinfo[self::URLINFO_SHAPE];
     427            foreach ($urlinfo[self::URLINFO_PARAMS] as $k=>$param){
     428                if($urlinfo[self::URLINFO_ESCAPES][$k]){
    385429                    $pi=str_replace(':'.$param, jUrl::escape($url->getParam($param,''),true), $pi);
    386430                }else{
    387431                    $pi=str_replace(':'.$param, $url->getParam($param,''), $pi);
     
    389433                $url->delParam($param);
    390434            }
    391435            $url->pathInfo = $pi;
    392             if($urlinfo[6])
     436            if($urlinfo[self::URLINFO_OVERLOADING])
    393437                $url->setParam('action',$action);
    394438            // removed parameters corresponding to static values
    395             foreach($urlinfo[7] as $name=>$value){
     439            foreach($urlinfo[self::URLINFO_STATICVALS] as $name=>$value){
    396440                $url->delParam($name);
    397441            }
    398         }elseif($urlinfo[0]==3){
     442        }elseif($urlinfo[self::URLINFO_TYPE]==3){
    399443            $url->delParam('module');
    400444        }
    401445