X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FNetwork.php;h=508934db2c6eb0ccb89ed799c34eb7f6010932d3;hb=b5ad8c3e153976cf3e63753597377f09852d98d7;hp=2cad22acf83791bd7e2d8dad7a480f10175bdaa1;hpb=657a8a7cb5454a681c9bb95618a03861837b2de5;p=friendica.git diff --git a/src/Util/Network.php b/src/Util/Network.php index 2cad22acf8..508934db2c 100644 --- a/src/Util/Network.php +++ b/src/Util/Network.php @@ -25,6 +25,8 @@ use Friendica\Core\Hook; use Friendica\Core\Logger; use Friendica\DI; use Friendica\Model\Contact; +use Friendica\Network\HTTPClient\Client\HttpClientAccept; +use Friendica\Network\HTTPClient\Client\HttpClientOptions; use Friendica\Network\HTTPException\NotModifiedException; use GuzzleHttp\Psr7\Uri; @@ -48,6 +50,7 @@ class Network * and check DNS to see if it's real (or check if is a valid IP address) * * @param string $url The URL to be validated + * * @return string|boolean The actual working URL, false else * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ @@ -66,14 +69,31 @@ class Network $url = 'http://' . $url; } - /// @TODO Really suppress function outcomes? Why not find them + debug them? - $h = @parse_url($url); + $xrd_timeout = DI::config()->get('system', 'xrd_timeout'); + $host = parse_url($url, PHP_URL_HOST); - if (!empty($h['host']) && (@dns_get_record($h['host'], DNS_A + DNS_CNAME) || filter_var($h['host'], FILTER_VALIDATE_IP))) { - return $url; + if (empty($host) || !(filter_var($host, FILTER_VALIDATE_IP) || @dns_get_record($host . '.', DNS_A + DNS_AAAA))) { + return false; } - return false; + if (in_array(parse_url($url, PHP_URL_SCHEME), ['https', 'http'])) { + $options = [HttpClientOptions::VERIFY => true, HttpClientOptions::TIMEOUT => $xrd_timeout]; + $curlResult = DI::httpClient()->head($url, $options); + + // Workaround for systems that can't handle a HEAD request. Don't retry on timeouts. + if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() >= 400) && !in_array($curlResult->getReturnCode(), [408, 504])) { + $curlResult = DI::httpClient()->get($url, HttpClientAccept::DEFAULT, $options); + } + + if (!$curlResult->isSuccess()) { + Logger::notice('Url not reachable', ['host' => $host, 'url' => $url]); + return false; + } elseif ($curlResult->isRedirectUrl()) { + $url = $curlResult->getRedirectUrl(); + } + } + + return $url; } /** @@ -95,7 +115,7 @@ class Network $h = substr($addr, strpos($addr, '@') + 1); // Concerning the @ see here: https://stackoverflow.com/questions/36280957/dns-get-record-a-temporary-server-error-occurred - if ($h && (@dns_get_record($h, DNS_A + DNS_MX) || filter_var($h, FILTER_VALIDATE_IP))) { + if ($h && (@dns_get_record($h, DNS_A + DNS_AAAA + DNS_MX) || filter_var($h, FILTER_VALIDATE_IP))) { return true; } if ($h && @dns_get_record($h, DNS_CNAME + DNS_MX)) { @@ -240,6 +260,7 @@ class Network * * @param string $domain * @param array $domain_list + * * @return boolean */ public static function isDomainAllowed(string $domain, array $domain_list): bool @@ -278,6 +299,7 @@ class Network * Remove Google Analytics and other tracking platforms params from URL * * @param string $url Any user-submitted URL that may contain tracking params + * * @return string The same URL stripped of tracking parameters */ public static function stripTrackingQueryParams(string $url): string @@ -331,9 +353,10 @@ class Network * * @param string $url * @param string $basepath + * * @return string url */ - public static function addBasePath(string $url, string $basepath) + public static function addBasePath(string $url, string $basepath): string { if (!empty(parse_url($url, PHP_URL_SCHEME)) || empty(parse_url($basepath, PHP_URL_SCHEME)) || empty($url) || empty(parse_url($url))) { return $url; @@ -353,6 +376,7 @@ class Network * * @param string $url1 * @param string $url2 + * * @return string The matching part or empty string on error */ public static function getUrlMatch(string $url1, string $url2): string @@ -440,6 +464,7 @@ class Network * Glue url parts together * * @param array $parsed URL parts + * * @return string|null The glued URL or null on error * @deprecated since version 2021.12, use GuzzleHttp\Psr7\Uri::fromParts($parts) instead */ @@ -471,6 +496,7 @@ class Network * Convert an URI to an IDN compatible URI * * @param string $uri + * * @return string */ public static function convertToIdn(string $uri): string @@ -478,7 +504,7 @@ class Network $parts = parse_url($uri); if (!empty($parts['scheme']) && !empty($parts['host'])) { $parts['host'] = idn_to_ascii($parts['host']); - $uri = Uri::fromParts($parts); + $uri = (string)Uri::fromParts($parts); } else { $parts = explode('@', $uri); if (count($parts) == 2) { @@ -495,6 +521,7 @@ class Network * Switch the scheme of an url between http and https * * @param string $url + * * @return string Switched URL */ public static function switchScheme(string $url): string @@ -518,6 +545,7 @@ class Network * * @param string $path * @param array $additionalParams Associative array of parameters + * * @return string */ public static function appendQueryParam(string $path, array $additionalParams): string @@ -544,6 +572,7 @@ class Network * * @param string $etag The page etag * @param string $last_modified The page last modification UTC date + * * @return void * @throws \Exception */ @@ -582,6 +611,7 @@ class Network * Check if the given URL is a local link * * @param string $url + * * @return bool */ public static function isLocalLink(string $url): bool