225 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace W3TC;
 | |
| 
 | |
| class Util_Http {
 | |
| 	/**
 | |
| 	 * Filter handler for use_curl_transport.
 | |
| 	 * Workaround to not use curl for extra http methods
 | |
| 	 *
 | |
| 	 * @param unknown $result boolean
 | |
| 	 * @param unknown $args   array
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	static public function use_curl_transport( $result, $args ) {
 | |
| 		if ( isset( $args['method'] ) && $args['method'] != 'GET' && $args['method'] != 'POST' )
 | |
| 			return false;
 | |
| 
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Sends HTTP request
 | |
| 	 *
 | |
| 	 * @param unknown $url  string
 | |
| 	 * @param unknown $args array
 | |
| 	 * @return WP_Error|array
 | |
| 	 */
 | |
| 	static public function request( $url, $args = array() ) {
 | |
| 		static $filter_set = false;
 | |
| 		if ( !$filter_set ) {
 | |
| 			add_filter( 'use_curl_transport',
 | |
| 				array( '\W3TC\Util_Http', 'use_curl_transport' ), 10, 2 );
 | |
| 			$filter_set = true;
 | |
| 		}
 | |
| 
 | |
| 		$args = array_merge( array(
 | |
| 				'user-agent' => W3TC_POWERED_BY
 | |
| 			), $args );
 | |
| 
 | |
| 		return wp_remote_request( $url, $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Sends HTTP GET request
 | |
| 	 *
 | |
| 	 * @param string  $url
 | |
| 	 * @param array   $args
 | |
| 	 * @return array|WP_Error
 | |
| 	 */
 | |
| 	static public function get( $url, $args = array() ) {
 | |
| 		$args = array_merge( $args, array(
 | |
| 				'method' => 'GET'
 | |
| 			) );
 | |
| 
 | |
| 		return self::request( $url, $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Downloads URL into a file
 | |
| 	 *
 | |
| 	 * @param string  $url
 | |
| 	 * @param string  $file
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	static public function download( $url, $file, $args = array() ) {
 | |
| 		if ( strpos( $url, '//' ) === 0 ) {
 | |
| 			$url = ( Util_Environment::is_https() ? 'https:' : 'http:' ) . $url;
 | |
| 		}
 | |
| 
 | |
| 		$response = self::get( $url, $args );
 | |
| 
 | |
| 		if ( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {
 | |
| 			return @file_put_contents( $file, $response['body'] );
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns upload info
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	static public function upload_info() {
 | |
| 		static $upload_info = null;
 | |
| 
 | |
| 		if ( $upload_info === null ) {
 | |
| 			$upload_info = Util_Environment::wp_upload_dir();
 | |
| 
 | |
| 			if ( empty( $upload_info['error'] ) ) {
 | |
| 				$parse_url = @parse_url( $upload_info['baseurl'] );
 | |
| 
 | |
| 				if ( $parse_url ) {
 | |
| 					$baseurlpath = ( !empty( $parse_url['path'] ) ? trim( $parse_url['path'], '/' ) : '' );
 | |
| 				} else {
 | |
| 					$baseurlpath = 'wp-content/uploads';
 | |
| 				}
 | |
| 
 | |
| 				$upload_info['baseurlpath'] = '/' . $baseurlpath . '/';
 | |
| 			} else {
 | |
| 				$upload_info = false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $upload_info;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Test the time to first byte.
 | |
| 	 *
 | |
| 	 * @param string $url URL address.
 | |
| 	 * @param bool   $nocache Whether or not to request no cache response, by sending a Cache-Control header.
 | |
| 	 * @return float|false Time in seconds until the first byte is about to be transferred or false on error.
 | |
| 	 */
 | |
| 	public static function ttfb( $url, $nocache = false ) {
 | |
| 		$ch   = curl_init( esc_url( $url ) ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 
 | |
| 		$pass = (bool) $ch;
 | |
| 		$ttfb = false;
 | |
| 		$opts = array(
 | |
| 			CURLOPT_FORBID_REUSE   => 1,
 | |
| 			CURLOPT_FRESH_CONNECT  => 1,
 | |
| 			CURLOPT_HEADER         => 0,
 | |
| 			CURLOPT_RETURNTRANSFER => 1,
 | |
| 			CURLOPT_FOLLOWLOCATION => 1,
 | |
| 			CURLOPT_SSL_VERIFYPEER => false,
 | |
| 			CURLOPT_USERAGENT      => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ),
 | |
| 		);
 | |
| 
 | |
| 		if ( $nocache ) {
 | |
| 			$opts[ CURLOPT_HTTPHEADER ] = array(
 | |
| 				'Cache-Control: no-cache',
 | |
| 				'Pragma: no-cache',
 | |
| 			);
 | |
| 
 | |
| 			$qs_arr = explode( '&', wp_parse_url( $url, PHP_URL_QUERY ) );
 | |
| 			array_push( $qs_arr, 'time=' . microtime( true ) );
 | |
| 
 | |
| 			$opts[ CURLOPT_URL ] = $url . '?' . implode( '&', $qs_arr );
 | |
| 		}
 | |
| 
 | |
| 		if ( $ch ) {
 | |
| 			$pass = curl_setopt_array( $ch, $opts ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		if ( $pass ) {
 | |
| 			$pass = (bool) curl_exec( $ch ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		if ( $pass ) {
 | |
| 			$ttfb = curl_getinfo( $ch, CURLINFO_STARTTRANSFER_TIME ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		if ( $ch ) {
 | |
| 			curl_close( $ch ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		return $ttfb;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieve HTTP headers.
 | |
| 	 *
 | |
| 	 * @param  string $url URL address.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public static function get_headers( $url ) {
 | |
| 		$ch      = curl_init( $url ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		$pass    = (bool) $ch;
 | |
| 		$headers = array();
 | |
| 		$opts    = array(
 | |
| 			CURLOPT_FORBID_REUSE   => 1,
 | |
| 			CURLOPT_FRESH_CONNECT  => 1,
 | |
| 			CURLOPT_HEADER         => 1,
 | |
| 			CURLOPT_RETURNTRANSFER => 1,
 | |
| 			CURLOPT_FOLLOWLOCATION => 1,
 | |
| 			CURLOPT_SSL_VERIFYPEER => false,
 | |
| 			CURLOPT_USERAGENT      => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ),
 | |
| 			CURLOPT_HTTPHEADER     => array(
 | |
| 				'Cache-Control: no-cache',
 | |
| 				'Pragma: no-cache',
 | |
| 			),
 | |
| 		);
 | |
| 
 | |
| 		if ( $pass ) {
 | |
| 			$pass = curl_setopt_array( $ch, $opts ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		if ( $pass ) {
 | |
| 			$response = curl_exec( $ch ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		if ( $response ) {
 | |
| 			$header_size = curl_getinfo( $ch, CURLINFO_HEADER_SIZE ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 			$header      = substr( $response, 0, $header_size );
 | |
| 
 | |
| 			foreach ( explode( "\r\n", $header ) as $index => $line ) {
 | |
| 				if ( 0 === $index ) {
 | |
| 					$headers['http_code'] = $line;
 | |
| 					$http_code_arr        = explode( ' ', $line );
 | |
| 					$headers['protocol']  = $http_code_arr[0];
 | |
| 					$headers['status']    = $http_code_arr[1];
 | |
| 				} elseif ( ! empty( $line ) && false !== strpos( $line, ':' ) ) {
 | |
| 					list ( $key, $value ) = explode( ': ', $line );
 | |
| 					$headers[ $key ]      = $value;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( $ch ) {
 | |
| 			curl_close( $ch ); // phpcs:ignore WordPress.WP.AlternativeFunctions
 | |
| 		}
 | |
| 
 | |
| 		return $headers;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Generate unique md5 value based on domain.
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public static function generate_site_id() {
 | |
| 		return md5( network_home_url() );
 | |
| 	}
 | |
| }
 |