static function sendPipe($pipe)
 {
     preg_match_all('/[a-zA-Z_0-9\\x80-\\xFF]+/', $pipe, $pipe);
     p::$agentClass = 'agent__pipe/' . implode('_', $pipe[0]);
     echo '(function(w){';
     foreach ($pipe[0] as $pipe) {
         echo 'w.P$', $pipe, '=';
         /**/
         if (DEBUG) {
             ob_start();
             call_user_func(array('pipe_' . $pipe, 'js'));
             echo trim(ob_get_clean(), ';');
             /**/
         } else {
             $cpipe = p::getContextualCachePath('pipe/' . $pipe, 'js');
             $readHandle = true;
             if ($h = p::fopenX($cpipe, $readHandle)) {
                 ob_start();
                 call_user_func(array('pipe_' . $pipe, 'js'));
                 $pipe = new \JSqueeze();
                 $pipe = $pipe->squeeze(ob_get_clean());
                 echo $pipe = trim($pipe, ';');
                 fwrite($h, $pipe);
                 flock($h, LOCK_UN);
                 fclose($h);
                 p::writeWatchTable('pipe', $cpipe);
             } else {
                 fpassthru($readHandle);
                 flock($readHandle, LOCK_UN);
                 fclose($readHandle);
             }
             /**/
         }
         echo ';';
     }
     echo '})(window);w()';
     p::setMaxage(-1);
 }
