<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2024, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
use Friendica\Network\HTTPException\NotModifiedException;
use GuzzleHttp\Psr7\Uri;
+use Psr\Http\Message\UriInterface;
class Network
{
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);
-
+ try {
+ $curlResult = DI::httpClient()->head($url, $options);
+ } catch (\Exception $e) {
+ return false;
+ }
+
// 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);
+ try {
+ $curlResult = DI::httpClient()->get($url, HttpClientAccept::DEFAULT, $options);
+ } catch (\Exception $e) {
+ return false;
+ }
}
-
+
if (!$curlResult->isSuccess()) {
Logger::notice('Url not reachable', ['host' => $host, 'url' => $url]);
return false;
* @param string $url The url to check the domain from
*
* @return boolean
+ *
+ * @deprecated since 2023.03 Use isUriBlocked instead
*/
public static function isUrlBlocked(string $url): bool
{
- $host = @parse_url($url, PHP_URL_HOST);
- if (!$host) {
+ try {
+ return self::isUriBlocked(new Uri($url));
+ } catch (\Throwable $e) {
+ Logger::warning('Invalid URL', ['url' => $url]);
+ return false;
+ }
+ }
+
+ /**
+ * Checks if the provided URI domain is on the domain blocklist.
+ *
+ * @param UriInterface $uri
+ * @return boolean
+ */
+ public static function isUriBlocked(UriInterface $uri): bool
+ {
+ if (!$uri->getHost()) {
return false;
}
}
foreach ($domain_blocklist as $domain_block) {
- if (fnmatch(strtolower($domain_block['domain']), strtolower($host))) {
+ if (fnmatch(strtolower($domain_block['domain']), strtolower($uri->getHost()))) {
return true;
}
}
$pair = $param . '=' . str_replace(' ', '+', $value);
$url = str_replace($pair, '', $url);
- // Third try: Maybey the url isn't encoded at all
+ // Third try: Maybe the url isn't encoded at all
$pair = $param . '=' . $value;
$url = str_replace($pair, '', $url);
*/
public static function addBasePath(string $url, string $basepath): string
{
+ $url = trim($url);
if (!empty(parse_url($url, PHP_URL_SCHEME)) || empty(parse_url($basepath, PHP_URL_SCHEME)) || empty($url) || empty(parse_url($url))) {
return $url;
}
$scheme = $get('scheme');
$query = $get('query');
$fragment = $get('fragment');
- $authority = ($userinfo !== null ? $userinfo . '@' : '') .
+ $authority = ($userinfo !== null ? $userinfo . '@' : '') .
$get('host') .
($port ? ":$port" : '');
* @param string $url
*
* @return bool
+ * @deprecated since 2023.09, please use BaseUrl->isLocalUrl or BaseUrl->isLocalUri instead.
*/
public static function isLocalLink(string $url): bool
{
- return (strpos(Strings::normaliseLink($url), Strings::normaliseLink(DI::baseUrl())) !== false);
+ return DI::baseUrl()->isLocalUrl($url);
}
/**
$scheme = parse_url($url, PHP_URL_SCHEME);
return !empty($scheme) && in_array($scheme, ['http', 'https']) && parse_url($url, PHP_URL_HOST);
}
+
+ /**
+ * Creates an Uri object out of a given Uri string
+ *
+ * @param string|null $uri
+ * @return UriInterface|null
+ */
+ public static function createUriFromString(string $uri = null): ?UriInterface
+ {
+ if (empty($uri)) {
+ return null;
+ }
+
+ try {
+ return new Uri($uri);
+ } catch (\Exception $e) {
+ Logger::debug('Invalid URI', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'uri' => $uri]);
+ return null;
+ }
+ }
}