forked from friendica/deprecated-addons
		
	
		
			
				
	
	
		
			178 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
| 
 | |
| Jappix - An open social platform
 | |
| This is a PHP BOSH proxy
 | |
| 
 | |
| -------------------------------------------------
 | |
| 
 | |
| This file is dual-licensed under the MIT license (see MIT.txt) and the AGPL license (see jappix/COPYING).
 | |
| Authors: Vanaryon, Leberwurscht
 | |
| 
 | |
| */
 | |
| 
 | |
| // PHP base
 | |
| define('JAPPIX_BASE', './jappix');
 | |
| 
 | |
| // Get the configuration
 | |
| require_once('./jappix/php/functions.php');
 | |
| require_once('./jappix/php/read-main.php');
 | |
| require_once('./jappix/php/read-hosts.php');
 | |
| 
 | |
| // Optimize the page rendering
 | |
| hideErrors();
 | |
| compressThis();
 | |
| 
 | |
| // Not allowed?
 | |
| if(!BOSHProxy()) {
 | |
| 	header('Status: 403 Forbidden', true, 403);
 | |
| 	exit('HTTP/1.1 403 Forbidden');
 | |
| }
 | |
| 
 | |
| // custom BOSH host
 | |
| $HOST_BOSH = HOST_BOSH;
 | |
| if(isset($_GET['host_bosh']) && $_GET['host_bosh']) {
 | |
| 	$host_bosh = $_GET['host_bosh'];
 | |
| 	if (substr($host_bosh, 0, 7)==="http://" || substr($host_bosh, 0, 8)==="https://") {
 | |
| 		$HOST_BOSH = $host_bosh;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // OPTIONS method?
 | |
| if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
 | |
| 	// CORS headers
 | |
| 	header('Access-Control-Allow-Origin: *');
 | |
| 	header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
 | |
| 	header('Access-Control-Allow-Headers: Content-Type');
 | |
| 	header('Access-Control-Max-Age: 31536000');
 | |
| 
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| // Read POST content
 | |
| $data = file_get_contents('php://input');
 | |
| 
 | |
| // POST method?
 | |
| if($data) {
 | |
| 	// CORS headers
 | |
| 	header('Access-Control-Allow-Origin: *');
 | |
| 	header('Access-Control-Allow-Headers: Content-Type');
 | |
| 
 | |
| 	$method = 'POST';
 | |
| }
 | |
| 
 | |
| // GET method?
 | |
| else if(isset($_GET['data']) && $_GET['data'] && isset($_GET['callback']) && $_GET['callback']) {
 | |
| 	$method = 'GET';
 | |
| 	$data = $_GET['data'];
 | |
| 	$callback = $_GET['callback'];
 | |
| }
 | |
| 
 | |
| // Invalid method?
 | |
| else {
 | |
| 	header('Status: 400 Bad Request', true, 400);
 | |
| 	exit('HTTP/1.1 400 Bad Request');
 | |
| }
 | |
| 
 | |
| // HTTP headers
 | |
| $headers = ['User-Agent: Jappix (BOSH PHP Proxy)', 'Connection: keep-alive', 'Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($data)];
 | |
| 
 | |
| // CURL is better if available
 | |
| if(function_exists('curl_init'))
 | |
| 	$use_curl = true;
 | |
| else
 | |
| 	$use_curl = false;
 | |
| 
 | |
| // CURL caused problems for me
 | |
| $use_curl = false;
 | |
| 
 | |
| // CURL stream functions
 | |
| if($use_curl) {
 | |
| 	// Initialize CURL
 | |
| 	$connection = curl_init($HOST_BOSH);
 | |
| 
 | |
| 	// Set the CURL settings
 | |
| 	curl_setopt($connection, CURLOPT_HEADER, 0);
 | |
| 	curl_setopt($connection, CURLOPT_POST, 1);
 | |
| 	curl_setopt($connection, CURLOPT_POSTFIELDS, $data);
 | |
| 	curl_setopt($connection, CURLOPT_FOLLOWLOCATION, true);
 | |
| 	curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
 | |
| 	curl_setopt($connection, CURLOPT_VERBOSE, 0);
 | |
| 	curl_setopt($connection, CURLOPT_CONNECTTIMEOUT, 30);
 | |
| 	curl_setopt($connection, CURLOPT_TIMEOUT, 30);
 | |
| 	curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
 | |
| 	curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
 | |
| 	curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
 | |
| 
 | |
| 	// Get the CURL output
 | |
| 	$output = curl_exec($connection);
 | |
| }
 | |
| 
 | |
| // Built-in stream functions
 | |
| else {
 | |
| 	// HTTP parameters
 | |
| 	$parameters = ['http' => [
 | |
| 					'method' => 'POST',
 | |
| 					'content' => $data
 | |
| 				      ]
 | |
| 		      ];
 | |
| 
 | |
| 	$parameters['http']['header'] = $headers;
 | |
| 
 | |
| 	// Change default timeout
 | |
| 	ini_set('default_socket_timeout', 30);
 | |
| 
 | |
| 	// Create the connection
 | |
| 	$stream = @stream_context_create($parameters);
 | |
| 	$connection = @fopen($HOST_BOSH, 'rb', false, $stream);
 | |
| 
 | |
| 	// Failed to connect!
 | |
| 	if($connection == false) {
 | |
| 		header('Status: 502 Proxy Error', true, 502);
 | |
| 		exit('HTTP/1.1 502 Proxy Error');
 | |
| 	}
 | |
| 
 | |
| 	// Allow stream blocking to handle incoming BOSH data
 | |
| 	@stream_set_blocking($connection, true);
 | |
| 
 | |
| 	// Get the output content
 | |
| 	$output = @stream_get_contents($connection);
 | |
| }
 | |
| 
 | |
| // Cache headers
 | |
| header('Cache-Control: no-cache, must-revalidate');
 | |
| header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
 | |
| 
 | |
| // POST output
 | |
| if($method == 'POST') {
 | |
| 	// XML header
 | |
| 	header('Content-Type: text/xml; charset=utf-8');
 | |
| 
 | |
| 	if(!$output)
 | |
| 		echo('<body xmlns=\'http://jabber.org/protocol/httpbind\' type=\'terminate\'/>');
 | |
| 	else
 | |
| 		echo($output);
 | |
| }
 | |
| 
 | |
| // GET output
 | |
| if($method == 'GET') {
 | |
| 	// JSON header
 | |
| 	header('Content-type: application/json');
 | |
| 
 | |
| 	// Encode output to JSON
 | |
| 	$json_output = json_encode($output);
 | |
| 
 | |
| 	if(($output == false) || ($output == '') || ($json_output == 'null'))
 | |
| 		echo($callback.'({"reply":"<body xmlns=\'http:\/\/jabber.org\/protocol\/httpbind\' type=\'terminate\'\/>"});');
 | |
| 	else
 | |
| 		echo($callback.'({"reply":'.$json_output.'});');
 | |
| }
 | |
| 
 | |
| // Close the connection
 | |
| if($use_curl)
 | |
| 	curl_close($connection);
 | |
| else
 | |
| 	@fclose($connection);
 | |
| 
 | |
| ?>
 |