tcpserver : add exception catch, not log for "stream_select(): unable to select [4]: Interrupted system call (max_fd=0)" error, more tests

git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@5992 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
2020-05-13 20:34:48 +00:00
parent cf4c92b7bf
commit 43eac6a156

View File

@@ -176,6 +176,18 @@ class tcpserver
// {{{
{
$this->logMethods (__METHOD__, func_get_args ());
if (empty ($this->addresses))
throw new \Exception (dgettext ("domframework",
"Can not start TCP server loop without addresses initialized"), 500);
if (empty ($this->ports))
throw new \Exception (dgettext ("domframework",
"Can not start TCP server loop without port initialized"), 500);
foreach ($this->ports as $port)
{
if ($port < 1024 && posix_getuid() !== 0)
throw new \Exception (dgettext ("domframework",
"Can not start TCP server on port $port without root user"), 500);
}
$this->logDebug ("Initialize the signal managers");
//declare (ticks = 1);
pcntl_async_signals (true);
@@ -359,7 +371,8 @@ class tcpserver
ob_start ();
// Catch the error messages from the application to not hang if triggered
// An other handler can be set in function to execute
set_error_handler (function () {});
set_error_handler ([$this, "errorHandler"]);
set_exception_handler ([$this, "exceptionHandler"]);
@fclose (STDIN);
@fclose (STDOUT);
@fclose (STDERR);
@@ -476,9 +489,7 @@ class tcpserver
if ($this->socket === null)
throw new \Exception ("Can not send to client : not connected", 500);
$length = strlen ($data);
ob_start ();
$sentLen = fwrite ($this->socket, $data);
$this->debug (ob_get_flush ());
if ($sentLen < $length)
throw new \Exception ("Can not send data to client", 500);
$this->logSend ($data);
@@ -515,7 +526,7 @@ $this->debug (ob_get_flush ());
throw new \Exception ("Can not read from client : ".
error_get_last ()["message"], 500);
}
$this->logReceive ($data);
$this->logReceive ($read);
return $read;
}
// }}}
@@ -639,10 +650,25 @@ $this->debug (ob_get_flush ());
public function errorHandler ($errNo, $errMsg, $file, $line)
// {{{
{
// @-operator : error suppressed
if (0 === error_reporting())
return false;
$this->logError ("line $line : $errMsg");
}
// }}}
/** Exception catcher
* By default do nothing, but can be overrided by the user
* @param object $exception The exception to catch
*/
public function exceptionHandler ($exception)
// {{{
{
$this->logError ("Exception ".$exception->getMessage () . " (".
$exception->getFile ().":".$exception->getLine().")");
}
// }}}
/////////////////////////
// PRIVATE METHODS //
/////////////////////////