PluginProbe
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 27.9
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v27.9
28.5 28.4 28.3 28.2 28.1 28.0 27.9 27.8 27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 All 129 releases
wordpress-seo / src / ai / http-request / application / request-handler.php

request-handler.php in Yoast SEO – Advanced SEO with real-time guidance and built-in AI 27.9, at src/ai/http-request/application/request-handler.php

114 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
4
5 namespace Yoast\WP\SEO\AI\HTTP_Request\Application;
6
7 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Bad_Request_Exception;
8 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Forbidden_Exception;
9 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Internal_Server_Error_Exception;
10 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Not_Found_Exception;
11 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Payment_Required_Exception;
12 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Request_Timeout_Exception;
13 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Service_Unavailable_Exception;
14 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Too_Many_Requests_Exception;
15 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\Unauthorized_Exception;
16 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Exceptions\WP_Request_Exception;
17 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Request;
18 use Yoast\WP\SEO\AI\HTTP_Request\Domain\Response;
19 use Yoast\WP\SEO\AI\HTTP_Request\Infrastructure\API_Client;
20
21 /**
22 * Class Request_Handler
23 * Handles the request to Yoast AI API.
24 *
25 * @makePublic
26 */
27 class Request_Handler implements Request_Handler_Interface {
28
29 private const TIMEOUT = 60;
30
31 /**
32 * The API client.
33 *
34 * @var API_Client
35 */
36 private $api_client;
37
38 /**
39 * The response parser.
40 *
41 * @var Response_Parser
42 */
43 private $response_parser;
44
45 /**
46 * Request_Handler constructor.
47 *
48 * @param API_Client $api_client The API client.
49 * @param Response_Parser $response_parser The response parser.
50 */
51 public function __construct( API_Client $api_client, Response_Parser $response_parser ) {
52 $this->api_client = $api_client;
53 $this->response_parser = $response_parser;
54 }
55
56 // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- PHPCS doesn't take into account exceptions thrown in called methods.
57
58 /**
59 * Executes the request to the API.
60 *
61 * @param Request $request The request to execute.
62 *
63 * @return Response The response from the API.
64 *
65 * @throws Bad_Request_Exception When the request fails for any other reason.
66 * @throws Forbidden_Exception When the response code is 403.
67 * @throws Internal_Server_Error_Exception When the response code is 500.
68 * @throws Not_Found_Exception When the response code is 404.
69 * @throws Payment_Required_Exception When the response code is 402.
70 * @throws Request_Timeout_Exception When the response code is 408.
71 * @throws Service_Unavailable_Exception When the response code is 503.
72 * @throws Too_Many_Requests_Exception When the response code is 429.
73 * @throws Unauthorized_Exception When the response code is 401.
74 * @throws WP_Request_Exception When the request fails for any other reason.
75 */
76 public function handle( Request $request ): Response {
77 $api_response = $this->api_client->perform_request(
78 $request->get_action_path(),
79 $request->get_body(),
80 $request->get_headers(),
81 $request->is_post(),
82 );
83
84 $response = $this->response_parser->parse( $api_response );
85
86 // phpcs:disable WordPress.Security.EscapeOutput.ExceptionNotEscaped -- false positive.
87 switch ( $response->get_response_code() ) {
88 case 200:
89 return $response;
90 case 401:
91 throw new Unauthorized_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
92 case 402:
93 throw new Payment_Required_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code(), null, $response->get_missing_licenses() );
94 case 403:
95 throw new Forbidden_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
96 case 404:
97 throw new Not_Found_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
98 case 408:
99 throw new Request_Timeout_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
100 case 429:
101 throw new Too_Many_Requests_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code(), null, $response->get_missing_licenses() );
102 case 500:
103 throw new Internal_Server_Error_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
104 case 503:
105 throw new Service_Unavailable_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
106 default:
107 throw new Bad_Request_Exception( $response->get_message(), $response->get_response_code(), $response->get_error_code() );
108 }
109 // phpcs:enable WordPress.Security.EscapeOutput.ExceptionNotEscaped
110 }
111
112 // phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
113 }
114