mirror of
https://github.com/kremalicious/krtmn.git
synced 2024-12-22 09:13:25 +01:00
172 lines
5.5 KiB
PHP
172 lines
5.5 KiB
PHP
<?php
|
|
// TODO: improve this.
|
|
// yourls_get_http_transport: use static vars
|
|
// yourls_get_remote_content: return array( content, status, code )
|
|
|
|
// Determine best transport for GET request.
|
|
// Order of preference: curl, fopen, fsockopen.
|
|
// Return 'curl', 'fopen', 'fsockopen' or false if nothing works
|
|
function yourls_get_http_transport( $url ) {
|
|
|
|
$transports = array();
|
|
|
|
$scheme = parse_url( $url, PHP_URL_SCHEME );
|
|
$is_ssl = ( $scheme == 'https' || $scheme == 'ssl' );
|
|
|
|
// Test transports by order of preference, best first
|
|
|
|
// curl
|
|
if( function_exists('curl_init') && function_exists('curl_exec') )
|
|
$transports[]= 'curl';
|
|
|
|
// fopen. Doesn't work with https?
|
|
if( !$is_ssl && function_exists('fopen') && ini_get('allow_url_fopen') )
|
|
$transports[]= 'fopen';
|
|
|
|
// fsock
|
|
if( function_exists( 'fsockopen' ) )
|
|
$transports[]= 'fsockopen';
|
|
|
|
$best = ( $transports ? array_shift( $transports ) : false );
|
|
|
|
return yourls_apply_filter( 'get_http_transport', $best, $transports );
|
|
}
|
|
|
|
// Get remote content via a GET request using best transport available
|
|
// Returns $content (might be an error message) or false if no transport available
|
|
function yourls_get_remote_content( $url, $maxlen = 4096, $timeout = 5 ) {
|
|
$url = yourls_sanitize_url( $url );
|
|
|
|
$transport = yourls_get_http_transport( $url );
|
|
if( $transport ) {
|
|
$content = call_user_func( 'yourls_get_remote_content_'.$transport, $url, $maxlen, $timeout );
|
|
} else {
|
|
$content = false;
|
|
}
|
|
|
|
return yourls_apply_filter( 'get_remote_content', $content, $url, $maxlen, $timeout );
|
|
}
|
|
|
|
// Get remote content using curl. Needs sanitized $url. Returns $content or false
|
|
function yourls_get_remote_content_curl( $url, $maxlen = 4096, $timeout = 5 ) {
|
|
|
|
$ch = curl_init();
|
|
curl_setopt( $ch, CURLOPT_URL, $url );
|
|
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
|
|
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
|
|
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
|
|
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // follow redirects...
|
|
curl_setopt( $ch, CURLOPT_MAXREDIRS, 3 ); // ... but not more than 3
|
|
curl_setopt( $ch, CURLOPT_USERAGENT, yourls_http_user_agent() );
|
|
curl_setopt( $ch, CURLOPT_RANGE, "0-{$maxlen}" ); // Get no more than $maxlen
|
|
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // dont check SSL certificates
|
|
curl_setopt( $ch, CURLOPT_HEADER, 0 );
|
|
|
|
$response = curl_exec( $ch );
|
|
|
|
if( !$response || curl_error( $ch ) ) {
|
|
//$response = 'Error: '.curl_error( $ch );
|
|
return false;
|
|
}
|
|
|
|
curl_close( $ch );
|
|
|
|
return substr( $response, 0, $maxlen ); // substr in case CURLOPT_RANGE not supported
|
|
}
|
|
|
|
// Get remote content using fopen. Needs sanitized $url. Returns $content or false
|
|
function yourls_get_remote_content_fopen( $url, $maxlen = 4096, $timeout = 5 ) {
|
|
$content = false;
|
|
|
|
$initial_timeout = @ini_set( 'default_socket_timeout', $timeout );
|
|
$initial_user_agent = @ini_set( 'user_agent', yourls_http_user_agent() );
|
|
|
|
// Basic error reporting shortcut
|
|
set_error_handler( create_function('$code, $string', 'global $ydb; $ydb->fopen_error = $string;') );
|
|
|
|
$fp = fopen( $url, 'r');
|
|
if( $fp !== false ) {
|
|
$buffer = min( $maxlen, 4096 );
|
|
while ( !feof( $fp ) && !( strlen( $content ) >= $maxlen ) ) {
|
|
$content .= fread( $fp, $buffer );
|
|
}
|
|
fclose( $fp );
|
|
}
|
|
|
|
if( $initial_timeout !== false )
|
|
@ini_set('default_socket_timeout', $initial_timeout);
|
|
if( $initial_user_agent !== false )
|
|
@ini_set('user_agent', $initial_user_agent);
|
|
|
|
|
|
restore_error_handler();
|
|
|
|
if( !$content ) {
|
|
//global $ydb;
|
|
//$content = 'Error: '.strip_tags( $ydb->fopen_error );
|
|
return false;
|
|
}
|
|
|
|
return $content;
|
|
}
|
|
|
|
// Get remote content using fsockopen. Needs sanitized $url. Returns $content or false
|
|
function yourls_get_remote_content_fsockopen( $url, $maxlen = 4096, $timeout = 5 ) {
|
|
// get the host name and url path
|
|
$parsed_url = parse_url($url);
|
|
|
|
$host = $parsed_url['host'];
|
|
if ( isset($parsed_url['path']) ) {
|
|
$path = $parsed_url['path'];
|
|
} else {
|
|
$path = '/'; // the url is pointing to the host like http://www.mysite.com
|
|
}
|
|
|
|
if (isset($parsed_url['query'])) {
|
|
$path .= '?' . $parsed_url['query'];
|
|
}
|
|
|
|
if (isset($parsed_url['port'])) {
|
|
$port = $parsed_url['port'];
|
|
} else {
|
|
$port = '80';
|
|
}
|
|
|
|
$response = false;
|
|
|
|
// connect to the remote server
|
|
$fp = @fsockopen( $host, $port, $errno, $errstr, $timeout );
|
|
var_dump( $errno, $errstr );
|
|
if( $fp !== false ) {
|
|
// send some fake headers to mimick a standard browser
|
|
fputs($fp, "GET $path HTTP/1.0\r\n" .
|
|
"Host: $host\r\n" .
|
|
"User-Agent: " . yourls_http_user_agent() . "\r\n" .
|
|
"Accept: */*\r\n" .
|
|
"Accept-Language: en-us,en;q=0.5\r\n" .
|
|
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" .
|
|
"Keep-Alive: 300\r\n" .
|
|
"Connection: keep-alive\r\n" .
|
|
"Referer: http://$host\r\n\r\n");
|
|
|
|
// retrieve the response from the remote server
|
|
$buffer = min( $maxlen, 4096 );
|
|
while ( !feof( $fp ) && !( strlen( $response ) >= $maxlen ) ) { // get more or less $maxlen bytes (between $maxlen and ($maxlen + ($maxlen-1)) actually)
|
|
$response .= fread( $fp, $buffer );
|
|
}
|
|
|
|
fclose( $fp );
|
|
} else {
|
|
//$response = trim( "Error: #$errno. $errstr" );
|
|
return false;
|
|
}
|
|
|
|
// return the file content
|
|
return $response;
|
|
}
|
|
|
|
// Return funky user agent string
|
|
function yourls_http_user_agent() {
|
|
return yourls_apply_filter( 'http_user_agent', 'YOURLS v'.YOURLS_VERSION.' +http://yourls.org/ (running on '.YOURLS_SITE.')' );
|
|
}
|