示例#2
0
 static function render($agent, $liveAgent)
 {
     $config_maxage = $CONFIG['maxage'];
     // Get the calling URI
     if (isset($_COOKIE['R$'])) {
         p::$uri = $_COOKIE['R$'];
         setcookie('R$', '', 1, '/');
         // Check the Referer header
         // T$ starts with 2 when the Referer's confidence is unknown
         //                1 when it is trusted
         if (isset($_SERVER['HTTP_REFERER']) && $_COOKIE['R$'] === $_SERVER['HTTP_REFERER']) {
             if (class_exists('SESSION', false)) {
                 $_COOKIE['T$'] = '1';
                 s::regenerateId();
             } else {
                 self::$antiCsrfToken[0] = '1';
                 setcookie('T$', self::$antiCsrfToken, 0, $CONFIG['session.cookie_path'], $CONFIG['session.cookie_domain']);
             }
         }
     } else {
         p::$uri = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : p::$base;
     }
     if ($liveAgent) {
         // The output is both html and js, but iframe transport layer needs html
         p::$binaryMode = true;
         header('Content-Type: text/html');
         echo '/*<script>/**/q="';
     } else {
         echo 'w(';
     }
     p::openMeta($agent);
     try {
         if (isset($_GET['T$']) && !p::$antiCsrfMatch) {
             throw new e\PrivateResource();
         }
         $a = new $agent($_GET);
         $group = p::closeGroupStage();
         if ($is_cacheable = 'POST' !== $_SERVER['REQUEST_METHOD'] && !in_array('private', $group)) {
             $cagent = p::agentCache($agent, $a->get, 'js.ser', $group);
             $dagent = p::getContextualCachePath('jsdata.' . $agent, 'js.ser', $cagent);
             if ($liveAgent) {
                 if (file_exists($dagent)) {
                     if (filemtime($dagent) > $_SERVER['REQUEST_TIME']) {
                         $data = unserialize(file_get_contents($dagent));
                         p::setMaxage($data['maxage']);
                         p::setExpires($data['expires']);
                         p::writeWatchTable($data['watch']);
                         array_map('header', $data['headers']);
                         p::closeMeta();
                         echo str_replace(array('\\', '"', '</'), array('\\\\', '\\"', '<\\/'), $data['rawdata']), '"//</script><script src="' . p::__BASE__() . 'js/QJsrsHandler"></script>';
                         return;
                     } else {
                         @(unlink($cagent) + unlink($dagent));
                     }
                 }
             } else {
                 if (file_exists($cagent)) {
                     if (filemtime($cagent) > $_SERVER['REQUEST_TIME']) {
                         $data = unserialize(file_get_contents($cagent));
                         p::setMaxage($data['maxage']);
                         p::setExpires($data['expires']);
                         p::writeWatchTable($data['watch']);
                         array_map('header', $data['headers']);
                         p::closeMeta();
                         echo $data['rawdata'];
                         return;
                     } else {
                         @(unlink($cagent) + unlink($dagent));
                     }
                 }
             }
         }
         ob_start();
         ++p::$ob_level;
         try {
             $data = (object) $a->compose((object) array());
             if (!p::$is_enabled) {
                 p::closeMeta();
                 return;
             }
             $template = $a->getTemplate();
             echo '{';
             $comma = '';
             foreach ($data as $key => $value) {
                 $key = jsquote($key);
                 is_string($key) || ($key = "'" . $key . "'");
                 echo $comma, $key, ':';
                 if ($value instanceof \loop) {
                     self::writeAgent($value);
                 } else {
                     echo jsquote($value);
                 }
                 $comma = ',';
             }
             echo '}';
         } catch (e\PrivateResource $data) {
             ob_end_clean();
             --p::$ob_level;
             p::closeMeta();
             throw $data;
         }
         $data = ob_get_clean();
         --p::$ob_level;
         $a->metaCompose();
         list($maxage, $group, $expires, $watch, $headers) = p::closeMeta();
     } catch (e\PrivateResource $data) {
         if ($liveAgent) {
             echo 'false";(window.E||alert)("You must provide an auth token to get this liveAgent:\\n"+', jsquote($_SERVER['REQUEST_URI']), ')';
             echo '//</script><script src="' . p::__BASE__() . 'js/QJsrsHandler"></script>';
         } else {
             if ($data->getMessage()) {
                 echo 'w.r(0,' . (int) (!DEBUG) . '));';
             } else {
                 echo ');window.E&&E("You must provide an auth token to get this agent:\\n"+', jsquote($_SERVER['REQUEST_URI']), ')';
             }
         }
         exit;
     }
     if ($liveAgent) {
         echo str_replace(array('\\', '"', '</'), array('\\\\', '\\"', '<\\/'), $data), '"//</script><script src="' . p::__BASE__() . 'js/QJsrsHandler"></script>';
     } else {
         echo $data;
     }
     if ('ontouch' === $expires && !($watch || $config_maxage == $maxage)) {
         $expires = 'auto';
     }
     $expires = 'auto' === $expires && ($watch || $config_maxage == $maxage) ? 'ontouch' : 'onmaxage';
     $is_cacheable = $is_cacheable && !in_array('private', $group) && ($maxage || 'ontouch' === $expires);
     if (!$liveAgent || $is_cacheable) {
         if ($is_cacheable) {
             ob_start();
         }
         if ($config_maxage == $maxage && Superloader::$turbo) {
             $ctemplate = p::getContextualCachePath("templates/{$template}", 'txt');
             $readHandle = true;
             if ($h = p::fopenX($ctemplate, $readHandle)) {
                 p::openMeta('agent__template/' . $template, false);
                 $template = new \ptlCompiler_js($template);
                 echo $template = ',' . $template->compile() . ')';
                 fwrite($h, $template);
                 flock($h, LOCK_UN);
                 fclose($h);
                 list(, , , $template) = p::closeMeta();
                 p::writeWatchTable($template, $ctemplate);
             } else {
                 fpassthru($readHandle);
                 flock($readHandle, LOCK_UN);
                 fclose($readHandle);
             }
             $watch[] = 'public/templates/js';
         } else {
             echo ',[1,', jsquote($template), ',0,0,0])';
         }
         if ($is_cacheable) {
             $ob = true;
             $template = array('maxage' => $maxage, 'expires' => $expires, 'watch' => $watch, 'headers' => $headers, 'rawdata' => $data);
             $expires = 'ontouch' === $expires ? $config_maxage : $maxage;
             if ($h = p::fopenX($dagent)) {
                 fwrite($h, serialize($template));
                 flock($h, LOCK_UN);
                 fclose($h);
                 touch($dagent, $_SERVER['REQUEST_TIME'] + $expires);
                 p::writeWatchTable($watch, $dagent);
             }
             if ($h = p::fopenX($cagent)) {
                 $ob = false;
                 $template['rawdata'] .= $liveAgent ? ob_get_clean() : ob_get_flush();
                 fwrite($h, serialize($template));
                 flock($h, LOCK_UN);
                 fclose($h);
                 touch($cagent, $_SERVER['REQUEST_TIME'] + $expires);
                 p::writeWatchTable($watch, $cagent);
             }
             if ($ob) {
                 $liveAgent ? ob_end_clean() : ob_end_flush();
             }
         }
     }
 }
