123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- <?php
- namespace AlibabaCloud\Client\Request;
- use AlibabaCloud\Client\AlibabaCloud;
- use AlibabaCloud\Client\Credentials\Providers\CredentialsProvider;
- use AlibabaCloud\Client\Encode;
- use AlibabaCloud\Client\Exception\ClientException;
- use AlibabaCloud\Client\Exception\ServerException;
- use AlibabaCloud\Client\Filter\ApiFilter;
- use AlibabaCloud\Client\Filter\ClientFilter;
- use AlibabaCloud\Client\Filter\Filter;
- use AlibabaCloud\Client\Filter\HttpFilter;
- use AlibabaCloud\Client\Request\Traits\AcsTrait;
- use AlibabaCloud\Client\Request\Traits\ClientTrait;
- use AlibabaCloud\Client\Request\Traits\DeprecatedTrait;
- use AlibabaCloud\Client\Request\Traits\RetryTrait;
- use AlibabaCloud\Client\Result\Result;
- use AlibabaCloud\Client\SDK;
- use AlibabaCloud\Client\Traits\ArrayAccessTrait;
- use AlibabaCloud\Client\Traits\HttpTrait;
- use AlibabaCloud\Client\Traits\ObjectAccessTrait;
- use AlibabaCloud\Client\Traits\RegionTrait;
- use ArrayAccess;
- use Exception;
- use GuzzleHttp\Client;
- use GuzzleHttp\Exception\GuzzleException;
- use GuzzleHttp\HandlerStack;
- use GuzzleHttp\MessageFormatter;
- use GuzzleHttp\Middleware;
- use GuzzleHttp\Promise\PromiseInterface;
- use GuzzleHttp\Psr7\Uri;
- use Psr\Http\Message\ResponseInterface;
- /**
- * Class Request
- *
- * @package AlibabaCloud\Client\Request
- *
- * @method string stringToSign()
- * @method string resolveParameter()
- */
- abstract class Request implements ArrayAccess
- {
- use DeprecatedTrait;
- use HttpTrait;
- use RegionTrait;
- use ClientTrait;
- use AcsTrait;
- use ArrayAccessTrait;
- use ObjectAccessTrait;
- use RetryTrait;
- /**
- * Request Connect Timeout
- */
- const CONNECT_TIMEOUT = 5;
- /**
- * Request Timeout
- */
- const TIMEOUT = 10;
- /**
- * @var string HTTP Method
- */
- public $method = 'GET';
- /**
- * @var string
- */
- public $format = 'JSON';
- /**
- * @var string HTTP Scheme
- */
- protected $scheme = 'http';
- /**
- * @var string
- */
- public $client;
- /**
- * @var Uri
- */
- public $uri;
- /**
- * @var array The original parameters of the request.
- */
- public $data = [];
- /**
- * @var array
- */
- private $userAgent = [];
- /**
- * Request constructor.
- *
- * @param array $options
- *
- * @throws ClientException
- */
- public function __construct(array $options = [])
- {
- $this->client = CredentialsProvider::getDefaultName();
- $this->uri = new Uri();
- $this->uri = $this->uri->withScheme($this->scheme);
- $this->options['http_errors'] = false;
- $this->options['connect_timeout'] = self::CONNECT_TIMEOUT;
- $this->options['timeout'] = self::TIMEOUT;
- // Turn on debug mode based on environment variable.
- if (null !== \AlibabaCloud\Client\env('DEBUG') && strtolower(\AlibabaCloud\Client\env('DEBUG')) === 'sdk') {
- $this->options['debug'] = true;
- }
- // Rewrite configuration if the user has a configuration.
- if ($options !== []) {
- $this->options($options);
- }
- }
- /**
- * @param string $name
- * @param string $value
- *
- * @return $this
- * @throws ClientException
- */
- public function appendUserAgent($name, $value)
- {
- $filter_name = Filter::name($name);
- if (!UserAgent::isGuarded($filter_name)) {
- $this->userAgent[$filter_name] = Filter::value($value);
- }
- return $this;
- }
- /**
- * @param array $userAgent
- *
- * @return $this
- */
- public function withUserAgent(array $userAgent)
- {
- $this->userAgent = UserAgent::clean($userAgent);
- return $this;
- }
- /**
- * Set Accept format.
- *
- * @param string $format
- *
- * @return $this
- * @throws ClientException
- */
- public function format($format)
- {
- $this->format = ApiFilter::format($format);
- return $this;
- }
- /**
- * @param $contentType
- *
- * @return $this
- * @throws ClientException
- */
- public function contentType($contentType)
- {
- $this->options['headers']['Content-Type'] = HttpFilter::contentType($contentType);
- return $this;
- }
- /**
- * @param string $accept
- *
- * @return $this
- * @throws ClientException
- */
- public function accept($accept)
- {
- $this->options['headers']['Accept'] = HttpFilter::accept($accept);
- return $this;
- }
- /**
- * Set the request body.
- *
- * @param string $body
- *
- * @return $this
- * @throws ClientException
- */
- public function body($body)
- {
- $this->options['body'] = HttpFilter::body($body);
- return $this;
- }
- /**
- * Set the json as body.
- *
- * @param array|object $content
- *
- * @return $this
- * @throws ClientException
- */
- public function jsonBody($content)
- {
- if (!\is_array($content) && !\is_object($content)) {
- throw new ClientException(
- 'jsonBody only accepts an array or object',
- SDK::INVALID_ARGUMENT
- );
- }
- return $this->body(\json_encode($content));
- }
- /**
- * Set the request scheme.
- *
- * @param string $scheme
- *
- * @return $this
- * @throws ClientException
- */
- public function scheme($scheme)
- {
- $this->scheme = HttpFilter::scheme($scheme);
- $this->uri = $this->uri->withScheme($scheme);
- return $this;
- }
- /**
- * Set the request host.
- *
- * @param string $host
- *
- * @return $this
- * @throws ClientException
- */
- public function host($host)
- {
- $this->uri = $this->uri->withHost(HttpFilter::host($host));
- return $this;
- }
- /**
- * @param string $method
- *
- * @return $this
- * @throws ClientException
- */
- public function method($method)
- {
- $this->method = HttpFilter::method($method);
- return $this;
- }
- /**
- * @param string $clientName
- *
- * @return $this
- * @throws ClientException
- */
- public function client($clientName)
- {
- $this->client = ClientFilter::clientName($clientName);
- return $this;
- }
- /**
- * @return bool
- * @throws ClientException
- */
- public function isDebug()
- {
- if (isset($this->options['debug'])) {
- return $this->options['debug'] === true;
- }
- if (isset($this->httpClient()->options['debug'])) {
- return $this->httpClient()->options['debug'] === true;
- }
- return false;
- }
- /**
- * @throws ClientException
- * @throws ServerException
- */
- public function resolveOption()
- {
- $this->options['headers']['User-Agent'] = UserAgent::toString($this->userAgent);
- $this->cleanQuery();
- $this->cleanFormParams();
- $this->resolveHost();
- $this->resolveParameter();
- if (isset($this->options['form_params'])) {
- if (function_exists('\GuzzleHttp\Psr7\parse_query')) {
- $this->options['form_params'] = \GuzzleHttp\Psr7\parse_query(
- Encode::create($this->options['form_params'])->toString()
- );
- } else {
- $this->options['form_params'] = \GuzzleHttp\Psr7\Query::parse(
- Encode::create($this->options['form_params'])->toString()
- );
- }
- }
- $this->mergeOptionsIntoClient();
- }
- /**
- * @return Result
- * @throws ClientException
- * @throws ServerException
- */
- public function request()
- {
- $this->resolveOption();
- $result = $this->response();
- if ($this->shouldServerRetry($result)) {
- return $this->request();
- }
- if (!$result->isSuccess()) {
- throw new ServerException($result);
- }
- return $result;
- }
- /***
- * @return PromiseInterface
- * @throws Exception
- */
- public function requestAsync()
- {
- $this->resolveOption();
- return self::createClient($this)->requestAsync(
- $this->method,
- (string)$this->uri,
- $this->options
- );
- }
- /**
- * @param Request $request
- *
- * @return Client
- * @throws Exception
- */
- public static function createClient(Request $request = null)
- {
- if (AlibabaCloud::hasMock()) {
- $stack = HandlerStack::create(AlibabaCloud::getMock());
- } else {
- $stack = HandlerStack::create();
- }
- if (AlibabaCloud::isRememberHistory()) {
- $stack->push(Middleware::history(AlibabaCloud::referenceHistory()));
- }
- if (AlibabaCloud::getLogger()) {
- $stack->push(Middleware::log(
- AlibabaCloud::getLogger(),
- new MessageFormatter(AlibabaCloud::getLogFormat())
- ));
- }
- $stack->push(Middleware::mapResponse(static function (ResponseInterface $response) use ($request) {
- return new Result($response, $request);
- }));
- self::$config['handler'] = $stack;
- return new Client(self::$config);
- }
- /**
- * @throws ClientException
- * @throws Exception
- */
- private function response()
- {
- try {
- return self::createClient($this)->request(
- $this->method,
- (string)$this->uri,
- $this->options
- );
- } catch (GuzzleException $exception) {
- if ($this->shouldClientRetry($exception)) {
- return $this->response();
- }
- throw new ClientException(
- $exception->getMessage(),
- SDK::SERVER_UNREACHABLE,
- $exception
- );
- }
- }
- /**
- * Remove redundant Query
- *
- * @codeCoverageIgnore
- */
- private function cleanQuery()
- {
- if (isset($this->options['query']) && $this->options['query'] === []) {
- unset($this->options['query']);
- }
- }
- /**
- * Remove redundant Headers
- *
- * @codeCoverageIgnore
- */
- private function cleanFormParams()
- {
- if (isset($this->options['form_params']) && $this->options['form_params'] === []) {
- unset($this->options['form_params']);
- }
- }
- }
|