diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-25 13:36:30 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-30 16:36:59 +0200 |
commit | 9c9dc276b7a1d2592c4fb0a887888632dc1f1e29 (patch) | |
tree | bbe3aed3e09c31c68806bdb8acffef70ba08f51c /lib/private/eventsource.php | |
parent | a711399e62d5a9f14d4b748efe4354ee37e61f13 (diff) | |
download | nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.tar.gz nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.zip |
move the private namespace OC into lib/private - OCP will stay in lib/public
Conflicts:
lib/private/vcategories.php
Diffstat (limited to 'lib/private/eventsource.php')
-rw-r--r-- | lib/private/eventsource.php | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/private/eventsource.php b/lib/private/eventsource.php new file mode 100644 index 00000000000..a83084d9251 --- /dev/null +++ b/lib/private/eventsource.php @@ -0,0 +1,85 @@ +<?php + +/** +* ownCloud +* +* @author Robin Appelman +* @copyright 2012 Robin Appelman icewind1991@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +/** + * wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events) + * includes a fallback for older browsers and IE + * + * use server side events with caution, to many open requests can hang the server + */ +class OC_EventSource{ + private $fallback; + private $fallBackId=0; + + public function __construct() { + OC_Util::obEnd(); + header('Cache-Control: no-cache'); + $this->fallback=isset($_GET['fallback']) and $_GET['fallback']=='true'; + if($this->fallback) { + $this->fallBackId=$_GET['fallback_id']; + header("Content-Type: text/html"); + echo str_repeat('<span></span>'.PHP_EOL, 10); //dummy data to keep IE happy + }else{ + header("Content-Type: text/event-stream"); + } + if( !OC_Util::isCallRegistered()) { + $this->send('error', 'Possible CSRF attack. Connection will be closed.'); + exit(); + } + flush(); + + } + + /** + * send a message to the client + * @param string $type + * @param mixed $data + * + * if only one parameter is given, a typeless message will be send with that parameter as data + */ + public function send($type, $data=null) { + if(is_null($data)) { + $data=$type; + $type=null; + } + if($this->fallback) { + $response='<script type="text/javascript">window.parent.OC.EventSource.fallBackCallBack(' + .$this->fallBackId.',"'.$type.'",'.json_encode($data).')</script>'.PHP_EOL; + echo $response; + }else{ + if($type) { + echo 'event: '.$type.PHP_EOL; + } + echo 'data: '.json_encode($data).PHP_EOL; + } + echo PHP_EOL; + flush(); + } + + /** + * close the connection of the even source + */ + public function close() { + $this->send('__internal__', 'close');//server side closing can be an issue, let the client do it + } +} |