From 75160b12821f7f4299cce7f0b69c83c1502ae071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Mon, 27 May 2024 13:08:29 +0200 Subject: 2024-02-19 upstream --- .../web-service-common/src/WebService/Client.php | 180 ++++++++++++++------- 1 file changed, 119 insertions(+), 61 deletions(-) (limited to 'vendor/maxmind/web-service-common/src/WebService/Client.php') diff --git a/vendor/maxmind/web-service-common/src/WebService/Client.php b/vendor/maxmind/web-service-common/src/WebService/Client.php index 98e6e3b..1c02a6c 100644 --- a/vendor/maxmind/web-service-common/src/WebService/Client.php +++ b/vendor/maxmind/web-service-common/src/WebService/Client.php @@ -1,5 +1,7 @@ accountId = $accountId; $this->licenseKey = $licenseKey; @@ -61,6 +104,9 @@ class Client if (isset($options['host'])) { $this->host = $options['host']; } + if (isset($options['useHttps'])) { + $this->useHttps = $options['useHttps']; + } if (isset($options['userAgent'])) { $this->userAgentPrefix = $options['userAgent'] . ' '; } @@ -96,9 +142,9 @@ class Client * @throws WebServiceException when some other error occurs. This also * serves as the base class for the above exceptions. * - * @return array The decoded content of a successful response + * @return array|null The decoded content of a successful response */ - public function post($service, $path, $input) + public function post(string $service, string $path, array $input): ?array { $requestBody = json_encode($input); if ($requestBody === false) { @@ -113,7 +159,7 @@ class Client ['Content-Type: application/json'] ); - list($statusCode, $contentType, $responseBody) = $request->post($requestBody); + [$statusCode, $contentType, $responseBody] = $request->post($requestBody); return $this->handleResponse( $statusCode, @@ -124,11 +170,13 @@ class Client ); } - public function get($service, $path) + public function get(string $service, string $path): ?array { - $request = $this->createRequest($path); + $request = $this->createRequest( + $path + ); - list($statusCode, $contentType, $responseBody) = $request->get(); + [$statusCode, $contentType, $responseBody] = $request->get(); return $this->handleResponse( $statusCode, @@ -139,15 +187,15 @@ class Client ); } - private function userAgent() + private function userAgent(): string { $curlVersion = curl_version(); - return $this->userAgentPrefix . 'MaxMind-WS-API/' . self::VERSION . ' PHP/' . PHP_VERSION . + return $this->userAgentPrefix . 'MaxMind-WS-API/' . self::VERSION . ' PHP/' . \PHP_VERSION . ' curl/' . $curlVersion['version']; } - private function createRequest($path, $headers = []) + private function createRequest(string $path, array $headers = []): Http\Request { array_push( $headers, @@ -170,11 +218,11 @@ class Client } /** - * @param int $statusCode the HTTP status code of the response - * @param string $contentType the Content-Type of the response - * @param string $responseBody the response body - * @param string $service the name of the service - * @param string $path the path used in the request + * @param int $statusCode the HTTP status code of the response + * @param string|null $contentType the Content-Type of the response + * @param string|null $responseBody the response body + * @param string $service the name of the service + * @param string $path the path used in the request * * @throws AuthenticationException when there is an issue authenticating the * request @@ -185,15 +233,15 @@ class Client * @throws WebServiceException when some other error occurs. This also * serves as the base class for the above exceptions * - * @return array The decoded content of a successful response + * @return array|null The decoded content of a successful response */ private function handleResponse( - $statusCode, - $contentType, - $responseBody, - $service, - $path - ) { + int $statusCode, + ?string $contentType, + ?string $responseBody, + string $service, + string $path + ): ?array { if ($statusCode >= 400 && $statusCode <= 499) { $this->handle4xx($statusCode, $contentType, $responseBody, $service, $path); } elseif ($statusCode >= 500) { @@ -208,20 +256,26 @@ class Client /** * @return string describing the JSON error */ - private function jsonErrorDescription() + private function jsonErrorDescription(): string { $errno = json_last_error(); + switch ($errno) { - case JSON_ERROR_DEPTH: + case \JSON_ERROR_DEPTH: return 'The maximum stack depth has been exceeded.'; - case JSON_ERROR_STATE_MISMATCH: + + case \JSON_ERROR_STATE_MISMATCH: return 'Invalid or malformed JSON.'; - case JSON_ERROR_CTRL_CHAR: + + case \JSON_ERROR_CTRL_CHAR: return 'Control character error.'; - case JSON_ERROR_SYNTAX: + + case \JSON_ERROR_SYNTAX: return 'Syntax error.'; - case JSON_ERROR_UTF8: + + case \JSON_ERROR_UTF8: return 'Malformed UTF-8 characters.'; + default: return "Other JSON error ($errno)."; } @@ -232,17 +286,17 @@ class Client * * @return string the constructed URL */ - private function urlFor($path) + private function urlFor(string $path): string { - return 'https://' . $this->host . $path; + return ($this->useHttps ? 'https://' : 'http://') . $this->host . $path; } /** - * @param int $statusCode the HTTP status code - * @param string $contentType the response content-type - * @param string $body the response body - * @param string $service the service name - * @param string $path the path used in the request + * @param int $statusCode the HTTP status code + * @param string|null $contentType the response content-type + * @param string|null $body the response body + * @param string $service the service name + * @param string $path the path used in the request * * @throws AuthenticationException * @throws HttpException @@ -250,20 +304,20 @@ class Client * @throws InvalidRequestException */ private function handle4xx( - $statusCode, - $contentType, - $body, - $service, - $path - ) { - if (\strlen($body) === 0) { + int $statusCode, + ?string $contentType, + ?string $body, + string $service, + string $path + ): void { + if ($body === null || $body === '') { throw new HttpException( "Received a $statusCode error for $service with no body", $statusCode, $this->urlFor($path) ); } - if (!strstr($contentType, 'json')) { + if ($contentType === null || !strstr($contentType, 'json')) { throw new HttpException( "Received a $statusCode error for $service with " . 'the following body: ' . $body, @@ -311,11 +365,11 @@ class Client * @throws InsufficientFundsException */ private function handleWebServiceError( - $message, - $code, - $statusCode, - $path - ) { + string $message, + string $code, + int $statusCode, + string $path + ): void { switch ($code) { case 'IP_ADDRESS_NOT_FOUND': case 'IP_ADDRESS_RESERVED': @@ -325,6 +379,7 @@ class Client $statusCode, $this->urlFor($path) ); + case 'ACCOUNT_ID_REQUIRED': case 'ACCOUNT_ID_UNKNOWN': case 'AUTHORIZATION_INVALID': @@ -337,6 +392,7 @@ class Client $statusCode, $this->urlFor($path) ); + case 'OUT_OF_QUERIES': case 'INSUFFICIENT_FUNDS': throw new InsufficientFundsException( @@ -345,6 +401,7 @@ class Client $statusCode, $this->urlFor($path) ); + case 'PERMISSION_REQUIRED': throw new PermissionRequiredException( $message, @@ -352,6 +409,7 @@ class Client $statusCode, $this->urlFor($path) ); + default: throw new InvalidRequestException( $message, @@ -369,7 +427,7 @@ class Client * * @throws HttpException */ - private function handle5xx($statusCode, $service, $path) + private function handle5xx(int $statusCode, string $service, string $path): void { throw new HttpException( "Received a server error ($statusCode) for $service", @@ -385,7 +443,7 @@ class Client * * @throws HttpException */ - private function handleUnexpectedStatus($statusCode, $service, $path) + private function handleUnexpectedStatus(int $statusCode, string $service, string $path): void { throw new HttpException( 'Received an unexpected HTTP status ' . @@ -396,22 +454,22 @@ class Client } /** - * @param int $statusCode the HTTP status code - * @param string $body the successful request body - * @param string $service the service name + * @param int $statusCode the HTTP status code + * @param string|null $body the successful request body + * @param string $service the service name * * @throws WebServiceException if a response body is included but not * expected, or is not expected but not * included, or is expected and included * but cannot be decoded as JSON * - * @return array the decoded request body + * @return array|null the decoded request body */ - private function handleSuccess($statusCode, $body, $service) + private function handleSuccess(int $statusCode, ?string $body, string $service): ?array { // A 204 should have no response body if ($statusCode === 204) { - if (\strlen($body) !== 0) { + if ($body !== null && $body !== '') { throw new WebServiceException( "Received a 204 response for $service along with an " . "unexpected HTTP body: $body" @@ -422,7 +480,7 @@ class Client } // A 200 should have a valid JSON body - if (\strlen($body) === 0) { + if ($body === null || $body === '') { throw new WebServiceException( "Received a 200 response for $service but did not " . 'receive a HTTP body.' @@ -441,7 +499,7 @@ class Client return $decodedContent; } - private function getCaBundle() + private function getCaBundle(): ?string { $curlVersion = curl_version(); -- cgit v1.2.3