update mp api

This commit is contained in:
kremsy 2014-02-19 12:38:38 +01:00 committed by Steffen Schröder
parent 9f2b4b143d
commit 34f5598f24
3 changed files with 32 additions and 32 deletions

View File

@ -104,14 +104,14 @@ class Client
$this->socket = @fsockopen($hostname, $port, $errno, $errstr, $timeout); $this->socket = @fsockopen($hostname, $port, $errno, $errstr, $timeout);
if (!$this->socket) if (!$this->socket)
{ {
throw new Exception("transport error - could not open socket (error: $errno, $errstr)", -32300); throw new FatalException("transport error - could not open socket (error: $errno, $errstr)", FatalException::NOT_INITIALIZED);
} }
// handshake // handshake
$array_result = unpack('Vsize', fread($this->socket, 4)); $array_result = unpack('Vsize', fread($this->socket, 4));
$size = $array_result['size']; $size = $array_result['size'];
if ($size > 64) if ($size > 64)
{ {
throw new Exception('transport error - wrong lowlevel protocol header', -32300); throw new FatalException('transport error - wrong lowlevel protocol header', FatalException::OTHER);
} }
$handshake = fread($this->socket, $size); $handshake = fread($this->socket, $size);
if ($handshake == 'GBXRemote 1') if ($handshake == 'GBXRemote 1')
@ -124,7 +124,7 @@ class Client
} }
else else
{ {
throw new Exception('transport error - wrong lowlevel protocol version', -32300); throw new FatalException('transport error - wrong lowlevel protocol version', FatalException::OTHER);
} }
} }
@ -163,7 +163,7 @@ class Client
$r = fwrite($this->socket, $bytes); $r = fwrite($this->socket, $bytes);
if ($r === false || $r == 0) if ($r === false || $r == 0)
{ {
throw new Exception('Connection interupted'); throw new FatalException('Connection interupted', FatalException::INTERRUPTED);
} }
$bytes_to_write -= $r; $bytes_to_write -= $r;
@ -191,7 +191,7 @@ class Client
$contents = fread($this->socket, 4); $contents = fread($this->socket, 4);
if (strlen($contents) == 0) if (strlen($contents) == 0)
{ {
throw new Exception('transport error - connection interrupted!', -32700); throw new FatalException('transport error - connection interrupted!', FatalException::INTERRUPTED);
} }
$array_result = unpack('Vsize', $contents); $array_result = unpack('Vsize', $contents);
$size = $array_result['size']; $size = $array_result['size'];
@ -202,7 +202,7 @@ class Client
$contents = fread($this->socket, 8); $contents = fread($this->socket, 8);
if (strlen($contents) == 0) if (strlen($contents) == 0)
{ {
throw new Exception('transport error - connection interrupted!', -32700); throw new FatalException('transport error - connection interrupted!', FatalException::INTERRUPTED);
} }
$array_result = unpack('Vsize/Vhandle', $contents); $array_result = unpack('Vsize/Vhandle', $contents);
$size = $array_result['size']; $size = $array_result['size'];
@ -217,12 +217,12 @@ class Client
if ($recvhandle == 0 || $size == 0) if ($recvhandle == 0 || $size == 0)
{ {
throw new Exception('transport error - connection interrupted!', -32700); throw new FatalException('transport error - connection interrupted!', FatalException::INTERRUPTED);
} }
if ($size > SIZE_MAX) if ($size > SIZE_MAX)
{ {
throw new Exception("transport error - answer too big ($size)", -32700); throw new Exception("transport error - answer too big ($size)", Exception::ANWSER_TOO_BIG);
} }
self::$received += $size; self::$received += $size;
@ -253,7 +253,7 @@ class Client
if (!$this->message->parse()) if (!$this->message->parse())
{ {
// XML error // XML error
throw new Exception('parse error. not well formed', -32700); throw new Exception('parse error. not well formed', Exception::OTHER);
} }
// Is the message a fault? // Is the message a fault?
if ($this->message->messageType == 'fault') if ($this->message->messageType == 'fault')
@ -272,7 +272,7 @@ class Client
if (!$this->socket || $this->protocol == 0) if (!$this->socket || $this->protocol == 0)
{ {
throw new Exception('transport error - Client not initialized', -32300); throw new FatalException('transport error - Client not initialized', FatalException::NOT_INITIALIZED);
} }
$request = new Request($method, $args); $request = new Request($method, $args);
@ -280,7 +280,7 @@ class Client
// Check if request is larger than 1024 Kbytes // Check if request is larger than 1024 Kbytes
if ($request->getLength() > 1024*1024-8) if ($request->getLength() > 1024*1024-8)
{ {
throw new Exception('transport error - request too large!', -32700); throw new Exception('transport error - request too large!', Exception::REQUEST_TOO_BIG);
} }
$this->sendRequest($request); $this->sendRequest($request);
@ -295,12 +295,12 @@ class Client
if (!$this->socket || $this->protocol == 0) if (!$this->socket || $this->protocol == 0)
{ {
throw new Exception('transport error - Client not initialized', -32300); throw new FatalException('transport error - Client not initialized', FatalException::NOT_INITIALIZED);
} }
$request = new Request($method, $args); $request = new Request($method, $args);
// Check if the request is greater than 1024 Kbytes to avoid errors // Check if the request is greater than 512 Kbytes to avoid errors
// If the method is system.multicall, make two calls (possibly recursively) // If the method is system.multicall, make two calls (possibly recursively)
if ($request->getLength() > 1024*1024-8) if ($request->getLength() > 1024*1024-8)
{ {
@ -310,7 +310,7 @@ class Client
// If count is 1, query cannot be reduced // If count is 1, query cannot be reduced
if ($count < 2) if ($count < 2)
{ {
throw new Exception('transport error - request too large!', -32700); throw new Exception('transport error - request too large!', Exception::REQUEST_TOO_BIG);
} }
$length = floor($count/2); $length = floor($count/2);
@ -324,7 +324,7 @@ class Client
// If the method is not a multicall, just stop // If the method is not a multicall, just stop
else else
{ {
throw new Exception('transport error - request too large!', -32700); throw new Exception('transport error - request too large!', Exception::REQUEST_TOO_BIG);
} }
} }
@ -340,7 +340,7 @@ class Client
function readCallbacks($timeout = 2000) function readCallbacks($timeout = 2000)
{ {
if (!$this->socket || $this->protocol == 0) if (!$this->socket || $this->protocol == 0)
throw new Exception('transport error - Client not initialized', -32300); throw new FatalException('transport error - Client not initialized', FatalException::NOT_INITIALIZED);
if ($this->protocol == 1) if ($this->protocol == 1)
return false; return false;
@ -349,7 +349,7 @@ class Client
$contents = ''; $contents = '';
$contents_length = 0; $contents_length = 0;
@stream_set_timeout($this->socket, 0, 10000); // timeout 10 ms (to read available data) @stream_set_timeout($this->socket, 0, 100000); // timeout 10 ms (to read available data)
// (assignment in arguments is forbidden since php 5.1.1) // (assignment in arguments is forbidden since php 5.1.1)
$read = array($this->socket); $read = array($this->socket);
$write = NULL; $write = NULL;
@ -392,20 +392,19 @@ class Client
$contents = fread($this->socket, 8); $contents = fread($this->socket, 8);
if (strlen($contents) == 0) if (strlen($contents) == 0)
{ {
throw new Exception('transport error - connection interrupted!', -32700); throw new FatalException('transport error - connection interrupted!', FatalException::INTERRUPTED);
} }
$array_result = unpack('Vsize/Vhandle', $contents); $array_result = unpack('Vsize/Vhandle', $contents);
$size = $array_result['size']; $size = $array_result['size'];
$recvhandle = $array_result['handle']; $recvhandle = $array_result['handle'];
if ($recvhandle == 0 || $size == 0) if ($recvhandle == 0 || $size == 0)
{ {
throw new Exception('transport error - connection interrupted!', -32700); throw new FatalException('transport error - connection interrupted!', FatalException::INTERRUPTED);
} }
if ($size > SIZE_MAX) if ($size > SIZE_MAX)
{ {
throw new Exception("transport error - answer too big ($size)", -32700); throw new Exception("transport error - answer too big ($size)", Exception::ANWSER_TOO_BIG);
} }
self::$received += $size; self::$received += $size;

View File

@ -7,6 +7,11 @@
namespace Maniaplanet\DedicatedServer\Xmlrpc; namespace Maniaplanet\DedicatedServer\Xmlrpc;
class Exception extends \Exception {} class Exception extends \Exception
{
const ANWSER_TOO_BIG = 1;
const REQUEST_TOO_BIG = 2;
const OTHER = 999;
}
?> ?>

View File

@ -22,6 +22,7 @@ use ManiaControl\Statistics\StatisticManager;
use ManiaControl\Update\UpdateManager; use ManiaControl\Update\UpdateManager;
use Maniaplanet\DedicatedServer\Connection; use Maniaplanet\DedicatedServer\Connection;
use Maniaplanet\DedicatedServer\Xmlrpc\Exception; use Maniaplanet\DedicatedServer\Xmlrpc\Exception;
use Maniaplanet\DedicatedServer\Xmlrpc\FatalException;
require_once __DIR__ . '/Libs/Maniaplanet/DedicatedServer/Connection.php'; require_once __DIR__ . '/Libs/Maniaplanet/DedicatedServer/Connection.php';
require_once __DIR__ . '/Libs/GbxDataFetcher/gbxdatafetcher.inc.php'; require_once __DIR__ . '/Libs/GbxDataFetcher/gbxdatafetcher.inc.php';
@ -307,12 +308,8 @@ class ManiaControl implements CommandListener {
// Manager callbacks // Manager callbacks
$this->callbackManager->manageCallbacks(); $this->callbackManager->manageCallbacks();
} catch(Exception $e) { } catch(FatalException $e) {
if ($e->getMessage() == 'Connection interupted' || $e->getMessage() == 'transport error - connection interrupted!') {
$this->quit($e->getMessage()); $this->quit($e->getMessage());
return;
}
throw $e;
} }
// Manage FileReader // Manage FileReader
@ -363,7 +360,6 @@ class ManiaControl implements CommandListener {
try { try {
$this->client = Connection::factory($host, $port, self::CONNECT_TIMEOUT, $login, $pass); $this->client = Connection::factory($host, $port, self::CONNECT_TIMEOUT, $login, $pass);
} catch(Exception $e) { } catch(Exception $e) {
// TODO: is it even needed to try-catch here? we will crash anyways, YES to avoid a message report to mc website
trigger_error("Couldn't authenticate on server with user '{$login}'! " . $e->getMessage(), E_USER_ERROR); trigger_error("Couldn't authenticate on server with user '{$login}'! " . $e->getMessage(), E_USER_ERROR);
} }