transports isolation in php code
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Thu, 29 Nov 2012 06:17:30 +0000 (07:17 +0100)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Thu, 29 Nov 2012 06:17:30 +0000 (07:17 +0100)
web/Obj/transports.phh [new file with mode: 0644]
web/Obj/user.phh
web/room.js
web/xynt_test01.php [new file with mode: 0644]

diff --git a/web/Obj/transports.phh b/web/Obj/transports.phh
new file mode 100644 (file)
index 0000000..b426043
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+/*
+ *  sac-a-push - Obj/transports.phh
+ *
+ *  Copyright (C) 2012 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it 
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+class Transport_template {
+
+    function Transport_template() {
+    }
+
+    function init($enc, &$header_out, $init_string, $base, $step)
+    {
+    }
+
+    static function fini($init_string, $blockerr)
+    {
+    }
+
+    function chunk($step, $cont)
+    {
+    }
+}
+
+class Transport_xhr {
+
+    function Transport_xhr() {
+    }
+
+    function init($enc, &$header_out, $init_string, $base, $step)
+    {
+    }
+
+    static function fini($init_string, $blockerr)
+    {
+    }
+
+    function chunk($step, $cont)
+    {
+    }
+}
+
+class Transport_iframe {
+
+    function Transport_iframe() {
+    }
+
+    function init($enc, &$header_out, $init_string, $base, $step)
+    {
+        $ret = "";
+
+        if ($enc != 'plain')
+            $header_out['Content-Encoding'] = $enc;
+        $header_out['Cache-Control'] = 'no-cache, must-revalidate';     // HTTP/1.1
+        $header_out['Expires']       = 'Mon, 26 Jul 1997 05:00:00 GMT'; // Date in the past
+        $header_out['Content-type']  = 'text/html; charset="utf-8"';
+        
+        $ret .= sprintf("<html>
+<head>
+<script type=\"text/javascript\" src=\"%scommons.js\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
+<script type=\"text/javascript\">
+var xynt_streaming = \"ready\";", $base, $base);
+        if ($step > 0)
+            $ret .= sprintf("last_clean = %d;\n", ($step-1));
+        $ret .= sprintf("
+window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
+</script> 
+</head>
+<body>");
+        $ret .= sprintf("<!-- \n%s -->\n", $init_string);
+
+        return ($ret);
+    }
+
+    static function fini($init_string, $blockerr)
+    {
+        $ret = "";
+        $ret .= sprintf("<html>
+<head>
+<script type=\"text/javascript\" src=\"%scommons.js\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
+<script type=\"text/javascript\">
+var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
+        $ret .= sprintf("
+window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
+</script>
+</head>
+<body>");
+        $ret .= sprintf("<!-- \n%s -->\n", $init_string);
+        $ret .= sprintf("<script id='hs%d' type='text/javascript'><!--
+push(\"%s\");
+// -->
+</script>", 0, escpush($blockerr) );
+        return ($ret);
+    }
+
+    function chunk($step, $cont)
+    {
+        if ($cont == NULL) {
+            return sprintf("<script id='hs%d' type='text/javascript'><!--
+push(null);\n// -->\n</script>", $step);
+        }
+        else {
+            return sprintf("<script id='hs%d' type='text/javascript'><!--
+push(\"%s\");\n// -->\n</script>", $step, escpush($cont) );
+        }
+    }
+}
+?>
\ No newline at end of file
index 70441e8..7d42cf9 100644 (file)
@@ -21,6 +21,9 @@
  * Suite 330, Boston, MA 02111-1307, USA.
  */
 
+require_once("${G_base}Obj/transports.phh");
+
+
 // User flags
 define('USER_FLAG_AUTH',     0x02);
 
