126 lines
3.7 KiB
PHP
126 lines
3.7 KiB
PHP
<?php
|
|
|
|
// No direct access please
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
if ( ! defined( 'WOOCOMMERCE_CONNECT_SERVER_URL' ) ) {
|
|
define( 'WOOCOMMERCE_CONNECT_SERVER_URL', 'https://api.woocommerce.com/' );
|
|
}
|
|
|
|
if ( ! class_exists( 'WC_Connect_API_Client_Live' ) ) {
|
|
require_once plugin_basename( 'class-wc-connect-api-client.php' );
|
|
|
|
class WC_Connect_API_Client_Live extends WC_Connect_API_Client {
|
|
|
|
protected function request( $method, $path, $body = array() ) {
|
|
|
|
// TODO - incorporate caching for repeated identical requests
|
|
if ( ! is_array( $body ) ) {
|
|
return new WP_Error(
|
|
'request_body_should_be_array',
|
|
__( 'Unable to send request to WooCommerce Tax server. Body must be an array.', 'woocommerce-services' )
|
|
);
|
|
}
|
|
|
|
$url = trailingslashit( WOOCOMMERCE_CONNECT_SERVER_URL );
|
|
$url = apply_filters( 'wc_connect_server_url', $url );
|
|
$url = trailingslashit( $url ) . ltrim( $path, '/' );
|
|
|
|
// Add useful system information to requests that contain bodies
|
|
if ( in_array( $method, array( 'POST', 'PUT' ) ) ) {
|
|
$body = $this->request_body( $body );
|
|
$body = wp_json_encode( apply_filters( 'wc_connect_api_client_body', $body ) );
|
|
|
|
if ( ! $body ) {
|
|
return new WP_Error(
|
|
'unable_to_json_encode_body',
|
|
__( 'Unable to encode body for request to WooCommerce Tax server.', 'woocommerce-services' )
|
|
);
|
|
}
|
|
}
|
|
|
|
$headers = $this->request_headers();
|
|
if ( is_wp_error( $headers ) ) {
|
|
return $headers;
|
|
}
|
|
|
|
$http_timeout = 60; // 1 minute
|
|
if ( function_exists( 'wc_set_time_limit' ) ) {
|
|
wc_set_time_limit( $http_timeout + 10 );
|
|
}
|
|
$args = array(
|
|
'headers' => $headers,
|
|
'method' => $method,
|
|
'body' => $body,
|
|
'redirection' => 0,
|
|
'compress' => true,
|
|
'timeout' => $http_timeout,
|
|
);
|
|
$args = apply_filters( 'wc_connect_request_args', $args );
|
|
|
|
$response = wp_remote_request( $url, $args );
|
|
$response_code = wp_remote_retrieve_response_code( $response );
|
|
|
|
// If the received response is not JSON, return the raw response.
|
|
$content_type = wp_remote_retrieve_header( $response, 'content-type' );
|
|
if ( false === strpos( $content_type, 'application/json' ) ) {
|
|
if ( 200 != $response_code ) {
|
|
return new WP_Error(
|
|
'wcc_server_error',
|
|
sprintf(
|
|
__( 'Error: The WooCommerce Tax server returned HTTP code: %d', 'woocommerce-services' ),
|
|
$response_code
|
|
),
|
|
array(
|
|
'response_status_code' => $response_code,
|
|
)
|
|
);
|
|
}
|
|
return $response;
|
|
}
|
|
|
|
$response_body = wp_remote_retrieve_body( $response );
|
|
if ( ! empty( $response_body ) ) {
|
|
$response_body = json_decode( $response_body );
|
|
}
|
|
|
|
if ( 200 != $response_code ) {
|
|
if ( empty( $response_body ) ) {
|
|
return new WP_Error(
|
|
'wcc_server_empty_response',
|
|
sprintf(
|
|
__( 'Error: The WooCommerce Tax server returned ( %d ) and an empty response body.', 'woocommerce-services' ),
|
|
$response_code
|
|
),
|
|
array(
|
|
'response_status_code' => $response_code,
|
|
)
|
|
);
|
|
}
|
|
|
|
$error = property_exists( $response_body, 'error' ) ? $response_body->error : '';
|
|
$message = property_exists( $response_body, 'message' ) ? $response_body->message : '';
|
|
$data = property_exists( $response_body, 'data' ) ? (array) $response_body->data : array();
|
|
|
|
$data['response_status_code'] = $response_code;
|
|
|
|
return new WP_Error(
|
|
'wcc_server_error_response',
|
|
sprintf(
|
|
/* translators: %1$s: error code, %2$s: error message, %3$d: HTTP response code */
|
|
__( 'Error: The WooCommerce Tax server returned: %1$s %2$s ( %3$d )', 'woocommerce-services' ),
|
|
$error,
|
|
$message,
|
|
$response_code
|
|
),
|
|
$data
|
|
);
|
|
}
|
|
|
|
return $response_body;
|
|
}
|
|
}
|
|
}
|