芝麻web文件管理V1.00
编辑当前文件:/home/royashxg/www/wp-content/plugins/premium-addons-for-elementor/widgets/dep/urlopen.php
last_error = 'COULDNT_CONNECT'; return false; } return rplg_json_decode( $response['data'] ); } function rplg_urlopen( $url, $postdata = false, $headers = array() ) { $response = array( 'data' => '', 'code' => 0, ); $url = preg_replace( '/\s+/', '+', $url ); if ( function_exists( 'curl_init' ) ) { if ( ! function_exists( 'curl_setopt_array' ) ) { function curl_setopt_array( &$ch, $curl_options ) { foreach ( $curl_options as $option => $value ) { if ( ! curl_setopt( $ch, $option, $value ) ) { return false; } } return true; } } _rplg_curl_urlopen( $url, $postdata, $headers, $response ); } elseif ( ini_get( 'allow_url_fopen' ) && function_exists( 'stream_get_contents' ) ) { _rplg_fopen_urlopen( $url, $postdata, $headers, $response ); } else { _rplg_fsockopen_urlopen( $url, $postdata, $headers, $response ); } return $response; } /*-------------------------------- curl --------------------------------*/ function _rplg_curl_urlopen( $url, $postdata, $headers, &$response ) { $c = curl_init( $url ); if ( ! $c ) { return false; // Handle the error if curl_init fails } $postdata_str = rplg_get_query_string( $postdata ); $c_options = array( CURLOPT_USERAGENT => RPLG_USER_AGENT, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => ( $postdata_str ? 1 : 0 ), CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => array_merge( array( 'Expect:' ), $headers ), CURLOPT_TIMEOUT => RPLG_SOCKET_TIMEOUT, ); if ( $postdata ) { $c_options[ CURLOPT_POSTFIELDS ] = $postdata_str; } curl_setopt_array( $c, $c_options ); $open_basedir = ini_get( 'open_basedir' ); if ( empty( $open_basedir ) ) { curl_setopt( $c, CURLOPT_FOLLOWLOCATION, true ); } curl_setopt( $c, CURLOPT_SSL_VERIFYPEER, false ); $data = curl_exec( $c ); if ( $data === false ) { curl_close( $c ); return false; // Handle the error if curl_exec fails } // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string if ( stripos( $data, "HTTP/1.0 200 Connection established\r\n\r\n" ) !== false ) { $data = str_ireplace( "HTTP/1.0 200 Connection established\r\n\r\n", '', $data ); } $parts = explode( "\r\n\r\n", $data, 2 ); if ( ! isset( $parts[0] ) || empty( $parts[0] ) ) { curl_close( $c ); return false; } $resp_headers = $parts[0]; $response['data'] = $parts[1]; $response['headers'] = _rplg_get_response_headers( $resp_headers, $response ); $response['code'] = curl_getinfo( $c, CURLINFO_HTTP_CODE ); curl_close( $c ); return $response; } /*-------------------------------- fopen --------------------------------*/ function _rplg_fopen_urlopen( $url, $postdata, $headers, &$response ) { $params = array(); if ( $postdata ) { $params = array( 'http' => array( 'method' => 'POST', 'header' => implode( "\r\n", array_merge( array( 'Content-Type: application/x-www-form-urlencoded' ), $headers ) ), 'content' => rplg_get_query_string( $postdata ), 'timeout' => RPLG_SOCKET_TIMEOUT, ), ); } else { $params = array( 'http' => array( 'header' => implode( "\r\n", $headers ), ), ); } ini_set( 'user_agent', RPLG_USER_AGENT ); $ctx = stream_context_create( $params ); $fp = fopen( $url, 'rb', false, $ctx ); if ( ! $fp ) { return false; } $response_header_array = explode( ' ', $http_response_header[0], 3 ); $unused = $response_header_array[0]; $response['code'] = $response_header_array[0]; $unused = $response_header_array[2]; $resp_headers = array_slice( $http_response_header, 1 ); foreach ( $resp_headers as $unused => $header ) { $header = explode( ':', $header ); $header[0] = trim( $header[0] ); $header[1] = trim( $header[1] ); $resp_headers[ strtolower( $header[0] ) ] = strtolower( $header[1] ); } $response['data'] = stream_get_contents( $fp ); $response['headers'] = $resp_headers; } /*-------------------------------- fsockpen --------------------------------*/ function _rplg_fsockopen_urlopen( $url, $postdata, $headers, &$response ) { $buf = ''; $req = ''; $length = 0; $postdata_str = rplg_get_query_string( $postdata ); $url_pieces = parse_url( $url ); if ( !isset( $url_pieces['host'] ) ) { return false; // Return false if the URL is invalid } $host = $url_pieces['host']; if ( !isset( $url_pieces['port'] ) ) { switch ( $url_pieces['scheme'] ) { case 'http': $url_pieces['port'] = 80; break; case 'https': $url_pieces['port'] = 443; $host = 'ssl://' . $url_pieces['host']; break; default: return false; // Return false if the scheme is unsupported } } $url_pieces['path'] = $url_pieces['path'] ?? '/'; $req_host = ( $url_pieces['port'] == 80 && $url_pieces['scheme'] == 'http' ) || ( $url_pieces['port'] == 443 && $url_pieces['scheme'] == 'https' ) ? $url_pieces['host'] : $url_pieces['host'] . ':' . $url_pieces['port']; $fp = @fsockopen( $host, $url_pieces['port'], $errno, $errstr, RPLG_SOCKET_TIMEOUT ); if ( !$fp ) { return false; // Handle error if fsockopen fails } $path = $url_pieces['path'] . ( isset( $url_pieces['query'] ) ? '?' . $url_pieces['query'] : '' ); $req .= ( $postdata_str ? 'POST' : 'GET' ) . " $path HTTP/1.1\r\n"; $req .= "Host: $req_host\r\n"; $req .= rplg_get_http_headers_for_request( $postdata_str, $headers ); if ( $postdata_str ) { $req .= "\r\n\r\n" . $postdata_str; } $req .= "\r\n\r\n"; fwrite( $fp, $req ); while ( !feof( $fp ) ) { $buf .= fgets( $fp, 4096 ); } fclose( $fp ); // Close the connection after reading $parts = explode( "\r\n\r\n", $buf, 2 ); if ( !isset( $parts[1] ) ) { return false; // Handle case where response body is missing } $headers = _rplg_get_response_headers( $parts[0], $response ); $response['data'] = $parts[1]; if ( isset( $headers['transfer-encoding'] ) && strtolower( $headers['transfer-encoding'] ) === 'chunked' ) { $chunk_data = $response['data']; $joined_data = ''; while ( true ) { list( $chunk_length, $chunk_data ) = explode( "\r\n", $chunk_data, 2 ); $chunk_length = hexdec( $chunk_length ); if ( !$chunk_length || !strlen( $chunk_data ) ) { break; } $joined_data .= substr( $chunk_data, 0, $chunk_length ); $chunk_data = substr( $chunk_data, $chunk_length + 2 ); // Add 2 for \r\n after chunk $length += $chunk_length; } $response['data'] = $joined_data; } else { $length = $headers['content-length'] ?? strlen( $response['data'] ); } $response['headers'] = $headers; return true; // Return true to indicate success } /*-------------------------------- helpers --------------------------------*/ function rplg_get_query_string( $params ) { $query = ''; if ( $params ) { foreach ( $params as $key => $value ) { $query .= urlencode( $key ) . '=' . urlencode( $value ) . '&'; } } return $query; } function _rplg_get_response_headers( $headers, &$response ) { $headers = explode( "\r\n", $headers ); $header_array = explode( ' ', $headers[0], 3 ); $unused = $header_array[0]; $response['code'] = $header_array[1]; $unused = $header_array[2]; $headers = array_slice( $headers, 1 ); foreach ( $headers as $unused => $header ) { $header = explode( ':', $header ); $header[0] = trim( $header[0] ); $header[1] = trim( $header[1] ); $headers[ strtolower( $header[0] ) ] = $header[1]; } return $headers; } function rplg_get_http_headers_for_request( $content, $headers ) { $req_headers = array(); $req_headers[] = 'User-Agent: ' . RPLG_USER_AGENT; $req_headers[] = 'Connection: close'; if ( $content ) { $req_headers[] = 'Content-Length: ' . strlen( $content ); $req_headers[] = 'Content-Type: application/x-www-form-urlencoded'; } return implode( "\r\n", array_merge( $req_headers, $headers ) ); } function rplg_url_method() { if ( function_exists( 'curl_init' ) ) { return 'curl'; } elseif ( ini_get( 'allow_url_fopen' ) && function_exists( 'stream_get_contents' ) ) { return 'fopen'; } else { return 'fsockopen'; } } }