@@ -98,6 +101,7 @@ class User {
   var $rd_kalive;  // if no message are sent after RD_KEEPALIVE_TOUT secs we send a keepalive from server
   var $rd_cache;   // place where store failed fwrite data
   var $rd_zls;     // zlibstream object handle if compressed stream, else FALSE
+  var $rd_transp;  // class that define stream encapsulation type (iframe, xhr, ...)
 
   var $comm;       // commands array
   // var $asta_card;  // 
@@ -156,6 +160,7 @@ class User {
     $thiz->rd_kalive  = -1;
     $thiz->rd_cache   = "";
     $thiz->rd_zls     = FALSE;
+    $thiz->rd_transp  = NULL;
 
     $thiz->asta_card  = -2;
     $thiz->asta_pnt   = -1;
@@ -299,6 +304,7 @@ class User {
       $this->rd_scristp = 0;
       $this->rd_kalive  = $curtime + RD_KEEPALIVE_TOUT;
       $this->rd_zls     = ZLibStream::create($enc);
+      $this->rd_transp  = new Transport_iframe();
   }
 
   function rd_socket_get() {
@@ -643,27 +649,12 @@ class User {
 
   public static function stream_fini($init_string, $is_unrecoverable)
 {
-    $cla = get_called_class();
     printf("xXx user::stream_fini\n");
 
-    // IF IFRAME THEN:
-    $body = "";
-    $body .= sprintf("<html>
-<head>
-<script type=\"text/javascript\" src=\"%scommons.js\"></script>
-<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
-<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
-    $body .= sprintf("
-window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
-</script>
-</head>
-<body>");
-    $body .= sprintf("<!-- \n%s -->\n", $init_string);
-    $body .= sprintf("<script id='hs%d' type='text/javascript'><!--
-push(\"%s\");
-// -->
-</script>", 0, escpush(static::blocking_error($is_unrecoverable)) );
+    // FIXME: dynamic "Transport_" type
+    $tans_class = "Transport_iframe";
+    $body = $tansclass::fini($init_string, static::blocking_error($is_unrecoverable));
+
     // ELSE IF XHR THEN:
     // return (static::blocking_error($is_unrecoverable));
     return ($body);
@@ -687,12 +678,6 @@ function stream_init($init_string, $enc, &$header_out, &$body, $get, $post, $coo
     
     // (webservers_exceeded() || stristr($HTTP_USER_AGENT, "Mozilla/5.0 (Windows NT 6.1; rv:5.0)") || stristr($HTTP_USER_AGENT, "MSIE") || stristr($HTTP_USER_AGENT, "CHROME") ? TRUE : FALSE);
 
-    if ($enc != 'plain')
-        $header_out['Content-Encoding'] = $enc;
-    $header_out['Cache-Control'] = 'no-cache, must-revalidate';     // HTTP/1.1
-    $header_out['Expires']       = 'Mon, 26 Jul 1997 05:00:00 GMT'; // Date in the past
-    $header_out['Content-type']  = 'text/html; charset="utf-8"';
-    
     log_load("index_rd_ifra_init.php");
     
     if (($from  = gpcs_var('from', $get, $post, $cookie)) === FALSE)
@@ -705,23 +690,9 @@ function stream_init($init_string, $enc, &$header_out, &$body, $get, $post, $coo
         unset($step);
     
     $this->rd_data_set($curtime, $enc, $stat, $subst, $step, $from);
-    $cc = get_called_class();
-    
-    $body .= sprintf("<html>
-<head>
-<script type=\"text/javascript\" src=\"%scommons.js\"></script>
-<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js\"></script>
-<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", self::base_get(), self::base_get());
-    if ($this->rd_scristp > 0)
-        $body .= sprintf("last_clean = %d;\n", ($this->rd_scristp-1));
-    $body .= sprintf("
-window.onload = function () { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } };
-</script> 
-</head>
-<body>");
-    $body .= sprintf("<!-- \n%s -->\n", $init_string);
     
+    $body .= $this->rd_transp->init($enc, &$header_out, $init_string, self::base_get(), $this->rd_scristp);
+
     return TRUE;
   }
 
@@ -747,11 +718,7 @@ function stream_main(&$body, $get, $post, $cookie)
     $old_step  = $this->rd_step;
     printf("xXx PRE : rd_step %d\n", $this->rd_step);
     if (($ret = $this->maincheck($old_stat, $old_subst, $old_step, $this->rd_stat, $this->rd_subst, $this->rd_step, $splashdate, $table_idx, $table_token)) != FALSE) {
-        $body .= sprintf("<script id='hs%d' type='text/javascript'><!--
-push(\"%s\");
-// -->
-</script>", $this->rd_scristp++, escpush($ret) );
-        
+        $body .= $this->rd_transp->chunk( $this->rd_scristp++, $ret);
         log_rd2(0, 'index_rd.php: after mop_flush (begin: '.sprintf("%f", $pre_main).')');
     }
     printf("xXx POST: rd_step %d\n", $this->rd_step);
@@ -761,12 +728,7 @@ push(\"%s\");
 
 function stream_keepalive($with_ping)
 {
-    $ret =  (sprintf("<script id='hs%d' type='text/javascript'><!--
-push(%s);
-// -->
-</script>", $this->rd_scristp++, ($with_ping ? "\"act_ping();\"" : "null")));
-
-    return ($ret);
+    return ($this->rd_transp->chunk( $this->rd_scristp++, ($with_ping ? "act_ping();" : NULL)));
 }
 
 static function base_get()
index bc18edd..29619a8 100644 (file)
@@ -419,7 +419,7 @@ function esco_cb() {
     window.onbeforeunload = null; 
     window.onunload = null; 
     // nonunload = true; 
-    act_logout();
+    act_logout(0);
  };
 
 
diff --git a/web/xynt_test01.php b/web/xynt_test01.php
new file mode 100644 (file)
index 0000000..ac5c47f
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+
+function mop_flush()
+{
+    for ($i = 0; $i < ob_get_level(); $i++)
+        ob_end_flush();
+    ob_implicit_flush(1);
+    flush();
+}
+
+$escpush_from = array("\\", "\"");
+$escpush_to   = array("\\\\", "\\\"");
+function escpush($s)
+{
+    GLOBAL $escpush_from, $escpush_to;
+
+    return str_replace($escpush_from, $escpush_to, $s);
+}
+
+if ($isstream == "true") {
+
+    require_once("Obj/transports.phh");
+
+
+    // TODO: what stream ? 
+    //       iframe, htmlfile, xhr
+
+    $transp = new Transport_iframe();
+
+    $header_out = array();
+
+    $init_string = "";
+    for ($i = 0 ; $i < 4096 ; $i++) {
+        if (($i % 128) == 0)
+            $init_string .= "\n";
+        else
+            $init_string .= chr(mt_rand(65, 90));
+    }
+
+    $body = $transp->init("plain", $header_out, $init_string, "", "0");
+
+    foreach ($header_out as $key => $value) {
+        header(sprintf("%s: %s", $key, $value));
+    }
+    print($body);
+    mop_flush();
+
+    for ($i = 1 ; $i < 20 ; $i++) {
+        $chunk = $transp->chunk($i, sprintf("\$('container').innerHTML = '%d';", $i));
+        print($chunk);
+        mop_flush();
+        
+        // exit(123);
+        sleep(1);
+    }
+    exit;
+}
+?>
+<html>
+<head>
+<title>XYNT TEST01</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<script type="text/javascript" src="xynt-streaming.js"></script>
+<script type="text/javascript" src="commons.js"></script>
+
+<!-- <script type="text/javascript" src="myconsole.js"></script> -->
+<!-- 
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript" src="ticker.js"></script>
+<script type="text/javascript" src="heartbit.js"></script>
+<script type="text/javascript" src="room.js"></script>
+<script type="text/javascript" src="preload_img.js"></script>
+<script type="text/javascript" src="AC_OETags.js"></script>
+<script type="text/javascript" src="probrowser.js"></script>
+-->
+<SCRIPT type="text/javascript"><!--
+     var sess = "for_test";
+     var stat = "";
+     var subst = "";
+     var gst = new globst();
+     window.onload = function() {
+     xstm = new xynt_streaming(window, "iframe", null /* console */, gst, 'xynt_test01_php', 'sess', sess, null, 'xynt_test01.php?isstream=true', function(com){eval(com);});
+     /*     xstm.hbit_set(heartbit); */
+     xstm.start();
+ }
+ //-->
+</SCRIPT>
+</head>
+<!-- if myconsole <body onunload="deconsole();"> -->
+<body>
+<div id="container">
+BEGIN
+</div>
+</body>
+</html>