示例#3
0
 protected static function render($agentClass)
 {
     p::openMeta($agentClass);
     $a = self::$args;
     $g = self::$get;
     $agent = new $agentClass($_GET);
     $group = p::closeGroupStage();
     $is_cacheable = !in_array('private', $group);
     $cagent = p::agentCache($agentClass, $agent->get, 'ser', $group);
     $filter = false;
     if (isset(self::$cache[$cagent])) {
         $cagent =& self::$cache[$cagent];
         $v = clone $cagent[0];
         $template = $cagent[1];
     } else {
         if (!($is_cacheable && (list($v, $template) = self::getFromCache($cagent)))) {
             ob_start();
             ++p::$ob_level;
             $v = (object) $agent->compose((object) array());
             if (!p::$is_enabled) {
                 p::closeMeta();
                 return;
             }
             $template = $agent->getTemplate();
             if (!p::$binaryMode) {
                 foreach ($v as &$h) {
                     is_string($h) && ($h = htmlspecialchars($h));
                 }
                 unset($h);
             }
             $filter = true;
             $rawdata = ob_get_flush();
             --p::$ob_level;
         }
         isset(p::$headers['content-type']) || p::header('Content-Type: text/html');
         $vClone = clone $v;
     }
     p::$catchMeta = false;
     self::$values = $v->{'$'} = $v;
     $ctemplate = p::getContextualCachePath('templates/' . $template, (p::$binaryMode ? 'bin' : 'html') . '.php');
     $ftemplate = 'template' . md5($ctemplate);
     p::$lockedContentType = true;
     if (function_exists($ftemplate)) {
         $ftemplate($v, $a, $g);
     } else {
         Superloader::$turbo || p::syncTemplate($template, $ctemplate);
         if ($h = p::fopenX($ctemplate)) {
             opcache_reset();
             p::openMeta('agent__template/' . $template, false);
             $compiler = new \ptlCompiler_php($template, p::$binaryMode);
             $ftemplate = "<?php function {$ftemplate}(&\$v,&\$a,&\$g){global \$a�,\$c�;\$d=\$v;" . $compiler->compile() . "} {$ftemplate}(\$v,\$a,\$g);";
             fwrite($h, $ftemplate);
             flock($h, LOCK_UN);
             fclose($h);
             list(, , , $watch) = p::closeMeta();
             p::writeWatchTable($watch, $ctemplate);
         }
         require $ctemplate;
     }
     if ($filter) {
         p::$catchMeta = true;
         $agent->metaCompose();
         list($maxage, $group, $expires, $watch, $headers, $canPost) = p::closeMeta();
         if ('ontouch' === $expires && !$watch) {
             $expires = 'auto';
         }
         $expires = 'auto' === $expires && $watch ? 'ontouch' : 'onmaxage';
         p::setExpires($expires);
         if ($is_cacheable && 'POST' !== $_SERVER['REQUEST_METHOD'] && !in_array('private', $group) && ($maxage || 'ontouch' === $expires)) {
             $fagent = $cagent;
             if ($canPost) {
                 $fagent = substr($cagent, 0, -4) . '.post' . substr($cagent, -4);
             }
             if ($h = p::fopenX($fagent)) {
                 $rawdata = array('rawdata' => $rawdata, 'v' => array());
                 self::freezeAgent($rawdata['v'], $vClone);
                 $rawdata['template'] = $template;
                 $rawdata['maxage'] = $maxage;
                 $rawdata['expires'] = $expires;
                 $rawdata['watch'] = $watch;
                 $rawdata['headers'] = $headers;
                 $rawdata = serialize($rawdata);
                 fwrite($h, $rawdata);
                 flock($h, LOCK_UN);
                 fclose($h);
                 touch($fagent, $_SERVER['REQUEST_TIME'] + ('ontouch' === $expires ? $CONFIG['maxage'] : $maxage));
                 p::writeWatchTable($watch, $fagent);
             }
         }
     } else {
         p::closeMeta();
     }
     if (isset($vClone)) {
         self::$cache[$cagent] = array($vClone, $template);
     }
 }