Back to SocketTransport class

Method connect

protected resource
connect
(\Joomla\Uri\UriInterface $uri, mixed $timeout = null)
Method to connect to a server and get the resource.
Parameters
  • \Joomla\Uri\UriInterface $uri The URI to connect with.
  • int $timeout Read timeout in seconds.
Returns
  • resource Socket connection resource.
Since
  • 1.7.3
-
  • \RuntimeException

Method connect - Source code

/**
 * Method to connect to a server and get the resource.
 *
 * @param   UriInterface  $uri      The URI to connect with.
 * @param   integer       $timeout  Read timeout in seconds.
 *
 * @return  resource  Socket connection resource.
 *
 * @since   1.7.3
 * @throws  \RuntimeException
 */
protected function connect(UriInterface $uri, $timeout = null)
{
    $errno = null;
    $err = null;
    // Get the host from the uri.
    $host = $uri->isSsl() ? 'ssl://' . $uri->getHost() : $uri->getHost();
    // If the port is not explicitly set in the URI detect it.
    if (!$uri->getPort()) {
        $port = $uri->getScheme() === 'https' ? 443 : 80;
    } else {
        $port = $uri->getPort();
    }
    // Build the connection key for resource memory caching.
    $key = md5($host . $port);
    // If the connection already exists, use it.
    if (!empty($this->connections[$key]) && \is_resource($this->connections[$key])) {
        // Connection reached EOF, cannot be used anymore
        $meta = stream_get_meta_data($this->connections[$key]);
        if ($meta['eof']) {
            if (!fclose($this->connections[$key])) {
                throw new \RuntimeException('Cannot close connection');
            }
        } elseif (!$meta['timed_out']) {
            return $this->connections[$key];
        }
    }
    if (!is_numeric($timeout)) {
        $timeout = ini_get('default_socket_timeout');
    }
    // Capture PHP errors
    $php_errormsg = '';
    $track_errors = ini_get('track_errors');
    ini_set('track_errors', true);
    // PHP sends a warning if the uri does not exists; we silence it and throw an exception instead.
    // Attempt to connect to the server
    $connection = @fsockopen($host, $port, $errno, $err, $timeout);
    if (!$connection) {
        if (!$php_errormsg) {
            // Error but nothing from php? Create our own
            $php_errormsg = sprintf('Could not connect to resource %s: %s (error code %d)', $uri, $err, $errno);
        }
        // Restore error tracking to give control to the exception handler
        ini_set('track_errors', $track_errors);
        throw new \RuntimeException($php_errormsg);
    }
    // Restore error tracking to what it was before.
    ini_set('track_errors', $track_errors);
    // Since the connection was successful let's store it in case we need to use it later.
    $this->connections[$key] = $connection;
    // If an explicit timeout is set, set it.
    if (isset($timeout)) {
        stream_set_timeout($this->connections[$key], (int) $timeout);
    }
    return $this->connections[$key];
}