saveSERVER(); $this->defineServer( true, $filePath, $shortScriptName, $queryString ); $app = new App($rootFolder,new TestBaseUrl()); $thrown = false; $foundTh = null; try { $output = $app->runPico(); } catch (TestBaseUrlException $th) { $thrown = true; $foundTh = $th; } catch (Throwable $th){ } $this->revertSERVER(); $this->assertTrue($thrown,"TestBaseUrlException not found"); $this->assertEquals($waitedBaseUrl,$foundTh->getBaseUrl(),"Not same baseUrl"); } public function apiRewriteProvider() { $data = []; $this->prepareData($data,'content/*','content','index.php','/','','http://localhost/'); $this->prepareData($data,'content/index.php*','content','index.php','/index.php','','http://localhost/'); return $data; } public function prepareData( array &$data, string $name, string $rootFolder, string $filePath, string $shortScriptName, string $queryString, string $waitedBaseUrl, ) { $data[$name] = [ 'rootFolder' => $rootFolder, 'filePath' => $filePath, 'shortScriptName' => $shortScriptName, 'queryString' => $queryString, 'waitedBaseUrl' => $waitedBaseUrl, ]; } /** * define $_SERVER because fastcgi not run in CLI * @param bool $reset reset previous $_SERVER * @param string $filePath realpath of current script file * @param string $shortScriptName uri path of current script file * @param string $queryString wanted query string * @param string $method * @param string $pathInfo */ public function defineServer( bool $reset, string $filePath, string $shortScriptName, string $queryString, string $method = 'GET', string $pathInfo = '' ) { if (is_file($filePath)){ if (!is_array($_SERVER) || $reset){ $new = []; if (is_array($_SERVER)){ foreach(['SERVER_SOFTWARE','SERVER_PROTOCOL','GATEWAY_INTERFACE'] as $key){ if (array_key_exists($key,$_SERVER)){ $new[$key] = $_SERVER[$key]; } } } $_SERVER = $new; } $_SERVER['QUERY_STRING'] = $queryString; $_SERVER['REQUEST_METHOD'] = in_array($method,['GET','POST','PUT','DELETE','HEAD']) ? $method : 'GET'; // $_SERVER['CONTENT_TYPE'] = 'not defined'; // $_SERVER['CONTENT_LENGTH'] = 'not defined'; $documentRoot = dirname(realpath($filePath)); $fileName = basename(realpath($filePath)); $documentRootShort = (substr($documentRoot,-strlen(DIRECTORY_SEPARATOR)) != DIRECTORY_SEPARATOR) ? $documentRoot : substr($documentRoot,0,-strlen(DIRECTORY_SEPARATOR)); $documentRootFull = $documentRootShort.DIRECTORY_SEPARATOR; $scriptName = (basename($shortScriptName) == $fileName) ? $shortScriptName : $shortScriptName.((empty($shortScriptName) || substr($shortScriptName,-1) == '/') ? '' : '/').$fileName; $hashPos = strpos($queryString,'#'); $queryStringWithoutHash = (empty($queryString) || ($hashPos === 0)) ? '' : ( ($hashPos === false) ? "?$queryString" : '?'.sustr($queryString,0,$hashPos+1) ); $_SERVER['SCRIPT_FILENAME'] = $documentRootFull.$fileName; $_SERVER['SCRIPT_NAME'] = $scriptName; $_SERVER['PHP_SELF'] = $scriptName.$pathInfo; $_SERVER['PATH_INFO'] = $pathInfo; $_SERVER['ORIG_PATH_INFO'] = $pathInfo; $_SERVER['PATH_TRANSLATED'] = $documentRootShort.$pathInfo; if (substr($shortScriptName,-1) == '/'){ if (!empty($pathInfo) && substr($pathInfo,0,1) == '/'){ $_SERVER['DOCUMENT_URI'] = $shortScriptName.substr($pathInfo,1); } else { $_SERVER['DOCUMENT_URI'] = $shortScriptName.$pathInfo; } } else if (empty($pathInfo) || substr($pathInfo,0,1) == '/'){ $_SERVER['DOCUMENT_URI'] = $shortScriptName.$pathInfo; } else { $_SERVER['DOCUMENT_URI'] = $shortScriptName.'/'.$pathInfo; } $_SERVER['REQUEST_URI'] = $_SERVER['DOCUMENT_URI'].$queryStringWithoutHash; $_SERVER['DOCUMENT_ROOT'] = $documentRootShort; $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // forced $_SERVER['REMOTE_PORT'] = '80'; // forced $_SERVER['SERVER_ADDR'] = '127.0.0.1'; // forced $_SERVER['SERVER_ADDR'] = '80'; // forced $_SERVER['SERVER_NAME'] = 'localhost'; // forced $_SERVER['HTTPS'] = null; // forced } } /** * save previous $_SERVER in $GLOBALS if existing */ public function saveSERVER() { if (!isset($GLOBALS['savedSERVER'])){ $GLOBALS['savedSERVER'] = [ 'saved' => false, 'value' => null ]; } if (!$GLOBALS['savedSERVER']['saved']){ if (!isset($_SERVER)){ $GLOBALS['savedSERVER']['value'] = null; $GLOBALS['savedSERVER']['saved'] = true; } else { $GLOBALS['savedSERVER']['value'] = $_SERVER; $GLOBALS['savedSERVER']['saved'] = true; } } } /** * revert previous $_SERVER in $GLOBALS if existing */ public function revertSERVER() { if (isset($GLOBALS['savedSERVER']['saved']) && $GLOBALS['savedSERVER']['saved']){ if (is_null($GLOBALS['savedSERVER']['value'])){ unset($_SERVER); } else { $_SERVER = $GLOBALS['savedSERVER']['value']; } $GLOBALS['savedSERVER']['saved'] = false; $GLOBALS['savedSERVER']['value'] = null; } } }