From afb15deb9e4a5dade2c9a1c369f3ea05537f6778 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Sun, 25 Feb 2018 12:29:20 +0000 Subject: [PATCH] Improve management of connections and server errors --- src/danog/MadelineProto/Connection.php | 6 +++--- src/danog/MadelineProto/MTProtoTools/MessageHandler.php | 7 +++++++ src/danog/MadelineProto/MTProtoTools/ResponseHandler.php | 5 +++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/danog/MadelineProto/Connection.php b/src/danog/MadelineProto/Connection.php index 8d2438e1..fa0dae7a 100644 --- a/src/danog/MadelineProto/Connection.php +++ b/src/danog/MadelineProto/Connection.php @@ -47,7 +47,7 @@ class Connection public $object_queue = []; public $ack_queue = []; public $i = []; - private $must_open = false; + public $must_open = false; public function __magic_construct($proxy, $extra, $ip, $port, $protocol, $timeout, $ipv6) { @@ -330,8 +330,8 @@ class Connection throw new Exception($response['description'], $response['code']); } $close = $response['protocol'] === 'HTTP/1.0'; - if (isset($headers['connection'])) { - $close = $headers['connection'] === 'close'; + if (isset($response['headers']['connection'])) { + $close = strtolower($response['headers']['connection']) === 'close'; } if ($close) { $this->close_and_reopen(); diff --git a/src/danog/MadelineProto/MTProtoTools/MessageHandler.php b/src/danog/MadelineProto/MTProtoTools/MessageHandler.php index 4a99aebc..7db6a2cf 100644 --- a/src/danog/MadelineProto/MTProtoTools/MessageHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/MessageHandler.php @@ -70,6 +70,13 @@ trait MessageHandler */ public function recv_message($datacenter) { + if ($this->datacenter->sockets[$datacenter]->must_open) { + if ($this->is_http($datacenter)) { + $this->method_call('http_wait', ['max_wait' => 500, 'wait_after' => 150, 'max_delay' => 500], ['datacenter' => $datacenter]); + } else { + $this->method_call('ping', ['ping_id' => 0], ['datacenter' => $datacenter]); + } + } $payload = $this->datacenter->sockets[$datacenter]->read_message(); if (strlen($payload) === 4) { return $this->unpack_signed_int($payload); diff --git a/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php b/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php index 20380aad..7309fff9 100644 --- a/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php @@ -311,6 +311,8 @@ trait ResponseHandler throw new \danog\MadelineProto\PTSException($server_answer['error_message']); } switch ($server_answer['error_code']) { + case 500: + throw new \danog\MadelineProto\Exception('Re-executing query after server error...'); case 303: $this->datacenter->curdc = $aargs['datacenter'] = (int) preg_replace('/[^0-9]+/', '', $server_answer['error_message']); @@ -359,8 +361,7 @@ trait ResponseHandler throw new \danog\MadelineProto\Exception('Re-executing query...'); } - case 500: - throw new \danog\MadelineProto\Exception('Re-executing query after server error...'); + default: throw new \danog\MadelineProto\RPCErrorException($server_answer['error_message'], $server_answer['error_code']); }