/**
* @coroutine
*
* @param \Icicle\Socket\Socket $socket
* @param \Icicle\Http\Message\Request $request
* @param mixed[] $options
*
* @return \Generator
*
* @resolve \Icicle\Http\Message\Response
*/
public function send(Socket $socket, Request $request, array $options = []) : \Generator
{
$timeout = isset($options['timeout']) ? (double) $options['timeout'] : self::DEFAULT_TIMEOUT;
$allowPersistent = isset($options['allow_persistent']) ? (bool) $options['allow_persistent'] : true;
$request = (yield from $this->driver->buildRequest($request, $timeout, $allowPersistent));
yield from $this->driver->writeRequest($socket, $request, $timeout);
return yield from $this->driver->readResponse($socket, $timeout);
}