mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-12-26 03:27:31 +00:00
SSH2: timeout improvements
make it so that the timeout in the constructor behaves in the same way that timeout's set via setTimeout() do. eg. isTimeout() tells you if a timeout was thrown etc.
This commit is contained in:
parent
f960410b77
commit
23c65c3839
@ -938,7 +938,7 @@ class Net_SSH2
|
||||
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
$this->connectionTimeout = $timeout;
|
||||
$this->timeout = $timeout;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -955,36 +955,24 @@ class Net_SSH2
|
||||
|
||||
$this->bitmap |= NET_SSH2_MASK_CONSTRUCTOR;
|
||||
|
||||
$timeout = $this->connectionTimeout;
|
||||
$this->curTimeout = $this->timeout;
|
||||
|
||||
$host = $this->host . ':' . $this->port;
|
||||
|
||||
$this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5
|
||||
|
||||
$start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
|
||||
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout);
|
||||
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout);
|
||||
if (!$this->fsock) {
|
||||
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
|
||||
return false;
|
||||
}
|
||||
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
||||
|
||||
$timeout-= $elapsed;
|
||||
$this->curTimeout-= $elapsed;
|
||||
|
||||
if ($timeout <= 0) {
|
||||
user_error("Cannot connect to $host. Timeout error");
|
||||
return false;
|
||||
}
|
||||
|
||||
$read = array($this->fsock);
|
||||
$write = $except = null;
|
||||
|
||||
$sec = floor($timeout);
|
||||
$usec = 1000000 * ($timeout - $sec);
|
||||
|
||||
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
||||
// the !count() is done as a workaround for <https://bugs.php.net/42682>
|
||||
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
||||
user_error("Cannot connect to $host. Banner timeout");
|
||||
if ($this->curTimeout <= 0) {
|
||||
$this->is_timeout = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1002,6 +990,29 @@ class Net_SSH2
|
||||
$extra.= $temp;
|
||||
$temp = '';
|
||||
}
|
||||
|
||||
$read = array($this->fsock);
|
||||
|
||||
if ($this->curTimeout) {
|
||||
if ($this->curTimeout < 0) {
|
||||
$this->is_timeout = true;
|
||||
return false;
|
||||
}
|
||||
$read = array($this->fsock);
|
||||
$write = $except = null;
|
||||
$start = microtime(true);
|
||||
$sec = floor($this->curTimeout);
|
||||
$usec = 1000000 * ($this->curTimeout - $sec);
|
||||
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
||||
// the !count() is done as a workaround for <https://bugs.php.net/42682>
|
||||
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
||||
$this->is_timeout = true;
|
||||
return false;
|
||||
}
|
||||
$elapsed = microtime(true) - $start;
|
||||
$this->curTimeout-= $elapsed;
|
||||
}
|
||||
|
||||
$temp.= fgets($this->fsock, 255);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user