private function connect()
{
$this->connecting = true;
$connecting =& $this->connecting;
$this->ready = new Future();
$ready =& $this->ready;
$futures =& $this->futures;
$count =& $this->count;
$requests =& $this->requests;
$ws = new swoole_http_client($this->ip, $this->port, $this->ssl);
$ws->on('error', function ($ws) use(&$futures, &$count) {
$error = new Exception(socket_strerror($ws->errCode));
foreach ($futures as $future) {
$future->reject($error);
}
$futures = array();
$count = 0;
});
$buffer = '';
$self = $this;
$ws->on('message', function ($ws, $frame) use($self, &$buffer, &$futures, &$count, &$requests, &$ready) {
if ($frame->finish) {
$data = $buffer . $frame->data;
$buffer = '';
list(, $id) = unpack('N', substr($data, 0, 4));
if (isset($futures[$id])) {
$future = $futures[$id];
unset($futures[$id]);
--$count;
$future->resolve(substr($data, 4));
}
if ($count < 100 && count($requests) > 0) {
++$count;
$request = array_pop($requests);
$ready->then(function () use($ws, $request, &$futures) {
$id = $request[0];
$data = pack('N', $id) . $request[1];
if ($ws->push($data, WEBSOCKET_OPCODE_BINARY, true) === false) {
if (isset($futures[$id])) {
$error = new Exception(socket_strerror($ws->errCode));
$futures[$id]->reject($error);
}
}
});
}
if ($count === 0) {
if (!$self->keepAlive) {
$ws->close();
}
}
} else {
$buffer .= $frame->data;
}
});
$ws->set(array('keep_alive' => $this->keepAlive, 'timeout' => $this->timeout / 1000));
$ws->setHeaders($this->header);
$this->ws = $ws;
$this->ws->upgrade($this->path, function () use(&$connecting, &$ready) {
$connecting = false;
$ready->resolve(null);
});
}