晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/rainic/public_html/oldTZh/wp-content/plugins/wp-rocket/inc/Engine/CriticalPath/ |
Upload File : |
<?php
namespace WP_Rocket\Engine\CriticalPath;
use stdClass;
use WP_Error;
class APIClient {
/**
* Constant url for Critical Path API job.
*/
const API_URL = 'https://cpcss.wp-rocket.me/api/job/';
/**
* Sends a generation request to the Critical Path API.
*
* @since 3.6
*
* @param string $url The URL to send a CPCSS generation request for.
* @param array $params Optional. Parameters needed to be sent in the body. Default: [].
* @param string $item_type Optional. Type for this item if it's custom or specific type. Default: custom.
* @return array
*/
public function send_generation_request( $url, $params = [], $item_type = 'custom' ) {
$params['url'] = $url;
$is_mobile = isset( $params['mobile'] ) && $params['mobile'];
$response = wp_remote_post(
self::API_URL,
[
/**
* Filters the parameters sent to the Critical CSS generator API.
*
* @since 2.11
*
* @param array $params An array of parameters to send to the API.
*/
'body' => apply_filters( 'rocket_cpcss_job_request', $params ),
]
);
return $this->prepare_response( $response, $url, $is_mobile, $item_type );
}
/**
* Prepare the response to be returned.
*
* @since 3.6
*
* @param array|WP_Error $response The response or WP_Error on failure.
* @param string $url Url to be checked.
* @param bool $is_mobile Optional. Flag for if this is cpcss for mobile or not. Default: false.
* @param string $item_type Optional. Type for this item if it's custom or specific type. Default: custom.
*
* @return array|WP_Error
*/
private function prepare_response( $response, $url, $is_mobile = false, $item_type = 'custom' ) {
if ( is_wp_error( $response ) ) {
return new WP_Error(
$this->get_response_code( $response ),
sprintf(
// translators: %1$s = type of content, %2$s = error message.
__( 'Critical CSS for %1$s not generated. Error: %2$s', 'rocket' ),
( 'custom' === $item_type ) ? $url : $item_type,
$response->get_error_message()
),
[
'status' => 400,
]
);
}
$response_data = $this->get_response_data( $response );
$response_status_code = $this->get_response_status( $response, ( isset( $response_data->status ) ) ? $response_data->status : null );
$succeeded = $this->get_response_success( $response_status_code, $response_data );
if ( $succeeded ) {
return $response_data;
}
$response_message = $this->get_response_message( $response_status_code, $response_data, $url, $is_mobile, $item_type );
if ( 200 === $response_status_code ) {
$response_status_code = 400;
}
return new WP_Error(
$this->get_response_code( $response ),
$response_message,
[
'status' => $response_status_code,
]
);
}
/**
* Get the status of response.
*
* @since 3.6
*
* @param int $response_code Response code to check success or failure.
* @param stdClass $response_data Object of data returned from request.
*
* @return bool success or failed.
*/
private function get_response_success( $response_code, $response_data ) {
return (
200 === $response_code
&&
! empty( $response_data )
&&
(
(
isset( $response_data->status )
&&
200 === $response_data->status
)
||
(
isset( $response_data->data )
&&
isset( $response_data->data->id )
)
)
);
}
/**
* Get response status code/number.
*
* @since 3.6
*
* @param array|WP_Error $response The response or WP_Error on failure.
* @param null|int $status Optional. Status code to overwrite the response status. Default: null.
*
* @return int status code|number of response.
*/
private function get_response_status( $response, $status = null ) {
if ( ! is_null( $status ) ) {
return (int) $status;
}
return (int) wp_remote_retrieve_response_code( $response );
}
/**
* Get response message.
*
* @since 3.6
*
* @param int $response_status_code Response status code.
* @param stdClass $response_data Object of data returned from request.
* @param string $url Url for the web page to be checked.
* @param bool $is_mobile Optional. Flag for if this is cpcss for mobile or not. Default: false.
* @param string $item_type Optional. Type for this item if it's custom or specific type. Default: custom.
*
* @return string
*/
private function get_response_message( $response_status_code, $response_data, $url, $is_mobile = false, $item_type = 'custom' ) {
$message = '';
switch ( $response_status_code ) {
case 200:
if ( ! isset( $response_data->data->id ) ) {
$message .= sprintf(
$is_mobile
?
// translators: %s = item URL.
__( 'Critical CSS for %1$s on mobile not generated. Error: The API returned an empty response.', 'rocket' )
:
// translators: %s = item URL.
__( 'Critical CSS for %1$s not generated. Error: The API returned an empty response.', 'rocket' ),
( 'custom' === $item_type ) ? $url : $item_type
);
}
break;
case 400:
case 440:
case 404:
// translators: %s = item URL.
$message .= sprintf(
$is_mobile
// translators: %s = item URL.
? __( 'Critical CSS for %1$s on mobile not generated.', 'rocket' )
// translators: %s = item URL.
: __( 'Critical CSS for %1$s not generated.', 'rocket' ),
( 'custom' === $item_type ) ? $url : $item_type
);
break;
default:
$message .= sprintf(
$is_mobile
// translators: %s = URL.
? __( 'Critical CSS for %1$s on mobile not generated. Error: The API returned an invalid response code.', 'rocket' )
// translators: %s = URL.
: __( 'Critical CSS for %1$s not generated. Error: The API returned an invalid response code.', 'rocket' ),
( 'custom' === $item_type ) ? $url : $item_type
);
break;
}
if ( isset( $response_data->message ) ) {
// translators: %1$s = error message.
$message .= ' ' . sprintf( __( 'Error: %1$s', 'rocket' ), $response_data->message );
}
return $message;
}
/**
* Get response data from the API.
*
* @since 3.6
*
* @param array|WP_Error $response The response or WP_Error on failure.
*
* @return mixed response of API.
*/
private function get_response_data( $response ) {
return json_decode( wp_remote_retrieve_body( $response ) );
}
/**
* Get our internal response code [Not the standard HTTP codes].
*
* @since 3.6
*
* @param array|WP_Error $response The response or WP_Error on failure.
*
* @return string response code.
*/
private function get_response_code( $response ) {
// Todo: we can return code based on the response status number, for example 404 not_found.
return 'cpcss_generation_failed';
}
/**
* Get job details by calling API with job ID.
*
* @since 3.6
*
* @param string $job_id ID for the job to get details.
* @param string $url URL to be used in error messages.
* @param bool $is_mobile Optional. Flag for if this is cpcss for mobile or not. Default: false.
* @param string $item_type Optional. Type for this item if it's custom or specific type. Default: custom.
*
* @return mixed|WP_Error Details for job.
*/
public function get_job_details( $job_id, $url, $is_mobile = false, $item_type = 'custom' ) {
$response = wp_remote_get(
self::API_URL . "{$job_id}/"
);
return $this->prepare_response( $response, $url, $is_mobile, $item_type );
}
}