/** * performs a custom request * * @param string $method the request type (POST, DELETE, PUT, GET, ...) * @param string $target the taget URL * @param string $header an array with header informations * @param string $content the request content/body * * @return an array with the request result (status, header, content) * - ['headers'] = an array of header informations e.g. ['headers']['Content-Type'] * - ['content'] = the response content * - ['status'] = the status code e.g. 200,201,404,409,... */ public static function custom($method, $target, $header, $content, $authbool = true, $sessiondelete = false) { $begin = microtime(true); $done = false; if (!CConfig::$onload && strpos($target, 'http://localhost/') === 0 && file_exists(dirname(__FILE__) . '/request_cconfig.json')) { if (self::$components === null) { self::$components = CConfig::loadStaticConfig('', '', dirname(__FILE__), 'request_cconfig.json'); } $coms = self::$components->getLinks(); if ($coms != null) { if (!is_array($coms)) { $coms = array($coms); } $e = strlen(rtrim($_SERVER['DOCUMENT_ROOT'], '/')); $f = substr(str_replace("\\", "/", dirname(__FILE__)), $e); $g = substr(str_replace("\\", "/", $_SERVER['SCRIPT_FILENAME']), $e); $a = 0; for (; $a < strlen($g) && $a < strlen($f) && $f[$a] == $g[$a]; $a++) { } $h = substr(str_replace("\\", "/", $_SERVER['PHP_SELF']), 0, $a - 1); foreach ($coms as $com) { if ($com->getPrefix() === null || $com->getLocalPath() == null || $com->getClassFile() == null || $com->getClassName() == null) { Logger::Log('nodata: ' . $method . ' ' . $target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log'); continue; } $url = 'http://localhost' . $h . '/' . $com->getLocalPath(); if (strpos($target, $url . '/') === 0) { $result = array(); $tar = dirname(__FILE__) . '/../' . $com->getLocalPath() . '/' . $com->getClassFile(); $tar = str_replace("\\", "/", $tar); if (!file_exists($tar)) { continue; } $add = substr($target, strlen($url)); $sid = CacheManager::getNextSid(); CacheManager::getTree($sid, $target, $method); $cachedData = CacheManager::getCachedDataByURL($sid, $target, $method); if ($cachedData !== null) { $result['content'] = $cachedData->content; $result['status'] = $cachedData->status; ///Logger::Log('out>> '.$method.' '.$target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log'); CacheManager::cacheData($sid, $com->getTargetName(), $target, $result['content'], $result['status'], $method); } else { $args = array('REQUEST_METHOD' => $method, 'PATH_INFO' => $add, 'slim.input' => $content); if (isset($_SERVER['HTTP_SESSION'])) { $args['HTTP_SESSION'] = $_SERVER['HTTP_SESSION']; } if (isset($_SERVER['HTTP_USER'])) { $args['HTTP_USER'] = $_SERVER['HTTP_USER']; } if ($authbool) { if (isset($_SESSION['UID'])) { $args['HTTP_USER'] = $_SESSION['UID']; $_SERVER['HTTP_USER'] = $_SESSION['UID']; } if (isset($_SESSION['SESSION'])) { $args['HTTP_SESSION'] = $_SESSION['SESSION']; $_SERVER['HTTP_SESSION'] = $_SESSION['SESSION']; } if ($sessiondelete) { if (isset($_SERVER['REQUEST_TIME'])) { $args['HTTP_DATE'] = $_SERVER['REQUEST_TIME']; $_SERVER['HTTP_DATE'] = $_SERVER['REQUEST_TIME']; } } else { if (isset($_SESSION['LASTACTIVE'])) { $args['HTTP_DATE'] = $_SESSION['LASTACTIVE']; $_SERVER['HTTP_DATE'] = $_SESSION['LASTACTIVE']; } } } if (isset($_SERVER['HTTP_DATE'])) { $args['HTTP_DATE'] = $_SERVER['HTTP_DATE']; } $oldArgs = array('REQUEST_METHOD' => \Slim\Environment::getInstance()->offsetGet('REQUEST_METHOD'), 'PATH_INFO' => \Slim\Environment::getInstance()->offsetGet('PATH_INFO'), 'slim.input' => \Slim\Environment::getInstance()->offsetGet('slim.input'), 'HTTP_DATE' => \Slim\Environment::getInstance()->offsetGet('HTTP_DATE'), 'HTTP_USER' => \Slim\Environment::getInstance()->offsetGet('HTTP_USER'), 'HTTP_SESSION' => \Slim\Environment::getInstance()->offsetGet('HTTP_SESSION'), 'REQUEST_TIME' => \Slim\Environment::getInstance()->offsetGet('REQUEST_TIME')); $oldRequestURI = $_SERVER['REQUEST_URI']; $oldScriptName = $_SERVER['SCRIPT_NAME']; ///$oldRedirectURL = $_SERVER['REDIRECT_URL']; ///echo "old: ".$_SERVER['REQUEST_URI']."\n"; $_SERVER['REQUEST_URI'] = substr($target, strlen('http://localhost/') - 1); //$tar.$add; ///$_SERVER['REDIRECT_URL']= substr($target,strlen('http://localhost/')-1); ///echo "mein: ".substr($target,strlen('http://localhost/')-1)."\n"; $_SERVER['SCRIPT_NAME'] = $h . '/' . $com->getLocalPath() . '/' . $com->getClassFile(); //$tar; $_SERVER['QUERY_STRING'] = ''; $_SERVER['REQUEST_METHOD'] = $method; \Slim\Environment::mock($args); include_once $tar; $oldStatus = http_response_code(); $oldHeader = array_merge(array(), headers_list()); header_remove(); http_response_code(0); $name = $com->getClassName(); try { ob_start(); $obj = new $name(); if (isset($obj)) { unset($obj); } $result['content'] = ob_get_contents(); CacheManager::setETag($result['content']); $result['headers'] = array_merge(array(), self::http_parse_headers_short(headers_list())); header_remove(); if (!isset($result['headers']['Cachesid'])) { $newSid = CacheManager::getNextSid(); $result['headers']['Cachesid'] = $newSid; } ob_end_clean(); //header_remove(); $result['status'] = http_response_code(); } catch (Exception $e) { error_log($e->getMessage()); header_remove(); $result['status'] = '500'; $result['content'] = ''; $result['headers'] = array(); } $_SERVER['REQUEST_URI'] = $oldRequestURI; $_SERVER['SCRIPT_NAME'] = $oldScriptName; //$_SERVER['REDIRECT_URL'] = $oldRedirectURL; \Slim\Environment::mock($oldArgs); $_SERVER['REQUEST_METHOD'] = $oldArgs['REQUEST_METHOD']; http_response_code($oldStatus); header('Content-Type: text/html; charset=utf-8'); foreach ($oldHeader as $head) { header($head); } CacheManager::setCacheSid($sid); $targetSid = isset($result['headers']['Cachesid']) ? $result['headers']['Cachesid'] : null; CacheManager::addPath($sid, $targetSid, $com->getTargetName(), $target, $method, $result['status']); CacheManager::finishRequest($targetSid, $h . '/' . $com->getLocalPath(), $com->getTargetName(), $target, $result['content'], $result['status'], $method, $content); CacheManager::cacheData($sid, $com->getTargetName(), $target, $result['content'], $result['status'], $method); ///Logger::Log('in<< '.$method.' '.$com->getClassName().$add, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log'); } $done = true; break; } } } } if (!$done) { // creates a custom request Logger::Log("--" . $method . ' ' . $target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log'); $ch = Request_CreateRequest::createCustom($method, $target, $header, $content, $authbool, $sessiondelete)->get(); $content = curl_exec($ch); // get the request result $result = curl_getinfo($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); // splits the received header info, to create an entry // in the $result['headers'] for each part of the header $result['headers'] = self::http_parse_headers(substr($content, 0, $header_size)); // seperates the content part $result['content'] = substr($content, $header_size); // sets the received status code $result['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); } Logger::Log($target . ' ' . round(microtime(true) - $begin, 2) . 's', LogLevel::DEBUG, false, dirname(__FILE__) . '/../executionTime.log'); return $result; }