X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FNetwork.php;h=0ac0f2aeb71b2b7ccd3865a057b770ee70cb87f8;hb=4894e89f036be1f8a82523ac69d56ae36e7685df;hp=ec8b8c9b09e8f5367b8ea141899b1dfe6588aeeb;hpb=5a02e39a65f8f685440228cc1d36738cbe15f32b;p=friendica.git diff --git a/src/Util/Network.php b/src/Util/Network.php index ec8b8c9b09..0ac0f2aeb7 100644 --- a/src/Util/Network.php +++ b/src/Util/Network.php @@ -4,40 +4,17 @@ */ namespace Friendica\Util; -use Friendica\App; use Friendica\Core\Addon; -use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Core\Config; -use Friendica\Network\Curl; -use Friendica\Network\HTTPException\InternalServerErrorException; -use Friendica\Network\Probe; -use Friendica\Object\Image; -use Friendica\Util\XML; +use Friendica\Network\CurlResult; +use Friendica\Util\Strings; use DOMDocument; use DomXPath; class Network { - /** - * @var Curl The latest Curl output - */ - private static $curl; - - /** - * Returns the latest Curl output - * - * @return Curl The latest Curl output - */ - public static function getCurl() - { - if (empty(self::$curl)) { - self::$curl = new Curl(); - } - - return self::$curl; - } - /** * Curl wrapper * @@ -60,7 +37,7 @@ class Network { $ret = self::fetchUrlFull($url, $binary, $redirects, $timeout, $accept_content, $cookiejar); - return $ret['body']; + return $ret->getBody(); } /** @@ -78,7 +55,7 @@ class Network * @param string $accept_content supply Accept: header with 'accept_content' as the value * @param string $cookiejar Path to cookie jar file * - * @return array With all relevant information, 'body' contains the actual fetched content. + * @return CurlResult With all relevant information, 'body' contains the actual fetched content. */ public static function fetchUrlFull($url, $binary = false, &$redirects = 0, $timeout = 0, $accept_content = null, $cookiejar = '') { @@ -107,13 +84,9 @@ class Network * 'novalidate' => do not validate SSL certs, default is to validate using our CA list * 'nobody' => only return the header * 'cookiejar' => path to cookie jar file + * 'header' => header array * - * @return array an assoziative array with: - * int 'return_code' => HTTP return code or 0 if timeout or failure - * boolean 'success' => boolean true (if HTTP 2xx result) or false - * string 'redirect_url' => in case of redirect, content was finally retrieved from this URL - * string 'header' => HTTP headers - * string 'body' => fetched content + * @return CurlResult */ public static function curl($url, $binary = false, &$redirects = 0, $opts = []) { @@ -126,24 +99,24 @@ class Network $parts = parse_url($url); $path_parts = explode('/', defaults($parts, 'path', '')); foreach ($path_parts as $part) { - if (strlen($part) <> mb_strlen($part)) { + if (strlen($part) <> mb_strlen($part)) { $parts2[] = rawurlencode($part); - } else { - $parts2[] = $part; - } + } else { + $parts2[] = $part; + } } - $parts['path'] = implode('/', $parts2); + $parts['path'] = implode('/', $parts2); $url = self::unparseURL($parts); if (self::isUrlBlocked($url)) { - logger('domain of ' . $url . ' is blocked', LOGGER_DATA); - return $ret; + Logger::log('domain of ' . $url . ' is blocked', Logger::DATA); + return CurlResult::createErrorCurl($url); } $ch = @curl_init($url); if (($redirects > 8) || (!$ch)) { - return $ret; + return CurlResult::createErrorCurl($url); } @curl_setopt($ch, CURLOPT_HEADER, true); @@ -165,6 +138,10 @@ class Network ); } + if (!empty($opts['header'])) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['header']); + } + @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent()); @@ -238,91 +215,20 @@ class Network $curl_info = @curl_getinfo($ch); } - if (curl_errno($ch) !== CURLE_OK) { - logger('error fetching ' . $url . ': ' . curl_error($ch), LOGGER_INFO); - } + $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch)); - $ret['errno'] = curl_errno($ch); - - $base = $s; - $ret['info'] = $curl_info; - - $http_code = $curl_info['http_code']; - - logger($url . ': ' . $http_code . " " . $s, LOGGER_DATA); - $header = ''; - - // Pull out multiple headers, e.g. proxy and continuation headers - // allow for HTTP/2.x without fixing code - - while (preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/', $base)) { - $chunk = substr($base, 0, strpos($base, "\r\n\r\n") + 4); - $header .= $chunk; - $base = substr($base, strlen($chunk)); - } - - self::$curl = new Curl($http_code, (isset($curl_info['content_type']) ? $curl_info['content_type'] : ''), $header); - - if ($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) { - $new_location_info = @parse_url($curl_info['redirect_url']); - $old_location_info = @parse_url($curl_info['url']); - - $newurl = $curl_info['redirect_url']; - - if (empty($new_location_info['path']) && !empty($new_location_info['host'])) { - $newurl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path']; - } - - $matches = []; - - if (preg_match('/(Location:|URI:)(.*?)\n/i', $header, $matches)) { - $newurl = trim(array_pop($matches)); - } - if (strpos($newurl, '/') === 0) { - $newurl = $old_location_info["scheme"]."://".$old_location_info["host"].$newurl; - } - $old_location_query = @parse_url($url, PHP_URL_QUERY); - - if ($old_location_query != '') { - $newurl .= '?' . $old_location_query; - } - - if (filter_var($newurl, FILTER_VALIDATE_URL)) { - $redirects++; - @curl_close($ch); - return self::curl($newurl, $binary, $redirects, $opts); - } - } - - self::$curl->setCode($http_code); - if (isset($curl_info['content_type'])) { - self::$curl->setContentType($curl_info['content_type']); - } - - $rc = intval($http_code); - $ret['return_code'] = $rc; - $ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false); - $ret['redirect_url'] = $url; - - if (!$ret['success']) { - $ret['error'] = curl_error($ch); - $ret['debug'] = $curl_info; - logger('error: '.$url.': '.$ret['return_code'].' - '.$ret['error'], LOGGER_DEBUG); - logger('debug: '.print_r($curl_info, true), LOGGER_DATA); - } - - $ret['body'] = substr($s, strlen($header)); - $ret['header'] = $header; - - if (x($opts, 'debug')) { - $ret['debug'] = $curl_info; + if ($curlResponse->isRedirectUrl()) { + $redirects++; + Logger::log('curl: redirect ' . $url . ' to ' . $curlResponse->getRedirectUrl()); + @curl_close($ch); + return self::curl($curlResponse->getRedirectUrl(), $binary, $redirects, $opts); } @curl_close($ch); $a->saveTimestamp($stamp1, 'network'); - return($ret); + return $curlResponse; } /** @@ -334,25 +240,25 @@ class Network * @param integer $redirects Recursion counter for internal use - default = 0 * @param integer $timeout The timeout in seconds, default system config value or 60 seconds * - * @return string The content + * @return CurlResult The content */ public static function post($url, $params, $headers = null, &$redirects = 0, $timeout = 0) { $stamp1 = microtime(true); if (self::isUrlBlocked($url)) { - logger('post_url: domain of ' . $url . ' is blocked', LOGGER_DATA); - return false; + Logger::log('post_url: domain of ' . $url . ' is blocked', Logger::DATA); + return CurlResult::createErrorCurl($url); } $a = get_app(); $ch = curl_init($url); if (($redirects > 8) || (!$ch)) { - return false; + return CurlResult::createErrorCurl($url); } - logger('post_url: start ' . $url, LOGGER_DATA); + Logger::log('post_url: start ' . $url, Logger::DATA); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @@ -403,8 +309,6 @@ class Network } } - self::getCurl()->setCode(0); - // don't let curl abort the entire application // if it throws any errors. @@ -412,53 +316,23 @@ class Network $base = $s; $curl_info = curl_getinfo($ch); - $http_code = $curl_info['http_code']; - - logger('post_url: result ' . $http_code . ' - ' . $url, LOGGER_DATA); - $header = ''; + $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch)); - // Pull out multiple headers, e.g. proxy and continuation headers - // allow for HTTP/2.x without fixing code - - while (preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/', $base)) { - $chunk = substr($base, 0, strpos($base, "\r\n\r\n") + 4); - $header .= $chunk; - $base = substr($base, strlen($chunk)); + if ($curlResponse->isRedirectUrl()) { + $redirects++; + Logger::log('post_url: redirect ' . $url . ' to ' . $curlResponse->getRedirectUrl()); + curl_close($ch); + return self::post($curlResponse->getRedirectUrl(), $params, $headers, $redirects, $timeout); } - if ($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) { - $matches = []; - $new_location_info = @parse_url($curl_info['redirect_url']); - $old_location_info = @parse_url($curl_info['url']); - - preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches); - $newurl = trim(array_pop($matches)); - - if (strpos($newurl, '/') === 0) { - $newurl = $old_location_info["scheme"] . "://" . $old_location_info["host"] . $newurl; - } - - if (filter_var($newurl, FILTER_VALIDATE_URL)) { - $redirects++; - logger('post_url: redirect ' . $url . ' to ' . $newurl); - return self::post($newurl, $params, $headers, $redirects, $timeout); - } - } - - self::getCurl()->setCode($http_code); - - $body = substr($s, strlen($header)); - - self::getCurl()->setHeaders($header); - curl_close($ch); $a->saveTimestamp($stamp1, 'network'); - logger('post_url: end ' . $url, LOGGER_DATA); + Logger::log('post_url: end ' . $url, Logger::DATA); - return $body; + return $curlResponse; } /** @@ -649,7 +523,7 @@ class Network public static function lookupAvatarByEmail($email) { - $avatar['size'] = 175; + $avatar['size'] = 300; $avatar['email'] = $email; $avatar['url'] = ''; $avatar['success'] = false; @@ -657,10 +531,10 @@ class Network Addon::callHooks('avatar_lookup', $avatar); if (! $avatar['success']) { - $avatar['url'] = System::baseUrl() . '/images/person-175.jpg'; + $avatar['url'] = System::baseUrl() . '/images/person-300.jpg'; } - logger('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], LOGGER_DEBUG); + Logger::log('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], Logger::DEBUG); return $avatar['url']; } @@ -845,8 +719,8 @@ class Network return ""; } - $url1 = normalise_link($url1); - $url2 = normalise_link($url2); + $url1 = Strings::normaliseLink($url1); + $url2 = Strings::normaliseLink($url2); $parts1 = parse_url($url1); $parts2 = parse_url($url2); @@ -917,7 +791,7 @@ class Network $match .= $path; - return normalise_link($match); + return Strings::normaliseLink($match); } /**