/**
* 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 );
}
}
Modus Ostentacyjny Z brakiem Zarejestrowania safari heat darmowe obroty bez depozytu się I Download Przy Pharaohs Fortune – Shweta Poddar Weddings Photography
Działa sporo decyzji, pharaohs fortune uciechy jak i również funkcje bonusowe 777 wydaje się zasilany poprzez kompozycję świetnych i prowadzących sklepów oprogramowania. Cztery środkowe poziomy mogą mieć kilku podpoziomy, żeby stworzyć dobór konsol w celu swoich internautów. Całkiem negatywne praktyka pochodzące z Prime Scratch Cards Casino, w poniższym w wydaniu do pobrania i typach przeglądarkowych.
Tysiącach grających oraz milionach rund za sprawą nich rozegranych, suma jackpotu rośnie do odwiedzenia monstrualnych wymiarów.
Na temat rezultat zmęczenia wystąpi jak potem, , którzy w całej dłuższej nadziei także znaleźć przełożenie dzięki skutki.
Magic Fruits demo owo klasyczna maszyna hazardowa, która to tradycyjnie jest posiadająca dwóch gary, trzech rzędy i pięć miarki wygrywających.
Ostatecznie, świetne darmowe automaty znajdują się także kompatybilne wraz ze wszelkimi urządzeniami mobilnymi.
Jako ekspert w dziedzinie hazardu internetowego, Victor dostarcza pod tą platformę dziedziny wysokiego standardu oraz rzetelne.
Rekompensaty po Big Bass Bonanza modelują czujności na 10 safari heat darmowe obroty bez depozytu liniach wypłacających. W całej Sizzling Hot Deluxe możemy odgrywać dzięki wszelkiego ustrojstwach, więc możesz grać dzięki telefonie oraz tablecie na swojego własnego uznania. W podobny sposób Mobilne, iPhone, jak i również iPad poprawniej współdziałają wraz z naszą grą, jak i również zamierzasz ją odzyskać nawzajem, gdziekolwiek znajdujesz. Nie masz obowiązek pobierać rozrywki w komórkę, gdyż jest doskonale przystosowana do odwiedzenia przeglądarek mobilnych oraz wciąż przystępna sieciowy. Odgrywać w całej gry hazardowe bezpłatnie wydaje się obecnie nadzwyczaj atrakcyjnym rozwiązaniem, bowiem takowa strategia wydaje się dostępna pochodzące z wszystkich dogodnego punkciku, nawet jeśli posiadasz przy sobie jedynie telefon komórkowy. O zasadniczych z tych propozycji dowiesz się w przeczytaniu tamtego przewodnika.
Więc przygotowaliśmy treściwy przewodnik, jaki wesprze wyselekcjonować własny właściwy automat. Linie wypłacające pieniądze wymagają, by identyczne ikonki uformowały czujności zgodnie z cechująca je przebiegiem. Bardzo ważne jest, żeby upewnić czujności, lub wybierany slot liczy gryzie od lewej do odwiedzenia prawej, lub także od momentu prawej do odwiedzenia lewej.
Najfajniejsze automaty gry internetowego odnajdziesz tylko i wyłącznie po GGBet!: safari heat darmowe obroty bez depozytu
W maksymalnym zakładzie, 5 klaunów, pojawiających uwagi w jednej linii wypłat, być może natychmiast nagrodzić Ciebie pięćdziesiąt,000 monet. Triple Bars, Double Bars i Kawalery Bars dają , 5000 oraz 2500 kredytów mieszkaniowych w całej wylądowaniu pięć symboli po jednej kompozycji. 5 arbuzów bądź dzwonków, powstających czujności pod miarki, ma możliwość uiścić 2000 kredytów.
Automaty Megaways
Rekomendujemy, by w każdej sytuacji poprzednio grą pod pieniążki, zagrać coś będąc demo. Darmowe gry hazardowe automaty bez rejestracji owe pustka kwestie formalne. Nie należy wpisywać jakichkolwiek danych, a tym chętniej załączać jak i również zwlekać pod akceptację fotokopii dokumentacji. Co więcej, bezpłatne hazard z brakiem logowania oznaczają bezimienność oraz niejawność. Deficyt rejestrowania się jak i również logowania to 15 bodziec, żeby zaznajomić się pochodzące z album konsol dostępnym w naszym portalu.
Robot Pharaoh’s Daughter jest to prawdziwy klejnot odnaleziony po piaskach czasu. Kluczowy współczynnik wypłat sięga х10000 oraz wydaje się być naliczany w wypadku pojawienia czujności dzięki 1 kreski pięciu wizerunków Perseusza. Oprócz tego, nie dający się kontrolować symbol dysponuje biegłość zamieniać swobodny symbol. Do odwiedzenia odpalenia rundy bonusowej potrzebne wydaje się być pojawienie uwagi Perseusza jednocześnie pod jeden. Dzikie Symbole mogą zastępować dzięki bębnach pozostałe symbole wychodzące w slocie, przyczyniając czujności ergo do odwiedzenia częstszego generowania zwycięskich kombinacji. Dowiedz się otwarcie od czasu sklepów gierek o cechująca je najlepszych slotach!
Najpopularniejsze rozrywki slotowe przez internet
W swojej istocie, automat Pharaoh’s Daughter opiera się dzięki nieskomplikowanej jednostek 5 bębnów jak i również 50 miarki wygrywających. Wygrane uzyskuje się, dopasowując znaki od momentu lewej do prawej, co wydaje się typową procedurą. Ale idea na temat jak o zwyczajnej pracach nad produktem fundamentalnej jest błędem; jest to wybitniej przystawka przed daniem głównym.
Różne jackpoty można zyskać tylko wtedy, gdy fan pobudzi grę bonusową. Żeby zrozumieć, kiedy ów kredyty funkcjonują, zagraj w całej darmowe automaty przy Play Fortune Pl. W całej PlayFortuna, Jozz, Booi Casino możesz uzyskać dostęp do uczciwej rozgrywki dzięki nowatorskim automatom wideo, jakie istnieją zamożne w całej rozrywkę, emocje jak i również adrenalinę. Upewnij uwagi, iż wcześniej wypróbujesz bezpłatne uciechy, ażeby otrzymać wiadomość, wówczas gdy całość odrabia, aby dopiero dalej przejść do odwiedzenia autentycznej gry, która nie uczyni, hdy wyrzucisz kapitał w muł. Play Fortune For Fun promuje odpowiedzialny hazard bez uzależniających skutków. Romantyczny Egipt, faraonowie – w istocie tego rodzaju wątki znajdują się związane wraz ze wieloletnimi automatami do odwiedzenia zabawy.
Na naszym wortalu pferowane znajdują się konkretne jak i również bezstronne recenzje serwisów hazardowych internetowego, które ułatwiają spontaniczny asortyment odpowiedniej platformy do odwiedzenia gry. Powyżej odkryjesz ewidencję dwunastu najlepszych witryn, gdzie duża liczba komputerów możesz sprawdzić za darmo, bez zarejestrowania się – będąc demo. Najkorzystniejsze kasyno internetowe w polsce do zabawy na prawdziwe finanse znajdziesz przy naszym współczesnym rankingu.
Asortyment stosownego automatu do komputerów owo obecnie nie lada orzech do odwiedzenia zgryzienia. Standardowe kasyno internetowe pozyskuje wejście do odwiedzenia trzy tyś slotów, jakie dzielą czujności pod dużo innych klasy jak i również podkategorii. Wszelkiego czynników, jakie wystarczy brać pod uwagę, wydaje się być naprawdę wiele, iż nie ma możliwości, żeby początkujący gracz te informacje ogarnął osobiście. Oto parę ważnych zasad, które to warto wziąć pod uwagę, selekcjonując właściwe uciechy automaty do gierek. Automaty online owo bezspornie popularne uciechy kasynowe.