{
}
+ function postclose_get($sock, $curtime)
+ {
+ return NULL;
+ }
+
function chunk($step, $cont)
{
}
}
}
+define("TRANSP_WS_CLOSE_TOUT", 5);
+
+class Transport_websocket_postclose {
+ function Transport_websocket_postclose($transp_ws, $sock, $curtime) {
+ printf("POSTCLOSE: Creation\n");
+ $this->transp_ws = $transp_ws;
+ $this->sock = $sock;
+ $this->start = $curtime;
+ // status not required, currently
+ // $this->status = "begin";
+ }
+
+ function read($payload, $curtime) {
+ if ($this->start + TRANSP_WS_CLOSE_TOUT < $curtime) {
+ printf("POSTCLOSE: Closing ws (%d) force close by timeout\n", $this->sock);
+ return 0;
+ }
+ if (mb_strlen($payload, "ASCII") > 1) {
+ $this->transp_ws->unchunk($payload, $this->sock);
+ }
+ if ($this->transp_ws->hasSentClose) {
+ printf("POSTCLOSE: Closing ws gracefully\n");
+ return 0;
+ }
+ else {
+ printf("POSTCLOSE: not yet finished\n");
+ return 1;
+ }
+ }
+}
+
+
class Transport_websocket {
protected $magicGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
function Transport_websocket($secure = FALSE) {
+ $this->type = ($secure == FALSE ? "websocket" : "websocketsec");
$this->headerOriginRequired = false;
$this->headerSecWebSocketProtocolRequired = false;
$this->headerSecWebSocketExtensionsRequired = false;
$this->sendingContinuous = false;
- $this->sendingContinuous = false;
- $this->partialMessage = "";
- $this->hasSentClose = false;
+ $this->handlingPartialPacket = false;
+ $this->partialMessage = "";
+
+ $this->hasSentClose = false;
}
protected function extractHeaders($message) {
return $strout . "\n";
}
+ function unchunk($cont, $sock)
+ {
+ // fprintf(STDERR, "CHUNK: [%s]\n", $cont);
+ return $this->deframe($cont, $sock);
+ }
+
function chunk($step, $cont)
{
// fprintf(STDERR, "CHUNK: [%s]\n", $cont);
return chr($b1) . chr($b2) . $lengthField . $message;
}
- protected function deframe($message) {
+ protected function deframe($message, $socket) {
//echo $this->strtohex($message);
$headers = $this->extractHeaders($message);
$pongReply = false;
if ($pongReply) {
$reply = $this->frame($payload,$this,'pong');
// TODO FIXME ALL socket_write management
- socket_write($user->socket,$reply,mb_strlen($reply, "ASCII"));
+ // socket_write($user->socket,$reply,mb_strlen($reply, "ASCII"));
+ @fwrite($socket, $reply, mb_strlen($reply, "ASCII"));
return false;
}
if (extension_loaded('mbstring')) {
return(chr(0x88).chr(0x02).chr(0xe8).chr(0x03));
}
+ function postclose_get($sock, $curtime)
+ {
+ return new Transport_websocket_postclose($this, $sock, $curtime);
+ }
+
static function fini($init_string, $base, $blockerr)
{
return (sprintf('@BEGIN@ %s window.onbeforeunload = null; window.onunload = null; document.location.assign("%sindex.php"); @END@', ($blockerr ? 'xstm.stop(); ' : ''), $base).self::close());
class Transport_xhr {
function Transport_xhr() {
+ $this->type = 'xhr';
}
function init($enc, $header, &$header_out, $init_string, $base, $step)
return "";
}
+ function postclose_get($sock, $curtime)
+ {
+ return NULL;
+ }
+
static function fini($init_string, $base, $blockerr)
{
return (sprintf('@BEGIN@ %s window.onbeforeunload = null; window.onunload = null; document.location.assign("%sindex.php"); @END@', ($blockerr ? 'xstm.stop(); ' : ''), $base));
class Transport_iframe {
function Transport_iframe() {
+ $this->type = 'iframe';
}
function init($enc, $header, &$header_out, $init_string, $base, $step)
$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\" src=\"%scommons.js?v=%s\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js?v=%s\"></script>
<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", $base, $base);
+var xynt_streaming = \"ready\";", $base, BSK_BUSTING, $base, BSK_BUSTING);
if ($step > 0)
$ret .= sprintf("last_clean = %d;\n", ($step-1));
$ret .= sprintf("
return "";
}
+ function postclose_get($sock, $curtime)
+ {
+ return NULL;
+ }
+
static function fini($init_string, $base, $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\" src=\"%scommons.js?v=%s\"></script>
+<script type=\"text/javascript\" src=\"%sxynt-streaming-ifra.js?v=%s\"></script>
<script type=\"text/javascript\">
-var xynt_streaming = \"ready\";", $base, $base);
+var xynt_streaming = \"ready\";", $base, BSK_BUSTING, $base, BSK_BUSTING);
$ret .= sprintf("
window.onload = function () { try { if (xynt_streaming != \"ready\") { xynt_streaming.reload(); } } catch(e) { /* console.log(\"catcha\"); */ } };
</script>
}
class Transport_htmlfile extends Transport_iframe {
+ function Transport_htmlfile() {
+ $this->type = 'htmlfile';
+ }
+
+ function postclose_get($sock, $curtime)
+ {
+ return NULL;
+ }
}
class Transport {