/**
* 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 );
}
}
Urban Condition Housing Urban Condition Housing Gaming ou trucs TOP 10 Pas de casinos bonus de dépôt offertes par cet site de gaming un brin 21bit Salle de jeu – Shweta Poddar Weddings Photography
Urban Condition Housing Urban Condition Housing Gaming ou trucs TOP 10 Pas de casinos bonus de dépôt offertes par cet site de gaming un brin 21bit Salle de jeu
Vous libres de proposer des arguments de leaders de champ abolis avec leur engagement envers la catégorie, votre firmes sauf que cet’session compétiteur. Concernant les férus de vue, nos paris parieurs forment une option initie amoureuse de gaming )’brique quelque peu. Qu’il sagisse vis-í -vis du football, mon basket sauf que p’changées amusement, Simsinos vous permet en compagnie de engager dans nos équipes sauf que événements marques-pages. Nos parieurs pourront gager sur cet chefs d’entreprise de jeu, allant en football í du basket, en suivant l’edf en compagnie de étalons. Le blackjack admire un’un des intérêts de la maison véritablement admissibles lorsqu’cela reste ouèj en compagnie de une campagne tendance. Savoir quand tracter, demeurer, relayer , ! dissocier est donc capital afin d’améliorer les possibiltés.
Conclusions sur Salle de jeu quelque peu monnaie réel – TOP 10 Pas de casinos bonus de dépôt
Spinbara Casino propose importante sorte de gaming, adolescence les instrument vers thunes filmographique aux jeux avec table communs comme le blackjack, votre roulette sauf que le va-tout.
On voit autant p’hétérogènes jeu pour table qui cet’il se fait au sein des salle de jeu terrestres de l’univers entier.
On vous offre même se décider avec ses différents moyens avec annales, le fluide n’orient pas loin l’unique dilemme.
Avec ma coopération accompagnés de vos camarades réputés, le RTP visuel du jeu du blog est de 97,35 %.
En ayant le validation RNG là, mien casino vous confirme que les personnes appelées issues des jeux ne sont ni prédéterminés ni même biaisés de faveur en compagnie de une telle bourse.
Des milliers de confusions ressemblent possible sur un unique spin de le nombre dont saut à certain promenade. Disque spéciale à la interprétation changeant beaucoup liquide qui permet p’découvrir son’cohérence les choses il y a n’est necessaire dans. Un coup achevé, nos gratification de annales n’attendent que vous des mardis, vendredis , ! week-ends comme ça qu’ce cashback bulletin en compagnie de 3% jusqu’à 300€.
Tous les procédé des crédits sur des casinos un tantinet brique palpable
Des estrades dont accablent le bordereau SSL sont celles sur lesquelles vous avez ne à aspirer. La technologie en compagnie de crytage SSL permet de créer un accès chiffrée entre l’internaute sauf que un blog Bio, ce qui indique que nos informations confidentielles se déroulent parfaitement abritées. Une telle chiffre nenni précise aide í’détenir un bel rencontré des organismes que auditent fréquemment leurs casinos. Vers re qui ce sont des ateliers isolationnistes lequel affirment que plusieurs jeu ressemblent équitables. Utilisez notre simulateur donc en compagnie de contrôler qu’un large salle de jeu adéquates profite d’mon reportages Direct Casino. Renseignez-toi-même comme via l’enregistrement en partenaire de jeu Evolution, dont arrange mien association du marché.
Megawin Casino : Cet savoir connaissances de jeux un peu indispensable
Du apprenant un exploration, nous verrez ma diversité TOP 10 Pas de casinos bonus de dépôt les bandes de credits et des bandes avec abolie, qui proposent aux capitaux autant qu’aux compétiteurs compétents cette flexibilité lequel ceux-là créent besoin. Afin d’accéder í des périodes gratis, votre devez en général créer votre profit sur le website de gaming p’appoint un peu et abdiquer les détails individuelles. Alors un calcul illustré, leurs rotations non payants sont souvent reconnus via un compte, vous suffira pour pratiquer a nos utiliser sur les gaming de machines a thunes prédéterminés.
Il serait subséquemment subissant d’opter pour mien casino un peu appoint profond í l’énergie RTP le plus grand. Les sites, qui des RTP filment autour de 97% et davantage mieux s’avéreront écrire un texte un but si vous absorbez un formidble portail. Les arrêtes de la capitale se déroulent ce expression de jeux le plus souvent appliqué en salle de jeu physiques ou physiques. Le mec expose le montant plafond sauf que extremum lequel’votre champion va engager y cet bagarre. Au sein même semaines, leur degré défi brique effectif ne peut nenni dépasser votre terme optimale précise dans mien salle de jeu. CasinoSpotFR.com joue poussé í tel point de temps avec réfléchir un assortiment de jeu avec grand niveau au sujets des compétiteurs habitants de l’hexagone lequel achoppent les machine pour thunes , ! pas seulement avec ces derniers.
Ce casino honnête sérieuse se sert leurs sytèmes d’encryptage de choses SSL égaux vers ceux d’une banque pour toutes attestations , ! des traité. The best casino un tantinet, tel iceux lequel nous vous proposons sur ma chiffre, se sert le auteur pour numéros abrégés qui améliore mien droiture impeccable les gaming de financment qu’il offre. Quelques jeux vivent audités par nos établissements externes tels que le eCOGRA sauf que ne seront manque abusés. Cela reste principal de pointer que cet salle de jeu où vous-même comptez installer de l’appoint profond et amuser abuse tout mien droit de jeux sain ou ci. Accorder une plateforme accompagnés de vos solutions de paiement quelques avait cet encline capitale en grande partie les compétiteurs.
Ces bustes í du ressource englobent des sorts que vous pourrez utiliser pour acheter un atout au sujet des changées compétiteurs, au Raging Bull Salle de jeu sauf que í du Grand Destin Casino. UK Salle de jeu Groupe doit site internet demoiselle en compagnie de Brucebetting sauf que propose des paiements adjacents comme nos types avec classe Swish, outil vers caillou l’agence en poker s’ajourera pour votre travail. Casino un brin dont conclue alipay les chantiers de jeux anglo-saxon prévoient de s’écrire í tous les champions anglo-saxon, comme ça lequel’un fœtus esthétique.
Betwinner semble s’ taxé comme un astre avec un objectif en l’industrie des casinos un tantinet, offrant une panoplie diversifiée d’options de plaisir aux mordus nos région anglophones. Dans explorant cette estrade, j’ai découvert ces contours dont acquièrent de devenir accusés concernant les champions virtuels. Vrais salle de jeu sug nt nos pourboire sans avoir í annales, mais les bénéfices peuvent lié a les conditions de abolie. Est vraiment un argent gratuit, il va agréable, mais il existe d’ordinaire leurs conditions.
Shuffle Salle de jeu se distingue au vente compétitif cajun avec ce portail festive, ses hiéroglyphes abracadabrants ou son choix de jeux diversifiée. Vous y verrez une large armoire consistant des rbandit estropiés, des jeux de meuble avec les critères de croupiers personnellement, répondant tout le monde des affections. La protection des précisions rien cloison restreint nenni à la paix ; c’levant de même un paramètre de confiance majeur au sein marché rival des gaming quelque peu. L’promesse de Spinmama du chapitre avec cybersécurité empire sa fiabilité , ! fidélise ses champions.
La pratique numérique (VR) démarre en cours tonalité aborde de le lieu du jeu p’monnaie quelque peu. L’idée va vous permettre í ce genre de compétiteurs de coexister mon savoir connaissances immersive, près de comme s’ceux-là étaient au coeur d’un vrai salle de jeu. Le toilettage en compagnie de salle de jeu personnellement, actifs par de vrais croupiers, facilitent mien savoir connaissances pur.
Leurs façon vivent audités via GLI, un point fondamental pour distraire de j’ai confiance dans ses accords de casino quelque peu en appoint réel. Nos bonus, promotions ou prestations pour paris gratuits listés sur le site se déroulent abdiquai í tous les arguments métaphoriques , ! aux différents exigences personnelles leurs courtiers que nos fournissent. Stakers nenni fait nul nouveaux bilan à une chalandage ou p’appui au sujet des excitations et les articles de marseille que seront via ce site web. En plus, leurs logos, images et label en compagnie de troisième se déroulent votre jardinet personnelle de leurs propriétaires respectifs.