Blame view

sources/lib/private/eventsource.php 2.46 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  <?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
31b7f2792   Kload   Upgrade to ownclo...
56
  	 * @param mixed $data
03e52840d   Kload   Init
57
58
59
60
61
62
63
64
65
  	 *
  	 * 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) {
837968727   Kload   [enh] Upgrade to ...
66
  			$fallBackId = OC_Util::sanitizeHTML($this->fallBackId);
03e52840d   Kload   Init
67
  			$response='<script type="text/javascript">window.parent.OC.EventSource.fallBackCallBack('
6d9380f96   Cédric Dupont   Update sources OC...
68
  				.$fallBackId.',"' . $type . '",' . OCP\JSON::encode($data) . ')</script>' . PHP_EOL;
03e52840d   Kload   Init
69
70
71
  			echo $response;
  		}else{
  			if($type) {
6d9380f96   Cédric Dupont   Update sources OC...
72
  				echo 'event: ' . $type.PHP_EOL;
03e52840d   Kload   Init
73
  			}
6d9380f96   Cédric Dupont   Update sources OC...
74
  			echo 'data: ' . OCP\JSON::encode($data) . PHP_EOL;
03e52840d   Kload   Init
75
76
77
78
79
80
81
82
83
84
85
86
  		}
  		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
  	}
  }