public function sendAndReceive($request, $future, stdClass $context)
{
$conn = $this->fetch();
if ($conn !== null) {
$this->send($request, $future, $context, $conn);
} else {
if ($this->size < $this->client->maxPoolSize) {
$self = $this;
$conn = $this->create();
$conn->on('error', function ($conn) use($future) {
$future->reject(new Exception(socket_strerror($conn->errCode)));
});
$conn->on('close', function ($conn) use($self, $future) {
$self->clean($conn);
if ($conn->errCode !== 0) {
$future->reject(new Exception(socket_strerror($conn->errCode)));
} else {
$future->reject(new Exception('The server is closed.'));
}
$self->size--;
});
$conn->set(array('keep_alive' => $this->client->keepAlive));
$conn->setHeaders($this->client->header);
$self->send($request, $future, $context, $conn);
} else {
$this->requests[] = array($request, $future, $context);
}
}
}