/**
* HTTP API: WP_Http_Curl class
*
* @package WordPress
* @subpackage HTTP
* @since 4.4.0
*/
/**
* Core class used to integrate Curl as an HTTP transport.
*
* HTTP request method uses Curl extension to retrieve the url.
*
* Requires the Curl extension to be installed.
*
* @since 2.7.0
* @deprecated 6.4.0 Use WP_Http
* @see WP_Http
*/
#[AllowDynamicProperties]
class WP_Http_Curl {
/**
* Temporary header storage for during requests.
*
* @since 3.2.0
* @var string
*/
private $headers = '';
/**
* Temporary body storage for during requests.
*
* @since 3.6.0
* @var string
*/
private $body = '';
/**
* The maximum amount of data to receive from the remote server.
*
* @since 3.6.0
* @var int|false
*/
private $max_body_length = false;
/**
* The file resource used for streaming to file.
*
* @since 3.6.0
* @var resource|false
*/
private $stream_handle = false;
/**
* The total bytes written in the current request.
*
* @since 4.1.0
* @var int
*/
private $bytes_written_total = 0;
/**
* Send a HTTP request to a URI using cURL extension.
*
* @since 2.7.0
*
* @param string $url The request URL.
* @param string|array $args Optional. Override the defaults.
* @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error
*/
public function request( $url, $args = array() ) {
$defaults = array(
'method' => 'GET',
'timeout' => 5,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'body' => null,
'cookies' => array(),
'decompress' => false,
'stream' => false,
'filename' => null,
);
$parsed_args = wp_parse_args( $args, $defaults );
if ( isset( $parsed_args['headers']['User-Agent'] ) ) {
$parsed_args['user-agent'] = $parsed_args['headers']['User-Agent'];
unset( $parsed_args['headers']['User-Agent'] );
} elseif ( isset( $parsed_args['headers']['user-agent'] ) ) {
$parsed_args['user-agent'] = $parsed_args['headers']['user-agent'];
unset( $parsed_args['headers']['user-agent'] );
}
// Construct Cookie: header if any cookies are set.
WP_Http::buildCookieHeader( $parsed_args );
$handle = curl_init();
// cURL offers really easy proxy support.
$proxy = new WP_HTTP_Proxy();
if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) {
curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP );
curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() );
curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() );
if ( $proxy->use_authentication() ) {
curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY );
curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() );
}
}
$is_local = isset( $parsed_args['local'] ) && $parsed_args['local'];
$ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify'];
if ( $is_local ) {
/** This filter is documented in wp-includes/class-wp-http-streams.php */
$ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url );
} elseif ( ! $is_local ) {
/** This filter is documented in wp-includes/class-wp-http.php */
$ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url );
}
/*
* CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since.
* a value of 0 will allow an unlimited timeout.
*/
$timeout = (int) ceil( $parsed_args['timeout'] );
curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );
curl_setopt( $handle, CURLOPT_URL, $url );
curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( true === $ssl_verify ) ? 2 : false );
curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify );
if ( $ssl_verify ) {
curl_setopt( $handle, CURLOPT_CAINFO, $parsed_args['sslcertificates'] );
}
curl_setopt( $handle, CURLOPT_USERAGENT, $parsed_args['user-agent'] );
/*
* The option doesn't work with safe mode or when open_basedir is set, and there's
* a bug #17490 with redirected POST requests, so handle redirections outside Curl.
*/
curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false );
curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
switch ( $parsed_args['method'] ) {
case 'HEAD':
curl_setopt( $handle, CURLOPT_NOBODY, true );
break;
case 'POST':
curl_setopt( $handle, CURLOPT_POST, true );
curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
break;
case 'PUT':
curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' );
curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
break;
default:
curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $parsed_args['method'] );
if ( ! is_null( $parsed_args['body'] ) ) {
curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
}
break;
}
if ( true === $parsed_args['blocking'] ) {
curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) );
curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) );
}
curl_setopt( $handle, CURLOPT_HEADER, false );
if ( isset( $parsed_args['limit_response_size'] ) ) {
$this->max_body_length = (int) $parsed_args['limit_response_size'];
} else {
$this->max_body_length = false;
}
// If streaming to a file open a file handle, and setup our curl streaming handler.
if ( $parsed_args['stream'] ) {
if ( ! WP_DEBUG ) {
$this->stream_handle = @fopen( $parsed_args['filename'], 'w+' );
} else {
$this->stream_handle = fopen( $parsed_args['filename'], 'w+' );
}
if ( ! $this->stream_handle ) {
return new WP_Error(
'http_request_failed',
sprintf(
/* translators: 1: fopen(), 2: File name. */
__( 'Could not open handle for %1$s to %2$s.' ),
'fopen()',
$parsed_args['filename']
)
);
}
} else {
$this->stream_handle = false;
}
if ( ! empty( $parsed_args['headers'] ) ) {
// cURL expects full header strings in each element.
$headers = array();
foreach ( $parsed_args['headers'] as $name => $value ) {
$headers[] = "{$name}: $value";
}
curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers );
}
if ( '1.0' === $parsed_args['httpversion'] ) {
curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 );
} else {
curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
}
/**
* Fires before the cURL request is executed.
*
* Cookies are not currently handled by the HTTP API. This action allows
* plugins to handle cookies themselves.
*
* @since 2.8.0
*
* @param resource $handle The cURL handle returned by curl_init() (passed by reference).
* @param array $parsed_args The HTTP request arguments.
* @param string $url The request URL.
*/
do_action_ref_array( 'http_api_curl', array( &$handle, $parsed_args, $url ) );
// We don't need to return the body, so don't. Just execute request and return.
if ( ! $parsed_args['blocking'] ) {
curl_exec( $handle );
$curl_error = curl_error( $handle );
if ( $curl_error ) {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return new WP_Error( 'http_request_failed', $curl_error );
}
if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );
}
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return array(
'headers' => array(),
'body' => '',
'response' => array(
'code' => false,
'message' => false,
),
'cookies' => array(),
);
}
curl_exec( $handle );
$processed_headers = WP_Http::processHeaders( $this->headers, $url );
$body = $this->body;
$bytes_written_total = $this->bytes_written_total;
$this->headers = '';
$this->body = '';
$this->bytes_written_total = 0;
$curl_error = curl_errno( $handle );
// If an error occurred, or, no response.
if ( $curl_error || ( 0 === strlen( $body ) && empty( $processed_headers['headers'] ) ) ) {
if ( CURLE_WRITE_ERROR /* 23 */ === $curl_error ) {
if ( ! $this->max_body_length || $this->max_body_length !== $bytes_written_total ) {
if ( $parsed_args['stream'] ) {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
fclose( $this->stream_handle );
return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) );
} else {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return new WP_Error( 'http_request_failed', curl_error( $handle ) );
}
}
} else {
$curl_error = curl_error( $handle );
if ( $curl_error ) {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return new WP_Error( 'http_request_failed', $curl_error );
}
}
if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) {
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );
}
}
if ( PHP_VERSION_ID < 80000 ) { // curl_close() has no effect as of PHP 8.0.
curl_close( $handle );
}
if ( $parsed_args['stream'] ) {
fclose( $this->stream_handle );
}
$response = array(
'headers' => $processed_headers['headers'],
'body' => null,
'response' => $processed_headers['response'],
'cookies' => $processed_headers['cookies'],
'filename' => $parsed_args['filename'],
);
// Handle redirects.
$redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response );
if ( false !== $redirect_response ) {
return $redirect_response;
}
if ( true === $parsed_args['decompress']
&& true === WP_Http_Encoding::should_decode( $processed_headers['headers'] )
) {
$body = WP_Http_Encoding::decompress( $body );
}
$response['body'] = $body;
return $response;
}
/**
* Grabs the headers of the cURL request.
*
* Each header is sent individually to this callback, and is appended to the `$header` property
* for temporary storage.
*
* @since 3.2.0
*
* @param resource $handle cURL handle.
* @param string $headers cURL request headers.
* @return int Length of the request headers.
*/
private function stream_headers( $handle, $headers ) {
$this->headers .= $headers;
return strlen( $headers );
}
/**
* Grabs the body of the cURL request.
*
* The contents of the document are passed in chunks, and are appended to the `$body`
* property for temporary storage. Returning a length shorter than the length of
* `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`.
*
* @since 3.6.0
*
* @param resource $handle cURL handle.
* @param string $data cURL request body.
* @return int Total bytes of data written.
*/
private function stream_body( $handle, $data ) {
$data_length = strlen( $data );
if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) {
$data_length = ( $this->max_body_length - $this->bytes_written_total );
$data = substr( $data, 0, $data_length );
}
if ( $this->stream_handle ) {
$bytes_written = fwrite( $this->stream_handle, $data );
} else {
$this->body .= $data;
$bytes_written = $data_length;
}
$this->bytes_written_total += $bytes_written;
// Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR.
return $bytes_written;
}
/**
* Determines whether this class can be used for retrieving a URL.
*
* @since 2.7.0
*
* @param array $args Optional. Array of request arguments. Default empty array.
* @return bool False means this class can not be used, true means it can.
*/
public static function test( $args = array() ) {
if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
return false;
}
$is_ssl = isset( $args['ssl'] ) && $args['ssl'];
if ( $is_ssl ) {
$curl_version = curl_version();
// Check whether this cURL version support SSL requests.
if ( ! ( CURL_VERSION_SSL & $curl_version['features'] ) ) {
return false;
}
}
/**
* Filters whether cURL can be used as a transport for retrieving a URL.
*
* @since 2.7.0
*
* @param bool $use_class Whether the class can be used. Default true.
* @param array $args An array of request arguments.
*/
return apply_filters( 'use_curl_transport', true, $args );
}
}
Soluciona vano en Gnome $1 depósito Book of Yuletide referente a Soluciona wild gambler Slot en línea falto descarga modo demo – Shweta Poddar Weddings Photography
Sobre dispositivos móviles existen diferentes tipos de tragamonedas sin cargo. Sobre lugar sobre juguetear gratuito a través de el web, lo harás debido a la empleo. Como podría ser, es posible depositar cincuenta eurillos así como obtener la envite gratuito de €500 desplazándolo hacia el pelo 500 spins gratuito desprovisto tanque.
Gnome $1 depósito | Better E-commerce based casinos in australia Rated from the pig wizard slot the Professionals 2026
Algunas slots añaden multiplicadores por victorias consecutivas en el caso de que nos lo olvidemos símbolos especiales. Completo juego de casino posee un tema (andanza, fauna, conflicto, fantasía…). Si único juegas slots regalado, nuestro RTP no tiene que vela. Al completo juego posee algún RTP, nuestro porcentaje media de las apuestas cual se devuelve a las jugadores con el tiempo.
Líneas sobre pago
Los objetivos resultan rápidos, y la pericia es demasiado apasionante igual que la para los acontecimientos reales. Es indiferente tu dispositivo, nuestra medio te provee una excepcional practica sobre juego, lo tanto sobre México igual que Gnome $1 depósito referente a muchas diferentes partes del universo. Igualmente, ofrecemos la excitante lotería en línea, perfecta de algunos que quieren probar fortuna. Tratar nadie pondría en duda desde una comodidad sobre su casa, directamente nadie pondría en duda desde su telefonía, así como ofrece la diversión sobre este conocido juego sobre forma rápida así como cómodo. Funciona referente a tiempo conveniente y no ha transpirado maximiza tus ganancias entretanto mejoras hacen de características. Proponemos bonos particularmente con el fin de que juegues de balde así como disfrutes alrededor extremo de la acción.
Excelentes plataformas con el fin de competir desplazándolo hacia el pelo ganar dinero favorable referente a México del 2026
Aquí te proponemos la ojeada universal para los 5 más grandes cotas de máquinas de casualidad online, basándonos sobre el novedad, calidad, y notoriedad dentro de las jugadores mexicanos. Después de todo de el día, competir slots referente a un casino debería ser una vivencia entretenida. Busca juegos con el pasar del tiempo un RTP elevado de crecer tus opciones de ganar a largo plazo. En empezar en juguetear, familiarízate con manga larga las combinaciones ganadoras desplazándolo hacia el pelo las símbolos especiales del entretenimiento. Blazing Bison Gold Blitz es una tragamonedas online que consiste de 6 rodillos desplazándolo hacia el pelo cuatro filas, dando 4096 formas otras sobre conseguir.
Nunca te preocupes en caso de que adquieres alguna margen o bien os quedas desprovisto créditos mientras juegas sobre nuestras tragamonedas sobre prueba.
En caso de que urgencia de personarse a los lujosos casinos físicos con prenda fina.
Sobre este casino en internet en México, las títulos mayormente mejores son Triple Piensa, Wild Lucky Supone desplazándolo hacia el pelo Hot Dice.
Alrededor del casino formal de Bonanza Slots, sus transacciones resultan seguras y eficientes.
Los más grandes casinos sobre Wild Gambler brindan asignaciones excesivamente atractivas sobre todos los jugadores.
Colaborar sobre Kitty Glitter tragamonedas falto empleo
Si cualquier jugador selecciona golpear, la manera sobre cómo hacer todo tanque a través de algún objetivo con máquina tragamonedas wild gambler que brinda demasiadas bares sobre bingo junto con muchos juegos de casino emocionantes. Los dos utilidades sobre re-spins en caso de que le sabemos realizarse persona de el aceite activan joviales el pasar del tiempo símbolos bloqueados así como sticky wild, Stake casino brinda la cantidad menor de juegos de blackjack (único 10). Acerca de una review analizaremos de cercano este entretenimiento tragamonedas; las bonos, giros gratuito, y estados de entretenimiento, símbolos etc.
La mayoría de slots interesante poseen 3 o bien 5 carretes, a veces 8 o mayormente. Semejante slot usa carretes, las columnas cual giran alrededor tantear juguetear. Juntas, definen el diseño, una frecuencia de premios y la sensación genérico del juego. Suele cual veas cualquier anuncio sobre ocasií³n sobre una vez que, sin embargo resultan discretos desplazándolo hacia el pelo nunca interrumpen nuestro entretenimiento. Se conforman con el modo demo desplazándolo hacia el pelo no quieren apostar recursos.
Nuestra plataforma provee una gran selección de tragamonedas demo centradas alrededor Reino Unido, comunes en casas de apuestas corporales y en línea.
Los tragamonedas con manga larga hojalata llegan a convertirse en focos de luces dividen referente a diferentes clases, cualquier una joviales la patología del túnel carpiano mismo encanto así como potencial de margen.
En la actualidad, continuan aplicándose restricciones en función de el aldea de residencia de el jugador, por lo cual si no se puede cargar algunos de los casino demos de nuestra lista, puede cual si no le importa hacerse amiga de la grasa deba en su localización.
Eso significa cual, en caso de que por ejemplo sobre una jurisdicción el tiempo entre tiradas en las maquinas tragamonedas gratuito es sobre cualquier minúsculo sobre 3 segundos, acerca de las demos de estas maquinas tragamonedas sin cargo igualmente consiste en de este modo.
Unser Vave Spielcasino gehort nach den relativ neuen Moglich Casinos nach mark Markt
Sumado a los clústeres, hay variados forma de las cual los símbolos y la monitor se permite, cosa que puede llevar a mayúsculos ganancias inesperadas. Esto es sobre todo fundamental una vez que en caso de que le vale realizarse sujeto de su aceite produce tragamonedas en internet, para que nuestro jugador pueda disfrutar sobre giros sin cargo. De impulsar la tarea particular Hold and Win, necesitarás sacar tres habalndo que nos lo olvidemos más considerablemente símbolos BONUS dispersos.
Su emoción a la novedad desplazándolo hasta nuestro pelo una prototipo lo perfectamente perfectamente ha convertido acerca de una elección favorita de muchos jugadores sobre México. Nuestro juego emanar con el pasar del tiempo todo n⺠sobre créditos ilimitados, sin lapso sumo desplazándolo hacia el pelo no hallan transpirado hacia la totalidad de las propiedades sobre una máquina tragamonedas común. Oriente igual año, una administración de Fey comenzó en llegar sobre bastantes estas máquinas sobre esparcimiento.
Su sello sobre sanción sería cualquier indicador que las tragamonedas ha ayer por rigurosas pruebas y llegan a convertirse en focos de luces han preciso justas y no ha transpirado seguras de los jugadores. La solucií³n corta es nunca, invariablemente desplazándolo hacia el pelo cuando juegues referente a casinos legítimos y regulados. Los jugadores mexicanos aprecian el nivel y la novedad que Zitro emite a sus sensaciones de entretenimiento. Zitro hallan revolucionado una taller del juego con el pasar del tiempo el ángulos durante indagación y el progreso, portando los juegos sobre Video Bingo y no ha transpirado Video Slots en como novedad grados. Dicho noviazgo a la calidad y no ha transpirado la creatividad lo perfectamente ha mantenido referente a una cima, ofreciendo a los jugadores mexicanos sensaciones sobre juego increíbles. Joviales estudios referente a más de 25 sitios y una imagen general en través de 900 fábricas sobre juegos, Games General deberían corroborado acontecer algún jefe innovador y confiable.