in src/ClientImpl.php [356:474]
private function applyOptions()
{
// GuzzleHttp\Client
// request options
$config = \array_merge([], $this->requestOptions);
// stack
$handler = $this->innerOptions['handler'] ?: GuzzleHttp\Utils::chooseHandler();
$stack = new GuzzleHttp\HandlerStack($handler);
// retryer
$stack->push(RetryMiddleware::create(
static function (
int $retries,
\Psr\Http\Message\RequestInterface $request,
\Throwable $reason,
array $options
) {
if (!$request->getBody()->isSeekable()) {
return false;
}
// check sink
if (isset($options['sink']) && !$options['sink']->isSeekable()) {
return false;
}
if ($retries + 1 >= $options['sdk_context']['retry_max_attempts']) {
return false;
}
// api's timeout
// retryable error
if (!$options['sdk_context']['retryer']->isErrorRetryable($reason)) {
return false;
}
// reset state
try {
$request->getBody()->rewind();
if (isset($options['sink'])) {
$options['sink']->rewind();
$options['sink']->resetMemState();
}
} catch (\Exception $e) {
throw new Exception\StreamRewindException($e->getMessage(), $reason);
}
if ($options['sdk_context']['reset_time']) {
$options['signing_context']->time = null;
}
//printf("retry cnt %d, %d\n", $retries, $options['sdk_context']['retry_max_attempts']);
return true;
},
static function (int $retries, array $options): int {
//int in milliseconds
$delay = $options['sdk_context']['retryer']->retryDelay($retries, null);
return (int)($delay * 1000);
},
), 'retryer');
// signer
$stack->push(static function (callable $handler): callable {
return static function (\Psr\Http\Message\RequestInterface $request, array $options) use ($handler) {
$sdk_context = $options['sdk_context'];
$provider = $sdk_context['credentials_provider'];
if (!($provider instanceof Credentials\AnonymousCredentialsProvider)) {
try {
$cred = $provider->getCredentials();
} catch (\Exception $e) {
throw new Exception\CredentialsException('Fetch Credentials raised an exception', $e);
}
if ($cred == null || !$cred->hasKeys()) {
throw new \InvalidArgumentException("Credentials is null or empty.");
}
$signer = $sdk_context['signer'];
$signingContext = $options['signing_context'];
$signingContext->request = $request;
$signingContext->credentials = $cred;
$signer->sign($signingContext);
$request = $signingContext->request;
}
return $handler($request, $options);
};
}, 'signer');
// http response checker
$stack->push(static function (callable $handler): callable {
return static function ($request, array $options) use ($handler) {
if (empty($options['response_handlers'])) {
return $handler($request, $options);
}
return $handler($request, $options)->then(
static function (\Psr\Http\Message\ResponseInterface $response) use ($request, $options) {
foreach ($options['response_handlers'] as $h) {
if (\is_callable($h)) {
$h($request, $response, $options);
} else {
call_user_func($h, $request, $response, $options);
}
}
return $response;
}
);
};
}, 'response_handlers');
$stack->push(GuzzleHttp\Middleware::redirect(), 'allow_redirects');
$stack->push(GuzzleHttp\Middleware::prepareBody(), 'prepare_body');
$config['handler'] = $stack;
$this->httpClient = new GuzzleHttp\Client($config);
}