private function requestNonce($uri)
{
if (!is_string($uri)) {
throw new InvalidArgumentException(sprintf("\$uri must be of type string, %s given.", gettype($uri)));
}
$deferred = new Deferred();
$request = (new Request())->setMethod("HEAD")->setUri($uri);
$this->http->request($request)->when(function ($error = null, Response $response = null) use($deferred, $uri) {
if ($error) {
/** @var Throwable|Exception $error */
$deferred->fail(new AcmeException("HEAD request to {$uri} failed, could not obtain a replay nonce: " . $error->getMessage(), null, $error));
} else {
if (!$response->hasHeader("replay-nonce")) {
$deferred->fail(new AcmeException("HTTP response didn't carry replay-nonce header."));
} else {
list($nonce) = $response->getHeader("replay-nonce");
$deferred->succeed($nonce);
}
}
});
return $deferred->promise();
}