function Transport_template() {
}
- function init($enc, &$header_out, $init_string, $base, $step)
+ // return string value is appended to the content of the returned page
+ function init($enc, $header, &$header_out, $init_string, $base, $step)
{
}
}
}
+class Transport_websocket {
+ $magicGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+
+ function Transport_websocket() {
+ }
+
+ protected function doHandshake($user, $buffer) {
+ $magicGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+ $headers = array();
+ $lines = explode("\n",$buffer);
+ foreach ($lines as $line) {
+ if (strpos($line,":") !== false) {
+ $header = explode(":",$line,2);
+ $headers[strtolower(trim($header[0]))] = trim($header[1]);
+ } else if (stripos($line,"get ") !== false) {
+ preg_match("/GET (.*) HTTP/i", $buffer, $reqResource);
+ $headers['get'] = trim($reqResource[1]);
+ }
+ }
+ if (isset($headers['get'])) {
+ $user->requestedResource = $headers['get'];
+ } else {
+ // todo: fail the connection
+ $handshakeResponse = "HTTP/1.1 405 Method Not Allowed\r\n\r\n";
+ }
+ if (!isset($headers['host']) || !$this->checkHost($headers['host'])) {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ }
+ if (!isset($headers['upgrade']) || strtolower($headers['upgrade']) != 'websocket') {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ }
+ if (!isset($headers['connection']) || strpos(strtolower($headers['connection']), 'upgrade') === FALSE) {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ }
+ if (!isset($headers['sec-websocket-key'])) {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ } else {
+
+ }
+ if (!isset($headers['sec-websocket-version']) || strtolower($headers['sec-websocket-version']) != 13) {
+ $handshakeResponse = "HTTP/1.1 426 Upgrade Required\r\nSec-WebSocketVersion: 13";
+ }
+ if (($this->headerOriginRequired && !isset($headers['origin']) ) || ($this->headerOriginRequired && !$this->checkOrigin($headers['origin']))) {
+ $handshakeResponse = "HTTP/1.1 403 Forbidden";
+ }
+ if (($this->headerSecWebSocketProtocolRequired && !isset($headers['sec-websocket-protocol'])) || ($this->headerSecWebSocketProtocolRequired && !$this->checkWebsocProtocol($header['sec-websocket-protocol']))) {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ }
+ if (($this->headerSecWebSocketExtensionsRequired && !isset($headers['sec-websocket-extensions'])) || ($this->headerSecWebSocketExtensionsRequired && !$this->checkWebsocExtensions($header['sec-websocket-extensions']))) {
+ $handshakeResponse = "HTTP/1.1 400 Bad Request";
+ }
+
+ // Done verifying the _required_ headers and optionally required headers.
+
+ if (isset($handshakeResponse)) {
+ socket_write($user->socket,$handshakeResponse,strlen($handshakeResponse));
+ $this->disconnect($user->socket);
+ return false;
+ }
+
+ $user->headers = $headers;
+ $user->handshake = $buffer;
+
+ $webSocketKeyHash = sha1($headers['sec-websocket-key'] . $magicGUID);
+
+ $rawToken = "";
+ for ($i = 0; $i < 20; $i++) {
+ $rawToken .= chr(hexdec(substr($webSocketKeyHash,$i*2, 2)));
+ }
+ $handshakeToken = base64_encode($rawToken) . "\r\n";
+
+ $subProtocol = (isset($headers['sec-websocket-protocol'])) ? $this->processProtocol($headers['sec-websocket-protocol']) : "";
+ $extensions = (isset($headers['sec-websocket-extensions'])) ? $this->processExtensions($headers['sec-websocket-extensions']) : "";
+
+ $handshakeResponse = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $handshakeToken$subProtocol$extensions\r\n";
+ socket_write($user->socket,$handshakeResponse,strlen($handshakeResponse));
+ $this->connected($user);
+ }
+
+
+ function init($enc, $header, &$header_out, $init_string, $base, $step)
+ {
+
+
+
+
+ $ret = sprintf("@BEGIN@ /* %s */ @END@", $init_string);
+ 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'] = 'application/xml; charset="utf-8"';
+
+ return ($ret);
+ }
+
+ 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));
+ return ("");
+ }
+
+ function chunk($step, $cont)
+ {
+ return ("@BEGIN@".$cont."@END@");
+ }
+}
+
class Transport_xhr {
function Transport_xhr() {
}
- function init($enc, &$header_out, $init_string, $base, $step)
+ function init($enc, $header, &$header_out, $init_string, $base, $step)
{
$ret = sprintf("@BEGIN@ /* %s */ @END@", $init_string);
if ($enc != 'plain')
function Transport_iframe() {
}
- function init($enc, &$header_out, $init_string, $base, $step)
+ function init($enc, $header, &$header_out, $init_string, $base, $step)
{
$ret = "";
--- /dev/null
+<?php
+
+?>
+<html>
+<head>
+<title>WS</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="heartbit.js"></script>
+
+<!-- <script type="text/javascript" src="myconsole.js"></script> -->
+
+<script type="text/javascript"><!--
+ var socket;
+
+ window.onload = function() {
+ var host = "ws://dodo.birds.van/brisk/xynt_test01.php?isstream=true&transp=websocket&f_test=1"; // SET THIS TO YOUR SERVER
+
+ console.log("QUI");
+ try
+ {
+ socket = new WebSocket(host);
+ console.log('WebSocket - status ' + socket.readyState);
+
+ socket.onopen = function(msg)
+ {
+ if(this.readyState == 1)
+ {
+ console.log("We are now connected to websocket server. readyState = " + this.readyState);
+ }
+ };
+
+ //Message received from websocket server
+ socket.onmessage = function(msg)
+ {
+ console.log(" [ + ] Received: " + msg.data);
+ };
+
+ //Connection closed
+ socket.onclose = function(msg)
+ {
+ console.log("Disconnected - status " + this.readyState);
+ };
+
+ socket.onerror = function()
+ {
+ console.log("Some error");
+ }
+ }
+
+ catch(ex)
+ {
+ console.log('Some exception : ' + ex);
+ }
+
+ };
+ //-->
+</script>
+</head>
+<body>
\ No newline at end of file
"Reload limiter: da 1 a 8 ogni secondo e chiude, 9 setta e chiude subito,<br>il client aspetta 3 secondi, e poi da 10 a N ogni secondo, (status sempre verde).");
-$transs = array( "iframe", "xhr", "htmlfile" );
+$transs = array( "iframe", "websocket", "xhr", "htmlfile" );
if (!isset($f_trans))
$f_trans = $transs[0];
require_once("Obj/transports.phh");
- if (isset($transp) && $transp == "xhr") {
+ if (isset($transp) && $transp == "websocket") {
+ $transp = new Transport_websocket();
+ }
+ else if (isset($transp) && $transp == "xhr") {
$transp = new Transport_xhr();
}
else if (isset($transp) && $transp == "htmlfile") {
else
$init_string .= chr(mt_rand(65, 90));
}
+ $header = array();
- $body = $transp->init("plain", $header_out, $init_string, "", "0");
+ $body = $transp->init("plain", $header, $header_out, $init_string, "", "0");
foreach ($header_out as $key => $value) {
header(sprintf("%s: %s", $key, $value));