in src/ClientImpl.php [540:675]
private function buildRequestContext(OperationInput &$input, array &$options)
{
$context = [];
// GuzzleHttp's request options for api
if (isset($options['request_options'])) {
if (isset($options['request_options']['connect_timeout'])) {
$context['connect_timeout'] = $options['request_options']['connect_timeout'];
}
if (isset($options['request_options']['read_timeout'])) {
$context['read_timeout'] = $options['request_options']['read_timeout'];
}
if (isset($options['request_options']['timeout'])) {
$context['timeout'] = $options['request_options']['timeout'];
}
if (isset($options['request_options']['on_headers'])) {
$context['on_headers'] = $options['request_options']['on_headers'];
}
if (isset($options['request_options']['sink'])) {
$sink = $options['request_options']['sink'];
$sink = SinkStreamWrapper::sinkFor($sink);
$context['sink'] = $sink;
$context['on_headers'] = function (\Psr\Http\Message\ResponseInterface $response) use (&$sink) {
$sink->on_headers($response);
};
}
if (isset($options['request_options']['stream'])) {
$context['stream'] = $options['request_options']['stream'];
}
if (isset($options['request_options']['on_stats'])) {
$context['on_stats'] = $options['request_options']['on_stats'];
}
}
// retry options for api
$retryer = $options['retryer'] ?? $this->sdkOptions['retryer'];
if (Utils::safetyInt($options['retry_max_attempts'] ?? 0) > 0) {
$retry_max_attempts = $options['retry_max_attempts'];
} else if (isset($this->sdkOptions['retry_max_attempts'])) {
$retry_max_attempts = $this->sdkOptions['retry_max_attempts'];
} else {
$retry_max_attempts = $retryer->getMaxAttempts();
}
// sdk's part
$sdk_context = [
'retry_max_attempts' => \max($retry_max_attempts, 1),
'retryer' => $retryer,
'signer' => $this->sdkOptions['signer'],
'credentials_provider' => $this->sdkOptions['credentials_provider'],
];
$context['sdk_context'] = $sdk_context;
// Request
// host & path & query
/**
* @var \Psr\Http\Message\UriInterface $endpoint
*/
$endpoint = $this->sdkOptions['endpoint'];
$baseuri = $endpoint->getScheme() . "://" . $endpoint->getAuthority();
$uri = $this->buildUri($input, new GuzzleHttp\Psr7\Uri($baseuri));
$query = $input->getParameters();
if (!empty($query)) {
$uri = $uri->withQuery(
http_build_query($query, '', '&', PHP_QUERY_RFC3986)
);
}
$request = new GuzzleHttp\Psr7\Request(
$input->getMethod(),
$uri,
$input->getHeaders(),
$input->getBody(),
);
// user agent
$request = $request->withAddedHeader('User-Agent', $this->innerOptions['user_agent']);
// Add a default content-type if possible.
if ($input->hasOpMetadata('detect_content_type') &&
!isset($options['sdk_presign']) &&
!$request->hasHeader('Content-Type')) {
$value = Utils::guessContentType($input->getKey());
// compatibility with PrepareBodyMiddleware
if ($value == null && $request->getBody() != null) {
if ($uri = $request->getBody()->getMetadata('uri')) {
if (is_string($uri) && $type = Utils::guessContentType($uri)) {
$value = $type;
}
}
}
if ($value != null) {
$request = $request->withAddedHeader('Content-Type', $value);
}
}
// signing context
$signingContext = new Signer\SigningContext(
$this->sdkOptions['product'],
$this->sdkOptions['region'],
$input->getBucket(),
$input->getKey(),
$request
);
if (isset($this->sdkOptions['additional_headers'])) {
$signingContext->additionalHeaders = $this->sdkOptions['additional_headers'];
}
$auth_method = $options['auth_method'] ?? $this->sdkOptions['auth_method'];
$signingContext->authMethodQuery = $auth_method === 'query';
$signingContext->subResource = ($input->getOpMetadata())['sub-resource'] ?? [];
// signing time from user
if (isset(($input->getOpMetadata())['expiration_time'])) {
$signingContext->time = ($input->getOpMetadata())['expiration_time'];
}
$context['signing_context'] = $signingContext;
$context['sdk_context']['reset_time'] = $signingContext->time == null;
// response-handler
$responseHandlers = [
[ClientImpl::class, 'httpErrors'],
];
if (isset($options['response_handlers'])) {
foreach ($options['response_handlers'] as $h) {
\array_push($responseHandlers, $h);
}
}
$context['response_handlers'] = $responseHandlers;
return [$request, $context];
}