diff options
Diffstat (limited to 'Postman/Postman-Mail/sendgrid/vendor/sendgrid/php-http-client/lib/Client.php')
-rw-r--r-- | Postman/Postman-Mail/sendgrid/vendor/sendgrid/php-http-client/lib/Client.php | 596 |
1 files changed, 0 insertions, 596 deletions
diff --git a/Postman/Postman-Mail/sendgrid/vendor/sendgrid/php-http-client/lib/Client.php b/Postman/Postman-Mail/sendgrid/vendor/sendgrid/php-http-client/lib/Client.php deleted file mode 100644 index ec732b9..0000000 --- a/Postman/Postman-Mail/sendgrid/vendor/sendgrid/php-http-client/lib/Client.php +++ /dev/null @@ -1,596 +0,0 @@ -<?php - -/** - * HTTP Client library - * - * @author Matt Bernier <dx@sendgrid.com> - * @author Elmer Thomas <dx@sendgrid.com> - * @copyright 2018 SendGrid - * @license https://opensource.org/licenses/MIT The MIT License - * @version GIT: <git_id> - * @link http://packagist.org/packages/sendgrid/php-http-client - */ - -namespace SendGrid; - -/** - * - * Class Client - * @package SendGrid - * @version 3.9.5 - * - * Quickly and easily access any REST or REST-like API. - * - * @method Response get($body = null, $query = null, $headers = null) - * @method Response post($body = null, $query = null, $headers = null) - * @method Response patch($body = null, $query = null, $headers = null) - * @method Response put($body = null, $query = null, $headers = null) - * @method Response delete($body = null, $query = null, $headers = null) - * - * @method Client version($value) - * @method Client|Response send() - * - * Adding all the endpoints as a method so code completion works - * - * General - * @method Client stats() - * @method Client search() - * @method Client monthly() - * @method Client sums() - * @method Client monitor() - * @method Client test() - * - * Access settings - * @method Client access_settings() - * @method Client activity() - * @method Client whitelist() - * - * Alerts - * @method Client alerts() - * - * Api keys - * @method Client api_keys() - * - * ASM - * @method Client asm() - * @method Client groups() - * - * Browsers - * @method Client browsers() - * - * Campaigns - * @method Client campaigns() - * @method Client schedules() - * @method Client now() - * - * Categories - * @method Client categories() - * - * Clients - * @method Client clients() - * - * ContactDB - * @method Client contactdb() - * @method Client custom_fields() - * @method Client lists() - * @method Client recipients() - * @method Client billable_count() - * @method Client count() - * @method Client reserved_fields() - * @method Client segments() - * - * Devices - * @method Client devices() - * - * Geo - * @method Client geo() - * - * Ips - * @method Client ips() - * @method Client assigned() - * @method Client pools() - * @method Client warmup() - * - * Mail - * @method Client mail() - * @method Client batch() - * - * Mailbox Providers - * @method Client mailbox_providers() - * - * Mail settings - * @method Client mail_settings() - * @method Client address_whitelist() - * @method Client bcc() - * @method Client bounce_purge() - * @method Client footer() - * @method Client forward_bounce() - * @method Client forward_spam() - * @method Client plain_content() - * @method Client spam_check() - * @method Client template() - * - * Partner settings - * @method Client partner_settings() - * @method Client new_relic() - * - * Scopes - * @method Client scopes() - * - * Senders - * @method Client senders() - * @method Client resend_verification() - * - * Sub Users - * @method Client subusers() - * @method Client reputations() - * - * Supressions - * @method Client suppressions() - * @method Client global() - * @method Client blocks() - * @method Client bounces() - * @method Client invalid_emails() - * @method Client spam_reports() - * @method Client unsubcribes() - * - * Templates - * @method Client templates() - * @method Client versions() - * @method Client activate() - * - * Tracking settings - * @method Client tracking_settings() - * @method Client click() - * @method Client google_analytics() - * @method Client open() - * @method Client subscription() - * - * User - * @method Client user() - * @method Client account() - * @method Client credits() - * @method Client email() - * @method Client password() - * @method Client profile() - * @method Client scheduled_sends() - * @method Client enforced_tls() - * @method Client settings() - * @method Client username() - * @method Client webhooks() - * @method Client event() - * @method Client parse() - * - * Missed any? Simply add them by doing: @method Client method() - */ -class Client -{ - const TOO_MANY_REQUESTS_HTTP_CODE = 429; - - /** - * @var string - */ - protected $host; - - /** - * @var array - */ - protected $headers; - - /** - * @var string - */ - protected $version; - - /** - * @var array - */ - protected $path; - - /** - * @var array - */ - protected $curlOptions; - - /** - * @var bool - */ - protected $isConcurrentRequest; - - /** - * @var array - */ - protected $savedRequests; - - /** - * @var bool - */ - protected $retryOnLimit; - - /** - * These are the supported HTTP verbs - * - * @var array - */ - private $methods = ['get', 'post', 'patch', 'put', 'delete']; - - /** - * Initialize the client - * - * @param string $host the base url (e.g. https://api.sendgrid.com) - * @param array $headers global request headers - * @param string $version api version (configurable) - this is specific to the SendGrid API - * @param array $path holds the segments of the url path - * @param array $curlOptions extra options to set during curl initialization - * @param bool $retryOnLimit set default retry on limit flag - */ - public function __construct($host, $headers = null, $version = null, $path = null, $curlOptions = null, $retryOnLimit = false) - { - $this->host = $host; - $this->headers = $headers ?: []; - $this->version = $version; - $this->path = $path ?: []; - $this->curlOptions = $curlOptions ?: []; - $this->retryOnLimit = $retryOnLimit; - $this->isConcurrentRequest = false; - $this->savedRequests = []; - } - - /** - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * @return string|null - */ - public function getVersion() - { - return $this->version; - } - - /** - * @return array - */ - public function getPath() - { - return $this->path; - } - - /** - * @return array - */ - public function getCurlOptions() - { - return $this->curlOptions; - } - - /** - * Set extra options to set during curl initialization - * - * @param array $options - * - * @return Client - */ - public function setCurlOptions(array $options) - { - $this->curlOptions = $options; - - return $this; - } - - /** - * Set default retry on limit flag - * - * @param bool $retry - * - * @return Client - */ - public function setRetryOnLimit($retry) - { - $this->retryOnLimit = $retry; - - return $this; - } - - /** - * Set concurrent request flag - * - * @param bool $isConcurrent - * - * @return Client - */ - public function setIsConcurrentRequest($isConcurrent) - { - $this->isConcurrentRequest = $isConcurrent; - - return $this; - } - - /** - * Build the final URL to be passed - * - * @param array $queryParams an array of all the query parameters - * - * @return string - */ - private function buildUrl($queryParams = null) - { - $path = '/' . implode('/', $this->path); - if (isset($queryParams)) { - $path .= '?' . http_build_query($queryParams); - } - return sprintf('%s%s%s', $this->host, $this->version ?: '', $path); - } - - /** - * Creates curl options for a request - * this function does not mutate any private variables - * - * @param string $method - * @param array $body - * @param array $headers - * - * @return array - */ - private function createCurlOptions($method, $body = null, $headers = null) - { - $options = [ - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HEADER => true, - CURLOPT_CUSTOMREQUEST => strtoupper($method), - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_FAILONERROR => false - ] + $this->curlOptions; - - if (isset($headers)) { - $headers = array_merge($this->headers, $headers); - } else { - $headers = $this->headers; - } - - if (isset($body)) { - $encodedBody = json_encode($body); - $options[CURLOPT_POSTFIELDS] = $encodedBody; - $headers = array_merge($headers, ['Content-Type: application/json']); - } - $options[CURLOPT_HTTPHEADER] = $headers; - - return $options; - } - - /** - * @param array $requestData - * e.g. ['method' => 'POST', 'url' => 'www.example.com', 'body' => 'test body', 'headers' => []] - * @param bool $retryOnLimit - * - * @return array - */ - private function createSavedRequest(array $requestData, $retryOnLimit = false) - { - return array_merge($requestData, ['retryOnLimit' => $retryOnLimit]); - } - - /** - * @param array $requests - * - * @return array - */ - private function createCurlMultiHandle(array $requests) - { - $channels = []; - $multiHandle = curl_multi_init(); - - foreach ($requests as $id => $data) { - $channels[$id] = curl_init($data['url']); - $curlOpts = $this->createCurlOptions($data['method'], $data['body'], $data['headers']); - curl_setopt_array($channels[$id], $curlOpts); - curl_multi_add_handle($multiHandle, $channels[$id]); - } - - return [$channels, $multiHandle]; - } - - /** - * Prepare response object - * - * @param resource $channel the curl resource - * @param string $content - * - * @return Response object - */ - private function parseResponse($channel, $content) - { - $headerSize = curl_getinfo($channel, CURLINFO_HEADER_SIZE); - $statusCode = curl_getinfo($channel, CURLINFO_HTTP_CODE); - - $responseBody = substr($content, $headerSize); - - $responseHeaders = substr($content, 0, $headerSize); - $responseHeaders = explode("\n", $responseHeaders); - $responseHeaders = array_map('trim', $responseHeaders); - - return new Response($statusCode, $responseBody, $responseHeaders); - } - - /** - * Retry request - * - * @param array $responseHeaders headers from rate limited response - * @param string $method the HTTP verb - * @param string $url the final url to call - * @param array $body request body - * @param array $headers original headers - * - * @return Response response object - */ - private function retryRequest(array $responseHeaders, $method, $url, $body, $headers) - { - $sleepDurations = $responseHeaders['X-Ratelimit-Reset'] - time(); - sleep($sleepDurations > 0 ? $sleepDurations : 0); - return $this->makeRequest($method, $url, $body, $headers, false); - } - - /** - * Make the API call and return the response. - * This is separated into it's own function, so we can mock it easily for testing. - * - * @param string $method the HTTP verb - * @param string $url the final url to call - * @param array $body request body - * @param array $headers any additional request headers - * @param bool $retryOnLimit should retry if rate limit is reach? - * - * @return Response object - */ - public function makeRequest($method, $url, $body = null, $headers = null, $retryOnLimit = false) - { - $channel = curl_init($url); - - $options = $this->createCurlOptions($method, $body, $headers); - - curl_setopt_array($channel, $options); - $content = curl_exec($channel); - - $response = $this->parseResponse($channel, $content); - - if ($response->statusCode() === self::TOO_MANY_REQUESTS_HTTP_CODE && $retryOnLimit) { - $responseHeaders = $response->headers(true); - return $this->retryRequest($responseHeaders, $method, $url, $body, $headers); - } - - curl_close($channel); - - return $response; - } - - /** - * Send all saved requests at once - * - * @param array $requests - * - * @return Response[] - */ - public function makeAllRequests(array $requests = []) - { - if (empty($requests)) { - $requests = $this->savedRequests; - } - list($channels, $multiHandle) = $this->createCurlMultiHandle($requests); - - // running all requests - $isRunning = null; - do { - curl_multi_exec($multiHandle, $isRunning); - } while ($isRunning); - - // get response and close all handles - $retryRequests = []; - $responses = []; - $sleepDurations = 0; - foreach ($channels as $id => $channel) { - - $content = curl_multi_getcontent($channel); - $response = $this->parseResponse($channel, $content); - - if ($response->statusCode() === self::TOO_MANY_REQUESTS_HTTP_CODE && $requests[$id]['retryOnLimit']) { - $headers = $response->headers(true); - $sleepDurations = max($sleepDurations, $headers['X-Ratelimit-Reset'] - time()); - $requestData = [ - 'method' => $requests[$id]['method'], - 'url' => $requests[$id]['url'], - 'body' => $requests[$id]['body'], - 'headers' => $headers, - ]; - $retryRequests[] = $this->createSavedRequest($requestData, false); - } else { - $responses[] = $response; - } - - curl_multi_remove_handle($multiHandle, $channel); - } - curl_multi_close($multiHandle); - - // retry requests - if (!empty($retryRequests)) { - sleep($sleepDurations > 0 ? $sleepDurations : 0); - $responses = array_merge($responses, $this->makeAllRequests($retryRequests)); - } - return $responses; - } - - /** - * Add variable values to the url. (e.g. /your/api/{variable_value}/call) - * Another example: if you have a PHP reserved word, such as and, in your url, you must use this method. - * - * @param string $name name of the url segment - * - * @return Client object - */ - public function _($name = null) - { - if (isset($name)) { - $this->path[] = $name; - } - $client = new static($this->host, $this->headers, $this->version, $this->path); - $client->setCurlOptions($this->curlOptions); - $client->setRetryOnLimit($this->retryOnLimit); - $this->path = []; - - return $client; - } - - /** - * Dynamically add method calls to the url, then call a method. - * (e.g. client.name.name.method()) - * - * @param string $name name of the dynamic method call or HTTP verb - * @param array $args parameters passed with the method call - * - * @return Client|Response|Response[]|null object - */ - public function __call($name, $args) - { - $name = strtolower($name); - - if ($name === 'version') { - $this->version = $args[0]; - return $this->_(); - } - - // send all saved requests - if (($name === 'send') && $this->isConcurrentRequest) { - return $this->makeAllRequests(); - } - - if (in_array($name, $this->methods, true)) { - $body = isset($args[0]) ? $args[0] : null; - $queryParams = isset($args[1]) ? $args[1] : null; - $url = $this->buildUrl($queryParams); - $headers = isset($args[2]) ? $args[2] : null; - $retryOnLimit = isset($args[3]) ? $args[3] : $this->retryOnLimit; - - if ($this->isConcurrentRequest) { - // save request to be sent later - $requestData = ['method' => $name, 'url' => $url, 'body' => $body, 'headers' => $headers]; - $this->savedRequests[] = $this->createSavedRequest($requestData, $retryOnLimit); - return null; - } - - return $this->makeRequest($name, $url, $body, $headers, $retryOnLimit); - } - - return $this->_($name); - } -} |