modification to fix explorer bug.
[brisk.git] / web / Obj / sac-a-push.phh
index 3c66c12..fa78539 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 define('SITE_PREFIX', '/brisk/');
+define('SITE_PREFIX_LEN', 7);
 
 function spu_process_info($stream_info, $method, &$header, &$get, &$post, &$cookie)
 {
@@ -104,9 +105,13 @@ function gpcs_var($name, $get, $post, $cookie)
 
 function headers_render($header, $len)
 {
-    
     $s = "";
-    $s .= "HTTP/1.1 200 OK\r\n";
+    if (isset($header['Location'])) {
+        return sprintf("HTTP/1.1 302 OK\r\nLocation: %s\r\n\r\n", $header['Location']);
+    }
+    else {
+        $s .= "HTTP/1.1 200 OK\r\n";
+    }
     if (!isset($header['Date']))
         $s .= sprintf("Date: %s\r\n", date(DATE_RFC822));
     if (!isset($header['Connection']))
@@ -173,7 +178,7 @@ class Sac_a_push {
     var $debug;
     var $blocking_mode;
 
-    var $room;
+    var $app;
     var $bin5;
 
     var $curtime;
@@ -187,11 +192,11 @@ class Sac_a_push {
 
     // Sac_a_push::create("/tmp/brisk.sock", 0, 0
 
-    static function create(&$room, $sockname, $debug, $blocking_mode)
+    static function create(&$app, $sockname, $debug, $blocking_mode)
     {        
         $thiz = new Sac_a_push();
         
-        $thiz->room = $room;
+        $thiz->app = $app;
         $thiz->file_socket = $sockname;
         $thiz->unix_socket = "unix://$sockname";
         $thiz->debug = $debug;
@@ -257,6 +262,23 @@ class Sac_a_push {
         array_push($this->pages_flush, $pgflush);
     }
 
+    function garbage_manager($force)
+    {
+        $this->app->garbage_manager($force);
+
+        foreach ($this->socks as $k => $sock) {
+            if ($this->s2u[intval($sock)]->sess == '') {
+                if ($this->s2u[intval($sock)]->rd_socket_get() != NULL) {
+                    $this->s2u[intval($sock)]->rd_socket_set(NULL);
+                }
+                unset($this->socks[intval($sock)]);
+                unset($this->s2u[intval($sock)]);
+                fclose($sock);
+                printf("CLOSE ON GARBAGE MANAGER\n");
+            }
+        }
+    }
+
     function run()
     {
         if ($this->main_loop) {
@@ -283,7 +305,7 @@ class Sac_a_push {
             }
             $write  = NULL;
             $except = NULL;
-            $num_changed_sockets = stream_select($read, $write, $except, 0, 250000);
+            $num_changed_sockets = stream_select($read, $write, $except, 0, 100000);
         
             if ($num_changed_sockets == 0) {
                 printf(" no data in 5 secs ");
@@ -326,7 +348,16 @@ class Sac_a_push {
                             $addr = stream_socket_get_name($new_socket, TRUE);
                             $header_out = array();
 
-                            $this->room->request_mgr($this, $header_out, $new_socket, $path, $addr, $get, $post, $cookie);
+                            $subs = SITE_PREFIX."briskin5/";
+                            $subs_l = strlen($subs);
+                            $rret = FALSE;
+                            if (!strncmp($path, SITE_PREFIX, SITE_PREFIX_LEN)) {
+                                $rret = $this->app->request_mgr($this, $header_out, $new_socket, substr($path, SITE_PREFIX_LEN), $addr, $get, $post, $cookie);
+                            }
+                            if ($rret == FALSE) { 
+                                // FIXME: manage 404 !!!
+                                printf("TODO: fix unknown page\n");
+                            }
                             printf("number of sockets after %d\n", count($this->socks));
                         }
                         else {
@@ -336,7 +367,6 @@ class Sac_a_push {
                     else {
                         if (($buf = fread($sock, 512)) === FALSE) {
                             printf("error read\n");
-                            exit(123);
                         }
                         else if (strlen($buf) === 0) {
                             if ($sock === $this->list) {
@@ -361,7 +391,7 @@ class Sac_a_push {
                             }
                         }
                         else {
-                            if ($debug > 1) {
+                            if ($this->debug > 1) {
                                 print_r($read);
                             }
                             if ($sock === $this->list) {
@@ -378,7 +408,8 @@ class Sac_a_push {
                     }
                 }
             }
-            
+
+            $this->garbage_manager(FALSE);
 
             /* manage unfinished pages */
             foreach ($this->pages_flush as $k => $pgflush) {
@@ -387,17 +418,35 @@ class Sac_a_push {
                 }
             }
             
+            /*
+               $response:                        raw stream data not sent
+               $content:                         html consistent data (<script bla bla>)
+               $user->stream_keepalive($w_ping)  ping srv->cli OR srv->cli + cli->srv if $w_ping == TRUE
+            */
+
             /* manage open streaming */
             foreach ($this->socks as $k => $sock) {
                 if (isset($this->s2u[intval($sock)])) {
                     $user = $this->s2u[intval($sock)];
                     $response = $user->rd_cache_get();
+                    $do_ping = FALSE;
+                    if (($this->curtime - $user->lacc) > (EXPIRE_TIME_RD / 3)) {
+                        $do_ping = TRUE;
+                    }
+                    else {
+                        $user->ping_req = FALSE;
+                    }
+
                     if ($response == "") {
                         $content = "";
                         $user->stream_main($content, $get, $post, $cookie);
-                        
-                        if ($content == "" && $user->rd_kalive_is_expired($this->curtime)) {
-                            $content = $user->stream_keepalive();
+                        printf("[%s] [%d] [%d]\n", $user->name, $user->lacc, $this->curtime);
+                        if ($do_ping && $user->ping_req == FALSE) {
+                            $content .= $user->stream_keepalive(TRUE);
+                            $user->ping_req = TRUE;
+                        }
+                        else if ($content == "" && $user->rd_kalive_is_expired($this->curtime)) {
+                            $content = $user->stream_keepalive(FALSE);
                         }
                         if ($content != "") {
                             $response = chunked_content($content);
@@ -405,7 +454,8 @@ class Sac_a_push {
                     }
                     
                     if ($response != "") {
-                        echo "SPIA: [".substr($response, 0, 60)."...]\n";
+                        // echo "SPIA: [".substr($response, 0, 60)."...]\n";
+                        echo "SPIA: [".$response."]\n";
                         $response_l = mb_strlen($response, "ASCII");
                         $wret = @fwrite($sock, $response);
                         if ($wret < $response_l) {
@@ -436,4 +486,4 @@ class Sac_a_push {
     }  // function run(...
 }
 
-?>
\ No newline at end of file
+?>