/**
* 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 );
}
}
Money Master حلقات خلفية مجانية تمامًا وعملات معدنية كل يوم، تأكد من حصولك على مكافآتك اليوم! – Shweta Poddar Weddings Photography
Money Master حلقات خلفية مجانية تمامًا وعملات معدنية كل يوم، تأكد من حصولك على مكافآتك اليوم!
يجب أن يكون السبب الحقيقي وراء هذه المغامرة هو تحريف عناصر التحكم الجديدة لرؤية مستقبلك. أظهر أحدث المبدعين، حسنور كازي، أن تقنيات السرية للتطبيق الأحدث تتراوح بين التعامل مع التحقيق منذ ما تمت مناقشته أدناه. يمكن أن يكون من المفيد إعلام القرية الجديدة والتدرب على المضيف الافتراضي الجديد بشكل أكبر. التطبيق الجديد سهل الاستخدام للغاية وسنحتاج إلى تمكينه ليكون صديقًا للشركاء التابعين.
Coin Learn تدور مجانًا بنسبة 100 بالمائة ويمكنك صياغة الروابط في 15 مارس
Coin Learn هي لعبة ممتعة عبر الإنترنت تعمل فيها الدورات كعنصر حاسم لتسهيل التقدم وتحقيق المزايا ويمكنك زيادة مجتمعك. وعندما تكون جادًا بشأن استكمال مجموعات البطاقات والاستفسار عن اللفات من أحبائك يوميًا، يمكنك الحصول على الكثير منها في وقت قصير! لدى Money Grasp حوادث إضافية تحدث داخل الألعاب، إحداها للحصول على دورات إضافية أو أي شيء آخر حتى إنهاء الأشياء.
الأحداث والمكافآت: طريقك إلى Free Revolves
ما عليك سوى استخدام روابط موقع الويب الرئيسي الجديد.
قم بتسجيل جميع التقارير ويمكنك الحصول على توصيات بشأن لعبة شعبية على الإنترنت على الهاتف المحمول واحصل على الرفاهية الجديدة!
ولجعل اللعبة عبر الإنترنت أكثر إثارة للاهتمام، قامت Moonlight Energetic بالكثير من التحسينات.
احتفظ بمصطلحي الشخصي، والبريد الإلكتروني، وموقع الويب الخاص بي داخل متصفح الإنترنت لاستخدامه في المرة القادمة التي أبدي فيها رأيي.
تعرف على كيفية تصنيف الأموال وتعلم الدورات المجانية تمامًا كل يوم.
انقر فوق الخيار الموجود على أيقونة الالتواء، وسيبدأ زملائك في الفريق بالتبرع gate777 كازينو البحرين لك شخصيًا. لذلك، من الطبيعي أن تجربها بنفسك. هل تحاول العثور على Money Master اليوم ولفات مجانية وعملات ذهبية بنسبة 100 بالمائة؟
يعد هذا حقًا حدثًا خاصًا يمكّنك من الحصول على دورات مجانية.
تأكد جدًا من حصولك على عدد كافٍ من الأشخاص لتتمكن من تبادل الدورات المجانية تمامًا يوميًا والنمو معها.
الجائزة الأخيرة في اليوم الثلاثين هي الثدي الغامض!
لا، لا يمكنك إنشاء دورة واحدة باستخدام برنامج واحد بخلاف Money Grasp.
العملات الذهبية تعلم: الدورات المجانية والعملات الذهبية بنسبة 100 بالمائة في 16 يونيو
لا يتحكم الموقع في الطريقة التي تستفيد بها عملية لعبة الفيديو Coin Master. إنهم يديرون المدينة من الغارات ويمكنك فترات بسبب المحترفين الآخرين. لا تريد أن تكتشف ثلاث حقائب يد من العملات المعدنية معظم الامتيازات الأخرى.
Money Master ثمانمائة خطاف ملتوي: هل يمكن أن تكون جائزة حقيقية؟
إنها حقًا مكافأة أكثر من مجرد وسيلة فعالة لجمع المزيد من اللفات. بالنسبة للأفراد الذين ينضمون إلى قائمة المشتركين الخاصة بهم من خلال التسجيل، يمكنك الحصول على روابط خلفية مباشرة من عنوان بريدهم الإلكتروني للحصول على المزيد من الدورات المجانية. يمكنك شراء أول معلومات عن الارتباطات التشعبية الجديدة ومزايا مجانية بنسبة 100 بالمائة بعد Money Grasp على أغطية الشبكات الاجتماعية الرسمية الخاصة بهم. إن استرداد الأموال المجانية يدور ويمكنك الحصول على العملات الذهبية وهو في الواقع أمر بسيط للغاية! عبر مجتمعك الخاص للحصول على صندوق مكافأة مع دورات مجانية تمامًا.
وقت ضائع في انتظار المواقف المضاعفة
بالونات موسيقى البوب المنجرفة بسهولة لتجميع دورات مجانية تمامًا قبل أن تسافر جانبًا. في حالة نفاد جهاز ضبط الوقت الخاص بالقسيمة، تعود فوائدها إلى وضعها الطبيعي. تميل اللعبة إلى فتحها على الفور ويتم تدويرها إلى الحساب في غضون دقائق. تعرف على كيفية تحسين مزاياك وعدم تفويت أي فرصة صغيرة.
سيد العملات الذهبية: دورات مجانية تمامًا وعملات ذهبية يمكن أن تحصل على 19
تشير الكثير من مواقع المراهنة ولوحات الرسائل إلى أنها توفر روابط خلفية لتحديد موقع العملات الذهبية ويمكنك دورات لا حدود لها. أتابع وسائل التواصل الاجتماعي الرسمية للعبتك كل يوم ويمكنك تجميع المزايا الجديدة من هناك. لذا كن حذرًا فيما يتعلق بإضافة عدد كبير جدًا من أحبائك إلى الدورات الخاصة بك، بينما يتركونك بالتأكيد تتقلب لمدة أربع وعشرين ساعة، ولكن يمكنهم مداهمتك بملايين العملات المعدنية. نحن نقدم للصفحات فرصة أخرى لتسجيل الامتيازات اليومية التي تحتوي على رموز قسيمة دوران مجانية تمامًا على ألعاب Coin Grasp.