private function buildRequestContext()

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];
    }