use Friendica\Model\Group;
use Friendica\Model\Notify\Type;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol\Activity;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
*
*/
- $res = Network::post($dfrn_confirm, $params, [], 120)->getBody();
+ $res = HTTPRequest::post($dfrn_confirm, $params, [], 120)->getBody();
Logger::log(' Confirm: received data: ' . $res, Logger::DATA);
use Friendica\App;
use Friendica\Core\Logger;
-use Friendica\Core\System;
use Friendica\Core\Session;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol\DFRN;
use Friendica\Protocol\OStatus;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
);
if (DBA::isResult($r)) {
- $s = Network::fetchUrl($r[0]['poll'] . '?dfrn_id=' . $my_id . '&type=profile-check');
+ $s = HTTPRequest::fetchUrl($r[0]['poll'] . '?dfrn_id=' . $my_id . '&type=profile-check');
Logger::log("dfrn_poll: old profile returns " . $s, Logger::DATA);
// URL reply
if ($dfrn_version < 2.2) {
- $s = Network::fetchUrl($r[0]['poll']
- . '?dfrn_id=' . $encrypted_id
- . '&type=profile-check'
- . '&dfrn_version=' . DFRN_PROTOCOL_VERSION
- . '&challenge=' . $challenge
- . '&sec=' . $sec
+ $s = HTTPRequest::fetchUrl($r[0]['poll']
+ . '?dfrn_id=' . $encrypted_id
+ . '&type=profile-check'
+ . '&dfrn_version=' . DFRN_PROTOCOL_VERSION
+ . '&challenge=' . $challenge
+ . '&sec=' . $sec
);
} else {
- $s = Network::post($r[0]['poll'], [
- 'dfrn_id' => $encrypted_id,
- 'type' => 'profile-check',
+ $s = HTTPRequest::post($r[0]['poll'], [
+ 'dfrn_id' => $encrypted_id,
+ 'type' => 'profile-check',
'dfrn_version' => DFRN_PROTOCOL_VERSION,
- 'challenge' => $challenge,
- 'sec' => $sec
+ 'challenge' => $challenge,
+ 'sec' => $sec
])->getBody();
}
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
use Friendica\Core\Search;
-use Friendica\Core\System;
use Friendica\Core\Session;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
use Friendica\Model\User;
use Friendica\Module\Security\Login;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Protocol\Activity;
use Friendica\Util\DateTimeFormat;
}
if (!empty($dfrn_request) && strlen($confirm_key)) {
- Network::fetchUrl($dfrn_request . '?confirm_key=' . $confirm_key);
+ HTTPRequest::fetchUrl($dfrn_request . '?confirm_key=' . $confirm_key);
}
// (ignore reply, nothing we can do it failed)
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Proxy as ProxyUtils;
/**
$host = DI::baseUrl();
}
- $msearch_json = Network::post($host . '/msearch', $params)->getBody();
+ $msearch_json = HTTPRequest::post($host . '/msearch', $params)->getBody();
$msearch = json_decode($msearch_json);
use Friendica\Core\Renderer;
use Friendica\DI;
use Friendica\Module\Security\Login;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Strings;
function oexchange_init(App $a) {
$tags = ((!empty($_REQUEST['tags']))
? '&tags=' . urlencode(Strings::escapeTags(trim($_REQUEST['tags']))) : '');
- $s = Network::fetchUrl(DI::baseUrl() . '/parse_url?url=' . $url . $title . $description . $tags);
+ $s = HTTPRequest::fetchUrl(DI::baseUrl() . '/parse_url?url=' . $url . $title . $description . $tags);
if (!strlen($s)) {
return;
use Friendica\Core\Protocol;
use Friendica\DI;
use Friendica\Model\Contact;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
function ostatus_subscribe_content(App $a)
{
$api = $contact['baseurl'] . '/api/';
// Fetching friends
- $curlResult = Network::curl($api . 'statuses/friends.json?screen_name=' . $contact['nick']);
+ $curlResult = HTTPRequest::curl($api . 'statuses/friends.json?screen_name=' . $contact['nick']);
if (!$curlResult->isSuccess()) {
DI::pConfig()->delete($uid, 'ostatus', 'legacy_contact');
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\System;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\ParseUrl;
use Friendica\Util\Strings;
// Check if the URL is an image, video or audio file. If so format
// the URL with the corresponding BBCode media tag
// Fetch the header of the URL
- $curlResponse = Network::curl($url, false, ['novalidate' => true, 'nobody' => true]);
+ $curlResponse = HTTPRequest::curl($url, false, ['novalidate' => true, 'nobody' => true]);
if ($curlResponse->isSuccess()) {
// Convert the header fields into an array
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\PushSubscriber;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Strings;
function post_var($name) {
$hub_callback = rtrim($hub_callback, ' ?&#');
$separator = parse_url($hub_callback, PHP_URL_QUERY) === null ? '?' : '&';
- $fetchResult = Network::fetchUrlFull($hub_callback . $separator . $params);
+ $fetchResult = HTTPRequest::fetchUrlFull($hub_callback . $separator . $params);
$body = $fetchResult->getBody();
$ret = $fetchResult->getReturnCode();
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Strings;
function redir_init(App $a) {
}
// Test for magic auth on the target system
- $serverret = Network::curl($basepath . '/magic');
+ $serverret = HTTPRequest::curl($basepath . '/magic');
if ($serverret->isSuccess()) {
$separator = strpos($target_url, '?') ? '&' : '?';
$target_url .= $separator . 'zrl=' . urlencode($visitor) . '&addr=' . urlencode($contact_url);
use Friendica\Core\Renderer;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\ParseUrl;
if (!in_array($ext, $noexts)) {
// try oembed autodiscovery
- $html_text = Network::fetchUrl($embedurl, false, 15, 'text/*');
+ $html_text = HTTPRequest::fetchUrl($embedurl, false, 15, 'text/*');
if ($html_text) {
$dom = @DOMDocument::loadHTML($html_text);
if ($dom) {
$entries = $xpath->query("//link[@type='application/json+oembed']");
foreach ($entries as $e) {
$href = $e->getAttributeNode('href')->nodeValue;
- $json_string = Network::fetchUrl($href . '&maxwidth=' . $a->videowidth);
+ $json_string = HTTPRequest::fetchUrl($href . '&maxwidth=' . $a->videowidth);
break;
}
$entries = $xpath->query("//link[@type='text/json+oembed']");
foreach ($entries as $e) {
$href = $e->getAttributeNode('href')->nodeValue;
- $json_string = Network::fetchUrl($href . '&maxwidth=' . $a->videowidth);
+ $json_string = HTTPRequest::fetchUrl($href . '&maxwidth=' . $a->videowidth);
break;
}
}
use Friendica\Model\Event;
use Friendica\Model\Photo;
use Friendica\Model\Tag;
-use Friendica\Network\Probe;
+use Friendica\Network\HTTPRequest;
use Friendica\Object\Image;
use Friendica\Protocol\Activity;
use Friendica\Util\Images;
use Friendica\Util\Map;
-use Friendica\Util\Network;
use Friendica\Util\ParseUrl;
use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings;
continue;
}
- $curlResult = Network::curl($mtch[1], true);
+ $curlResult = HTTPRequest::curl($mtch[1], true);
if (!$curlResult->isSuccess()) {
continue;
}
$text = "[url=" . $match[2] . ']' . $match[2] . "[/url]";
// if its not a picture then look if its a page that contains a picture link
- $body = Network::fetchUrl($match[1]);
+ $body = HTTPRequest::fetchUrl($match[1]);
$doc = new DOMDocument();
@$doc->loadHTML($body);
}
// if its not a picture then look if its a page that contains a picture link
- $body = Network::fetchUrl($match[1]);
+ $body = HTTPRequest::fetchUrl($match[1]);
$doc = new DOMDocument();
@$doc->loadHTML($body);
use Friendica\Database\Database;
use Friendica\Database\DBStructure;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Images;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
/**
$help = "";
$error_msg = "";
if (function_exists('curl_init')) {
- $fetchResult = Network::fetchUrlFull($baseurl . "/install/testrewrite");
+ $fetchResult = HTTPRequest::fetchUrlFull($baseurl . "/install/testrewrite");
$url = Strings::normaliseLink($baseurl . "/install/testrewrite");
if ($fetchResult->getReturnCode() != 204) {
- $fetchResult = Network::fetchUrlFull($url);
+ $fetchResult = HTTPRequest::fetchUrlFull($url);
}
if ($fetchResult->getReturnCode() != 204) {
namespace Friendica\Core;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
/**
* Manage compatibility with federated networks
if (preg_match('=https?://(.*)/user/(.*)=ism', $profile_url, $matches)) {
$statusnet_host = $matches[1];
$statusnet_user = $matches[2];
- $UserData = Network::fetchUrl('http://' . $statusnet_host . '/api/users/show.json?user_id=' . $statusnet_user);
+ $UserData = HTTPRequest::fetchUrl('http://' . $statusnet_host . '/api/users/show.json?user_id=' . $statusnet_user);
$user = json_decode($UserData);
if ($user) {
$matches[2] = $user->screen_name;
use Friendica\Model\Contact;
use Friendica\Model\GContact;
use Friendica\Network\HTTPException;
+use Friendica\Network\HTTPRequest;
use Friendica\Object\Search\ContactResult;
use Friendica\Object\Search\ResultList;
use Friendica\Util\Network;
$searchUrl .= '&page=' . $page;
}
- $resultJson = Network::fetchUrl($searchUrl, false, 0, 'application/json');
+ $resultJson = HTTPRequest::fetchUrl($searchUrl, false, 0, 'application/json');
$results = json_decode($resultJson, true);
$return = GContact::searchByName($search, $mode);
} else {
$p = $page > 1 ? 'p=' . $page : '';
- $curlResult = Network::curl(self::getGlobalDirectory() . '/search/people?' . $p . '&q=' . urlencode($search), false, ['accept_content' => 'application/json']);
+ $curlResult = HTTPRequest::curl(self::getGlobalDirectory() . '/search/people?' . $p . '&q=' . urlencode($search), false, ['accept_content' => 'application/json']);
if ($curlResult->isSuccess()) {
$searchResult = json_decode($curlResult->getBody(), true);
if (!empty($searchResult['profiles'])) {
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Process;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
/**
* Contains the class for the worker background job processing
}
$url = DI::baseUrl() . '/worker';
- Network::fetchUrl($url, false, 1);
+ HTTPRequest::fetchUrl($url, false, 1);
}
/**
use Friendica\Content\Text\HTML;
use Friendica\Core\Logger;
use Friendica\Database\DBA;
-use Friendica\DI;
use Friendica\Network\Probe;
use Friendica\Protocol\ActivityNamespace;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\Crypto;
-use Friendica\Util\Network;
-use Friendica\Util\JsonLD;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Strings;
+use Friendica\Util\JsonLD;
+use Friendica\Util\Network;
class APContact
{
use Exception;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
-use Friendica\Core\System;
use Friendica\Core\Search;
+use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\PortableContact;
$done[] = DI::baseUrl() . '/poco';
if (strlen(DI::config()->get('system', 'directory'))) {
- $x = Network::fetchUrl(Search::getGlobalDirectory() . '/pubsites');
+ $x = HTTPRequest::fetchUrl(Search::getGlobalDirectory() . '/pubsites');
if (!empty($x)) {
$j = json_decode($x);
if (!empty($j->entries)) {
return false;
}
- $curlResult = Network::curl($gserver['noscrape'] . '/' . $data['nick']);
+ $curlResult = HTTPRequest::curl($gserver['noscrape'] . '/' . $data['nick']);
if ($curlResult->isSuccess() && !empty($curlResult->getBody())) {
$noscrape = json_decode($curlResult->getBody(), true);
private static function updateFromFeed(array $data)
{
// Search for the newest entry in the feed
- $curlResult = Network::curl($data['poll']);
+ $curlResult = HTTPRequest::curl($data['poll']);
if (!$curlResult->isSuccess()) {
$fields = ['failed' => true, 'last_failure' => DateTimeFormat::utcNow()];
DBA::update('gcontact', $fields, ['nurl' => Strings::normaliseLink($data['url'])]);
$url = $server . '/main/statistics';
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if (!$curlResult->isSuccess()) {
return false;
}
use DOMDocument;
use DOMXPath;
+use Friendica\Core\Logger;
use Friendica\Core\Protocol;
+use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Module\Register;
use Friendica\Network\CurlResult;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
+use Friendica\Protocol\Diaspora;
+use Friendica\Protocol\PortableContact;
use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
-use Friendica\Core\Logger;
-use Friendica\Core\System;
-use Friendica\Protocol\PortableContact;
-use Friendica\Protocol\Diaspora;
/**
* This class handles GServer related functions
// When a nodeinfo is present, we don't need to dig further
$xrd_timeout = DI::config()->get('system', 'xrd_timeout');
- $curlResult = Network::curl($url . '/.well-known/nodeinfo', false, ['timeout' => $xrd_timeout]);
+ $curlResult = HTTPRequest::curl($url . '/.well-known/nodeinfo', false, ['timeout' => $xrd_timeout]);
if ($curlResult->isTimeout()) {
self::setFailure($url);
return false;
$basedata = ['detection-method' => self::DETECT_MANUAL];
}
- $curlResult = Network::curl($baseurl, false, ['timeout' => $xrd_timeout]);
+ $curlResult = HTTPRequest::curl($baseurl, false, ['timeout' => $xrd_timeout]);
if ($curlResult->isSuccess()) {
$basedata = self::analyseRootHeader($curlResult, $basedata);
$basedata = self::analyseRootBody($curlResult, $basedata, $baseurl);
{
Logger::info('Discover relay data', ['server' => $server_url]);
- $curlResult = Network::curl($server_url . '/.well-known/x-social-relay');
+ $curlResult = HTTPRequest::curl($server_url . '/.well-known/x-social-relay');
if (!$curlResult->isSuccess()) {
return;
}
*/
private static function fetchStatistics(string $url)
{
- $curlResult = Network::curl($url . '/statistics.json');
+ $curlResult = HTTPRequest::curl($url . '/statistics.json');
if (!$curlResult->isSuccess()) {
return [];
}
*/
private static function parseNodeinfo1(string $nodeinfo_url)
{
- $curlResult = Network::curl($nodeinfo_url);
+ $curlResult = HTTPRequest::curl($nodeinfo_url);
+
if (!$curlResult->isSuccess()) {
return [];
}
*/
private static function parseNodeinfo2(string $nodeinfo_url)
{
- $curlResult = Network::curl($nodeinfo_url);
+ $curlResult = HTTPRequest::curl($nodeinfo_url);
if (!$curlResult->isSuccess()) {
return [];
}
*/
private static function fetchSiteinfo(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/siteinfo.json');
+ $curlResult = HTTPRequest::curl($url . '/siteinfo.json');
if (!$curlResult->isSuccess()) {
return $serverdata;
}
private static function validHostMeta(string $url)
{
$xrd_timeout = DI::config()->get('system', 'xrd_timeout');
- $curlResult = Network::curl($url . '/.well-known/host-meta', false, ['timeout' => $xrd_timeout]);
+ $curlResult = HTTPRequest::curl($url . '/.well-known/host-meta', false, ['timeout' => $xrd_timeout]);
if (!$curlResult->isSuccess()) {
return false;
}
{
$serverdata['poco'] = '';
- $curlResult = Network::curl($url. '/poco');
+ $curlResult = HTTPRequest::curl($url . '/poco');
if (!$curlResult->isSuccess()) {
return $serverdata;
}
*/
public static function checkMastodonDirectory(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/api/v1/directory?limit=1');
+ $curlResult = HTTPRequest::curl($url . '/api/v1/directory?limit=1');
if (!$curlResult->isSuccess()) {
return $serverdata;
}
*/
private static function detectNextcloud(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/status.php');
+ $curlResult = HTTPRequest::curl($url . '/status.php');
+
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
return $serverdata;
}
*/
private static function detectMastodonAlikes(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/api/v1/instance');
+ $curlResult = HTTPRequest::curl($url . '/api/v1/instance');
+
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
return $serverdata;
}
*/
private static function detectHubzilla(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/api/statusnet/config.json');
+ $curlResult = HTTPRequest::curl($url . '/api/statusnet/config.json');
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
return $serverdata;
}
private static function detectGNUSocial(string $url, array $serverdata)
{
// Test for GNU Social
- $curlResult = Network::curl($url . '/api/gnusocial/version.json');
+ $curlResult = HTTPRequest::curl($url . '/api/gnusocial/version.json');
if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
$serverdata['platform'] = 'gnusocial';
}
// Test for Statusnet
- $curlResult = Network::curl($url . '/api/statusnet/version.json');
+ $curlResult = HTTPRequest::curl($url . '/api/statusnet/version.json');
if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
*/
private static function detectFriendica(string $url, array $serverdata)
{
- $curlResult = Network::curl($url . '/friendica/json');
+ $curlResult = HTTPRequest::curl($url . '/friendica/json');
if (!$curlResult->isSuccess()) {
- $curlResult = Network::curl($url . '/friendika/json');
+ $curlResult = HTTPRequest::curl($url . '/friendika/json');
$friendika = true;
$platform = 'Friendika';
} else {
$protocols = ['activitypub', 'diaspora', 'dfrn', 'ostatus'];
foreach ($protocols as $protocol) {
$query = '{nodes(protocol:"' . $protocol . '"){host}}';
- $curlResult = Network::fetchUrl('https://the-federation.info/graphql?query=' . urlencode($query));
+ $curlResult = HTTPRequest::fetchUrl('https://the-federation.info/graphql?query=' . urlencode($query));
if (!empty($curlResult)) {
$data = json_decode($curlResult, true);
if (!empty($data['data']['nodes'])) {
if (!empty($accesstoken)) {
$api = 'https://instances.social/api/1.0/instances/list?count=0';
$header = ['Authorization: Bearer '.$accesstoken];
- $curlResult = Network::curl($api, false, ['headers' => $header]);
+ $curlResult = HTTPRequest::curl($api, false, ['headers' => $header]);
+
if ($curlResult->isSuccess()) {
$servers = json_decode($curlResult->getBody(), true);
use Friendica\Database\DBStructure;
use Friendica\DI;
use Friendica\Model\Storage\SystemResource;
+use Friendica\Network\HTTPRequest;
use Friendica\Object\Image;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Images;
-use Friendica\Util\Network;
use Friendica\Util\Security;
use Friendica\Util\Strings;
$filename = basename($image_url);
if (!empty($image_url)) {
- $ret = Network::curl($image_url, true);
+ $ret = HTTPRequest::curl($image_url, true);
$img_str = $ret->getBody();
$type = $ret->getContentType();
} else {
use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol\Activity;
use Friendica\Protocol\Diaspora;
use Friendica\Util\DateTimeFormat;
$magic_path = $basepath . '/magic' . '?owa=1&dest=' . $dest . '&' . $addr_request;
// We have to check if the remote server does understand /magic without invoking something
- $serverret = Network::curl($basepath . '/magic');
+ $serverret = HTTPRequest::curl($basepath . '/magic');
if ($serverret->isSuccess()) {
Logger::log('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path, Logger::DEBUG);
System::externalRedirect($magic_path);
use Friendica\DI;
use Friendica\Model\TwoFactor\AppSpecificPassword;
use Friendica\Network\HTTPException\InternalServerErrorException;
+use Friendica\Network\HTTPRequest;
use Friendica\Object\Image;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
$photo_failure = false;
$filename = basename($photo);
- $curlResult = Network::curl($photo, true);
+ $curlResult = HTTPRequest::curl($photo, true);
if ($curlResult->isSuccess()) {
$img_str = $curlResult->getBody();
$type = $curlResult->getContentType();
use Friendica\DI;
use Friendica\Model\Register;
use Friendica\Module\BaseAdmin;
-use Friendica\Module\Update\Profile;
use Friendica\Network\HTTPException\InternalServerErrorException;
-use Friendica\Render\FriendicaSmarty;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\ConfigFileLoader;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
class Summary extends BaseAdmin
{
private static function checkSelfHostMeta()
{
// Fetch the host-meta to check if this really is a vital server
- return Network::curl(DI::baseUrl()->get() . '/.well-known/host-meta')->isSuccess();
+ return HTTPRequest::curl(DI::baseUrl()->get() . '/.well-known/host-meta')->isSuccess();
}
}
use Friendica\Core\Renderer;
use Friendica\DI;
use Friendica\Model;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol;
-use Friendica\Util\Network;
/**
* Tests a given feed of a contact
$contact = Model\Contact::getByURLForUser($url, local_user(), false);
- $xml = Network::fetchUrl($contact['poll']);
+ $xml = HTTPRequest::fetchUrl($contact['poll']);
$import_result = Protocol\Feed::import($xml);
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\HTTPSignature;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
/**
);
// Try to get an authentication token from the other instance.
- $curlResult = Network::curl($basepath . '/owa', false, ['headers' => $headers]);
+ $curlResult = HTTPRequest::curl($basepath . '/owa', false, ['headers' => $headers]);
if ($curlResult->isSuccess()) {
$j = json_decode($curlResult->getBody(), true);
--- /dev/null
+<?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU APGL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Network;
+
+use Friendica\Core\Logger;
+use Friendica\Core\System;
+use Friendica\DI;
+use Friendica\Util\Network;
+
+/**
+ * Performs HTTP requests to a given URL
+ */
+class HTTPRequest
+{
+ /**
+ * fetches an URL.
+ *
+ * @param string $url URL to fetch
+ * @param bool $binary default false
+ * TRUE if asked to return binary results (file download)
+ * @param array $opts (optional parameters) assoziative array with:
+ * 'accept_content' => supply Accept: header with 'accept_content' as the value
+ * 'timeout' => int Timeout in seconds, default system config value or 60 seconds
+ * 'http_auth' => username:password
+ * '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
+ * @param int $redirects The recursion counter for internal use - default 0
+ *
+ * @return CurlResult
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function curl(string $url, bool $binary = false, array $opts = [], int &$redirects = 0)
+ {
+ $stamp1 = microtime(true);
+
+ $a = DI::app();
+
+ if (strlen($url) > 1000) {
+ Logger::log('URL is longer than 1000 characters. Callstack: ' . System::callstack(20), Logger::DEBUG);
+ return CurlResult::createErrorCurl(substr($url, 0, 200));
+ }
+
+ $parts2 = [];
+ $parts = parse_url($url);
+ $path_parts = explode('/', $parts['path'] ?? '');
+ foreach ($path_parts as $part) {
+ if (strlen($part) <> mb_strlen($part)) {
+ $parts2[] = rawurlencode($part);
+ } else {
+ $parts2[] = $part;
+ }
+ }
+ $parts['path'] = implode('/', $parts2);
+ $url = Network::unparseURL($parts);
+
+ if (Network::isUrlBlocked($url)) {
+ Logger::log('domain of ' . $url . ' is blocked', Logger::DATA);
+ return CurlResult::createErrorCurl($url);
+ }
+
+ $ch = @curl_init($url);
+
+ if (($redirects > 8) || (!$ch)) {
+ return CurlResult::createErrorCurl($url);
+ }
+
+ @curl_setopt($ch, CURLOPT_HEADER, true);
+
+ if (!empty($opts['cookiejar'])) {
+ curl_setopt($ch, CURLOPT_COOKIEJAR, $opts["cookiejar"]);
+ curl_setopt($ch, CURLOPT_COOKIEFILE, $opts["cookiejar"]);
+ }
+
+ // These settings aren't needed. We're following the location already.
+ // @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ // @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
+
+ if (!empty($opts['accept_content'])) {
+ curl_setopt(
+ $ch,
+ CURLOPT_HTTPHEADER,
+ ['Accept: ' . $opts['accept_content']]
+ );
+ }
+
+ if (!empty($opts['header'])) {
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['header']);
+ }
+
+ @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ @curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
+
+ $range = intval(DI::config()->get('system', 'curl_range_bytes', 0));
+
+ if ($range > 0) {
+ @curl_setopt($ch, CURLOPT_RANGE, '0-' . $range);
+ }
+
+ // Without this setting it seems as if some webservers send compressed content
+ // This seems to confuse curl so that it shows this uncompressed.
+ /// @todo We could possibly set this value to "gzip" or something similar
+ curl_setopt($ch, CURLOPT_ENCODING, '');
+
+ if (!empty($opts['headers'])) {
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+ }
+
+ if (!empty($opts['nobody'])) {
+ @curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
+ }
+
+ if (!empty($opts['timeout'])) {
+ @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
+ } else {
+ $curl_time = DI::config()->get('system', 'curl_timeout', 60);
+ @curl_setopt($ch, CURLOPT_TIMEOUT, intval($curl_time));
+ }
+
+ // by default we will allow self-signed certs
+ // but you can override this
+
+ $check_cert = DI::config()->get('system', 'verifyssl');
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+
+ if ($check_cert) {
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+ }
+
+ $proxy = DI::config()->get('system', 'proxy');
+
+ if (strlen($proxy)) {
+ @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+ @curl_setopt($ch, CURLOPT_PROXY, $proxy);
+ $proxyuser = @DI::config()->get('system', 'proxyuser');
+
+ if (strlen($proxyuser)) {
+ @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyuser);
+ }
+ }
+
+ if (DI::config()->get('system', 'ipv4_resolve', false)) {
+ curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ }
+
+ if ($binary) {
+ @curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
+ }
+
+ // don't let curl abort the entire application
+ // if it throws any errors.
+
+ $s = @curl_exec($ch);
+ $curl_info = @curl_getinfo($ch);
+
+ // Special treatment for HTTP Code 416
+ // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416
+ if (($curl_info['http_code'] == 416) && ($range > 0)) {
+ @curl_setopt($ch, CURLOPT_RANGE, '');
+ $s = @curl_exec($ch);
+ $curl_info = @curl_getinfo($ch);
+ }
+
+ $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
+
+ if ($curlResponse->isRedirectUrl()) {
+ $redirects++;
+ Logger::log('curl: redirect ' . $url . ' to ' . $curlResponse->getRedirectUrl());
+ @curl_close($ch);
+ return self::curl($curlResponse->getRedirectUrl(), $binary, $opts, $redirects);
+ }
+
+ @curl_close($ch);
+
+ DI::profiler()->saveTimestamp($stamp1, 'network', System::callstack());
+
+ return $curlResponse;
+ }
+
+ /**
+ * Send POST request to $url
+ *
+ * @param string $url URL to post
+ * @param mixed $params array of POST variables
+ * @param array $headers HTTP headers
+ * @param int $redirects Recursion counter for internal use - default = 0
+ * @param int $timeout The timeout in seconds, default system config value or 60 seconds
+ *
+ * @return CurlResult The content
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function post(string $url, $params, array $headers = [], int $timeout = 0, int &$redirects = 0)
+ {
+ $stamp1 = microtime(true);
+
+ if (Network::isUrlBlocked($url)) {
+ Logger::log('post_url: domain of ' . $url . ' is blocked', Logger::DATA);
+ return CurlResult::createErrorCurl($url);
+ }
+
+ $a = DI::app();
+ $ch = curl_init($url);
+
+ if (($redirects > 8) || (!$ch)) {
+ return CurlResult::createErrorCurl($url);
+ }
+
+ Logger::log('post_url: start ' . $url, Logger::DATA);
+
+ curl_setopt($ch, CURLOPT_HEADER, true);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+ curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
+
+ if (DI::config()->get('system', 'ipv4_resolve', false)) {
+ curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ }
+
+ if (intval($timeout)) {
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ } else {
+ $curl_time = DI::config()->get('system', 'curl_timeout', 60);
+ curl_setopt($ch, CURLOPT_TIMEOUT, intval($curl_time));
+ }
+
+ if (!empty($headers)) {
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+ }
+
+ $check_cert = DI::config()->get('system', 'verifyssl');
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+
+ if ($check_cert) {
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+ }
+
+ $proxy = DI::config()->get('system', 'proxy');
+
+ if (strlen($proxy)) {
+ curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+ curl_setopt($ch, CURLOPT_PROXY, $proxy);
+ $proxyuser = DI::config()->get('system', 'proxyuser');
+ if (strlen($proxyuser)) {
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyuser);
+ }
+ }
+
+ // don't let curl abort the entire application
+ // if it throws any errors.
+
+ $s = @curl_exec($ch);
+
+ $curl_info = curl_getinfo($ch);
+
+ $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
+
+ 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);
+ }
+
+ curl_close($ch);
+
+ DI::profiler()->saveTimestamp($stamp1, 'network', System::callstack());
+
+ // Very old versions of Lighttpd don't like the "Expect" header, so we remove it when needed
+ if ($curlResponse->getReturnCode() == 417) {
+ $redirects++;
+
+ if (empty($headers)) {
+ $headers = ['Expect:'];
+ } else {
+ if (!in_array('Expect:', $headers)) {
+ array_push($headers, 'Expect:');
+ }
+ }
+ Logger::info('Server responds with 417, applying workaround', ['url' => $url]);
+ return self::post($url, $params, $headers, $redirects, $timeout);
+ }
+
+ Logger::log('post_url: end ' . $url, Logger::DATA);
+
+ return $curlResponse;
+ }
+
+ /**
+ * Curl wrapper
+ *
+ * If binary flag is true, return binary results.
+ * Set the cookiejar argument to a string (e.g. "/tmp/friendica-cookies.txt")
+ * to preserve cookies from one request to the next.
+ *
+ * @param string $url URL to fetch
+ * @param bool $binary default false
+ * TRUE if asked to return binary results (file download)
+ * @param int $timeout Timeout in seconds, default system config value or 60 seconds
+ * @param string $accept_content supply Accept: header with 'accept_content' as the value
+ * @param string $cookiejar Path to cookie jar file
+ * @param int $redirects The recursion counter for internal use - default 0
+ *
+ * @return string The fetched content
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function fetchUrl(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '', int &$redirects = 0)
+ {
+ $ret = self::fetchUrlFull($url, $binary, $timeout, $accept_content, $cookiejar, $redirects);
+
+ return $ret->getBody();
+ }
+
+ /**
+ * Curl wrapper with array of return values.
+ *
+ * Inner workings and parameters are the same as @ref fetchUrl but returns an array with
+ * all the information collected during the fetch.
+ *
+ * @param string $url URL to fetch
+ * @param bool $binary default false
+ * TRUE if asked to return binary results (file download)
+ * @param int $timeout Timeout in seconds, default system config value or 60 seconds
+ * @param string $accept_content supply Accept: header with 'accept_content' as the value
+ * @param string $cookiejar Path to cookie jar file
+ * @param int $redirects The recursion counter for internal use - default 0
+ *
+ * @return CurlResult With all relevant information, 'body' contains the actual fetched content.
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function fetchUrlFull(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '', int &$redirects = 0)
+ {
+ return self::curl(
+ $url,
+ $binary,
+ [
+ 'timeout' => $timeout,
+ 'accept_content' => $accept_content,
+ 'cookiejar' => $cookiejar
+ ],
+ $redirects
+ );
+ }
+}
Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
$xrd = null;
- $curlResult = Network::curl($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
+ $curlResult = HTTPRequest::curl($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
$ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
if ($curlResult->isSuccess()) {
$xml = $curlResult->getBody();
}
if (!is_object($xrd) && !empty($url)) {
- $curlResult = Network::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
+ $curlResult = HTTPRequest::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
$connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
if ($curlResult->isTimeout()) {
Logger::info('Probing timeout', ['url' => $url]);
*/
private static function getHideStatus($url)
{
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if (!$curlResult->isSuccess()) {
return false;
}
public static function pollZot($url, $data)
{
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isTimeout()) {
return $data;
}
{
$xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
- $curlResult = Network::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => $type]);
+ $curlResult = HTTPRequest::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => $type]);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return [];
*/
private static function pollNoscrape($noscrape_url, $data)
{
- $curlResult = Network::curl($noscrape_url);
+ $curlResult = HTTPRequest::curl($noscrape_url);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return [];
*/
private static function pollHcard($hcard_url, $data, $dfrn = false)
{
- $curlResult = Network::curl($hcard_url);
+ $curlResult = HTTPRequest::curl($hcard_url);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return [];
$pubkey = substr($pubkey, 5);
}
} elseif (Strings::normaliseLink($pubkey) == 'http://') {
- $curlResult = Network::curl($pubkey);
+ $curlResult = HTTPRequest::curl($pubkey);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return $short ? false : [];
}
// Fetch all additional data from the feed
- $curlResult = Network::curl($data["poll"]);
+ $curlResult = HTTPRequest::curl($data["poll"]);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return [];
*/
private static function pumpioProfileData($profile_link)
{
- $curlResult = Network::curl($profile_link);
+ $curlResult = HTTPRequest::curl($profile_link);
if (!$curlResult->isSuccess()) {
return [];
}
*/
private static function feed($url, $probe = true)
{
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isTimeout()) {
self::$istimeout = true;
return [];
namespace Friendica\Protocol;
-use Friendica\Util\JsonLD;
-use Friendica\Util\Network;
use Friendica\Core\Protocol;
use Friendica\Model\APContact;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\HTTPSignature;
+use Friendica\Util\JsonLD;
/**
* ActivityPub Protocol class
return HTTPSignature::fetch($url, $uid);
}
- $curlResult = Network::curl($url, false, ['accept_content' => 'application/activity+json, application/ld+json']);
+ $curlResult = HTTPRequest::curl($url, false, ['accept_content' => 'application/activity+json, application/ld+json']);
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
return false;
}
use Friendica\Model\Profile;
use Friendica\Model\Tag;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
Logger::log('dfrn_deliver: ' . $url);
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isTimeout()) {
return -2; // timed out
Logger::debug('dfrn_deliver', ['post' => $postvars]);
- $postResult = Network::post($contact['notify'], $postvars);
+ $postResult = HTTPRequest::post($contact['notify'], $postvars);
$xml = $postResult->getBody();
$content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
- $postResult = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]);
+ $postResult = HTTPRequest::post($dest_url, $envelope, ["Content-Type: " . $content_type]);
$xml = $postResult->getBody();
$curl_stat = $postResult->getReturnCode();
use Friendica\Model\Post;
use Friendica\Model\Tag;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
Logger::log("Fetch post from ".$source_url, Logger::DEBUG);
- $envelope = Network::fetchUrl($source_url);
+ $envelope = HTTPRequest::fetchUrl($source_url);
if ($envelope) {
Logger::log("Envelope was fetched.", Logger::DEBUG);
$x = self::verifyMagicEnvelope($envelope);
if (!intval(DI::config()->get("system", "diaspora_test"))) {
$content_type = (($public_batch) ? "application/magic-envelope+xml" : "application/json");
- $postResult = Network::post($dest_url."/", $envelope, ["Content-Type: ".$content_type]);
+ $postResult = HTTPRequest::post($dest_url . "/", $envelope, ["Content-Type: " . $content_type]);
$return_code = $postResult->getReturnCode();
} else {
Logger::log("test_mode");
use Friendica\Model\ItemURI;
use Friendica\Model\Tag;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Images;
-use Friendica\Util\Network;
use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings;
use Friendica\Util\XML;
self::$conv_list[$conversation] = true;
- $curlResult = Network::curl($conversation, false, ['accept_content' => 'application/atom+xml, text/html']);
+ $curlResult = HTTPRequest::curl($conversation, false, ['accept_content' => 'application/atom+xml, text/html']);
if (!$curlResult->isSuccess()) {
return;
}
}
if ($file != '') {
- $conversation_atom = Network::curl($attribute['href']);
+ $conversation_atom = HTTPRequest::curl($attribute['href']);
if ($conversation_atom->isSuccess()) {
$xml = $conversation_atom->getBody();
return;
}
- $curlResult = Network::curl($self);
+ $curlResult = HTTPRequest::curl($self);
if (!$curlResult->isSuccess()) {
return;
}
$stored = false;
- $curlResult = Network::curl($related, false, ['accept_content' => 'application/atom+xml, text/html']);
+ $curlResult = HTTPRequest::curl($related, false, ['accept_content' => 'application/atom+xml, text/html']);
if (!$curlResult->isSuccess()) {
return;
}
}
if ($atom_file != '') {
- $curlResult = Network::curl($atom_file);
+ $curlResult = HTTPRequest::curl($atom_file);
if ($curlResult->isSuccess()) {
Logger::log('Fetched XML for URI ' . $related_uri, Logger::DEBUG);
// Workaround for older GNU Social servers
if (($xml == '') && strstr($related, '/notice/')) {
- $curlResult = Network::curl(str_replace('/notice/', '/api/statuses/show/', $related).'.atom');
+ $curlResult = HTTPRequest::curl(str_replace('/notice/', '/api/statuses/show/', $related) . '.atom');
if ($curlResult->isSuccess()) {
Logger::log('GNU Social workaround to fetch XML for URI ' . $related_uri, Logger::DEBUG);
// Even more worse workaround for GNU Social ;-)
if ($xml == '') {
$related_guess = self::convertHref($related_uri);
- $curlResult = Network::curl(str_replace('/notice/', '/api/statuses/show/', $related_guess).'.atom');
+ $curlResult = HTTPRequest::curl(str_replace('/notice/', '/api/statuses/show/', $related_guess) . '.atom');
if ($curlResult->isSuccess()) {
Logger::log('GNU Social workaround 2 to fetch XML for URI ' . $related_uri, Logger::DEBUG);
use Friendica\DI;
use Friendica\Model\GContact;
use Friendica\Model\GServer;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
/**
Logger::log('load: ' . $url, Logger::DEBUG);
- $fetchresult = Network::fetchUrlFull($url);
+ $fetchresult = HTTPRequest::fetchUrlFull($url);
$s = $fetchresult->getBody();
Logger::log('load: returns ' . $s, Logger::DATA);
*/
private static function fetchServerlist($poco)
{
- $curlResult = Network::curl($poco . "/@server");
+ $curlResult = HTTPRequest::curl($poco . "/@server");
if (!$curlResult->isSuccess()) {
return;
Logger::info("Fetch all users from the server " . $server["url"]);
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isSuccess() && !empty($curlResult->getBody())) {
$data = json_decode($curlResult->getBody(), true);
$success = false;
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isSuccess() && !empty($curlResult->getBody())) {
Logger::info("Fetch all global contacts from the server " . $server["nurl"]);
// Fetch all contacts from a given user from the other server
$url = $server['poco'] . '/' . $username . '/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,contactType,generation';
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if ($curlResult->isSuccess()) {
$data = json_decode($curlResult->getBody(), true);
namespace Friendica\Protocol;
use Friendica\Core\Logger;
+use Friendica\Network\HTTPRequest;
use Friendica\Network\Probe;
use Friendica\Util\Crypto;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
$ret[$x] = substr($ret[$x], 5);
}
} elseif (Strings::normaliseLink($ret[$x]) == 'http://') {
- $ret[$x] = Network::fetchUrl($ret[$x]);
+ $ret[$x] = HTTPRequest::fetchUrl($ret[$x]);
}
}
}
$salmon = XML::fromArray($xmldata, $xml, false, $namespaces);
// slap them
- $postResult = Network::post($url, $salmon, [
+ $postResult = HTTPRequest::post($url, $salmon, [
'Content-type: application/magic-envelope+xml',
'Content-length: ' . strlen($salmon)
]);
$salmon = XML::fromArray($xmldata, $xml, false, $namespaces);
// slap them
- $postResult = Network::post($url, $salmon, [
+ $postResult = HTTPRequest::post($url, $salmon, [
'Content-type: application/magic-envelope+xml',
'Content-length: ' . strlen($salmon)
]);
$salmon = XML::fromArray($xmldata, $xml, false, $namespaces);
// slap them
- $postResult = Network::post($url, $salmon, [
+ $postResult = HTTPRequest::post($url, $salmon, [
'Content-type: application/magic-envelope+xml',
'Content-length: ' . strlen($salmon)]);
$return_code = $postResult->getReturnCode();
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
class ExAuth
{
$url = ($ssl ? 'https' : 'http') . '://' . $host . '/noscrape/' . $user;
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if (!$curlResult->isSuccess()) {
return false;
namespace Friendica\Util;
-use Friendica\Database\DBA;
use Friendica\Core\Logger;
+use Friendica\Database\DBA;
use Friendica\DI;
-use Friendica\Model\User;
use Friendica\Model\APContact;
+use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
/**
* Implements HTTP Signatures per draft-cavage-http-signatures-07.
$headers[] = 'Content-Type: application/activity+json';
- $postResult = Network::post($target, $content, $headers);
+ $postResult = HTTPRequest::post($target, $content, $headers);
$return_code = $postResult->getReturnCode();
Logger::log('Transmit to ' . $target . ' returned ' . $return_code, Logger::DEBUG);
$curl_opts = $opts;
$curl_opts['header'] = $headers;
- $curlResult = Network::curl($request, false, $curl_opts);
+ $curlResult = HTTPRequest::curl($request, false, $curl_opts);
$return_code = $curlResult->getReturnCode();
Logger::log('Fetched for user ' . $uid . ' from ' . $request . ' returned ' . $return_code, Logger::DEBUG);
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
+use Friendica\Network\HTTPRequest;
/**
* Image utilities
return $data;
}
- $img_str = Network::fetchUrl($url, true, 4);
+ $img_str = HTTPRequest::fetchUrl($url, true, 4);
if (!$img_str) {
return [];
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
-use Friendica\Network\CurlResult;
class Network
{
- /**
- * Curl wrapper
- *
- * If binary flag is true, return binary results.
- * Set the cookiejar argument to a string (e.g. "/tmp/friendica-cookies.txt")
- * to preserve cookies from one request to the next.
- *
- * @param string $url URL to fetch
- * @param bool $binary default false
- * TRUE if asked to return binary results (file download)
- * @param int $timeout Timeout in seconds, default system config value or 60 seconds
- * @param string $accept_content supply Accept: header with 'accept_content' as the value
- * @param string $cookiejar Path to cookie jar file
- * @param int $redirects The recursion counter for internal use - default 0
- *
- * @return string The fetched content
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- */
- public static function fetchUrl(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '', int &$redirects = 0)
- {
- $ret = self::fetchUrlFull($url, $binary, $timeout, $accept_content, $cookiejar, $redirects);
-
- return $ret->getBody();
- }
-
- /**
- * Curl wrapper with array of return values.
- *
- * Inner workings and parameters are the same as @ref fetchUrl but returns an array with
- * all the information collected during the fetch.
- *
- * @param string $url URL to fetch
- * @param bool $binary default false
- * TRUE if asked to return binary results (file download)
- * @param int $timeout Timeout in seconds, default system config value or 60 seconds
- * @param string $accept_content supply Accept: header with 'accept_content' as the value
- * @param string $cookiejar Path to cookie jar file
- * @param int $redirects The recursion counter for internal use - default 0
- *
- * @return CurlResult With all relevant information, 'body' contains the actual fetched content.
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- */
- public static function fetchUrlFull(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '', int &$redirects = 0)
- {
- return self::curl(
- $url,
- $binary,
- [
- 'timeout' => $timeout,
- 'accept_content' => $accept_content,
- 'cookiejar' => $cookiejar
- ],
- $redirects
- );
- }
-
- /**
- * fetches an URL.
- *
- * @param string $url URL to fetch
- * @param bool $binary default false
- * TRUE if asked to return binary results (file download)
- * @param array $opts (optional parameters) assoziative array with:
- * 'accept_content' => supply Accept: header with 'accept_content' as the value
- * 'timeout' => int Timeout in seconds, default system config value or 60 seconds
- * 'http_auth' => username:password
- * '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
- * @param int $redirects The recursion counter for internal use - default 0
- *
- * @return CurlResult
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- */
- public static function curl(string $url, bool $binary = false, array $opts = [], int &$redirects = 0)
- {
- $stamp1 = microtime(true);
-
- $a = DI::app();
-
- if (strlen($url) > 1000) {
- Logger::log('URL is longer than 1000 characters. Callstack: ' . System::callstack(20), Logger::DEBUG);
- return CurlResult::createErrorCurl(substr($url, 0, 200));
- }
-
- $parts2 = [];
- $parts = parse_url($url);
- $path_parts = explode('/', $parts['path'] ?? '');
- foreach ($path_parts as $part) {
- if (strlen($part) <> mb_strlen($part)) {
- $parts2[] = rawurlencode($part);
- } else {
- $parts2[] = $part;
- }
- }
- $parts['path'] = implode('/', $parts2);
- $url = self::unparseURL($parts);
-
- if (self::isUrlBlocked($url)) {
- Logger::log('domain of ' . $url . ' is blocked', Logger::DATA);
- return CurlResult::createErrorCurl($url);
- }
-
- $ch = @curl_init($url);
-
- if (($redirects > 8) || (!$ch)) {
- return CurlResult::createErrorCurl($url);
- }
-
- @curl_setopt($ch, CURLOPT_HEADER, true);
-
- if (!empty($opts['cookiejar'])) {
- curl_setopt($ch, CURLOPT_COOKIEJAR, $opts["cookiejar"]);
- curl_setopt($ch, CURLOPT_COOKIEFILE, $opts["cookiejar"]);
- }
-
- // These settings aren't needed. We're following the location already.
- // @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- // @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
-
- if (!empty($opts['accept_content'])) {
- curl_setopt(
- $ch,
- CURLOPT_HTTPHEADER,
- ['Accept: ' . $opts['accept_content']]
- );
- }
-
- if (!empty($opts['header'])) {
- curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['header']);
- }
-
- @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- @curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
-
- $range = intval(DI::config()->get('system', 'curl_range_bytes', 0));
-
- if ($range > 0) {
- @curl_setopt($ch, CURLOPT_RANGE, '0-' . $range);
- }
-
- // Without this setting it seems as if some webservers send compressed content
- // This seems to confuse curl so that it shows this uncompressed.
- /// @todo We could possibly set this value to "gzip" or something similar
- curl_setopt($ch, CURLOPT_ENCODING, '');
-
- if (!empty($opts['headers'])) {
- @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
- }
-
- if (!empty($opts['nobody'])) {
- @curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
- }
-
- if (!empty($opts['timeout'])) {
- @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
- } else {
- $curl_time = DI::config()->get('system', 'curl_timeout', 60);
- @curl_setopt($ch, CURLOPT_TIMEOUT, intval($curl_time));
- }
-
- // by default we will allow self-signed certs
- // but you can override this
-
- $check_cert = DI::config()->get('system', 'verifyssl');
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-
- if ($check_cert) {
- @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- }
-
- $proxy = DI::config()->get('system', 'proxy');
-
- if (strlen($proxy)) {
- @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- @curl_setopt($ch, CURLOPT_PROXY, $proxy);
- $proxyuser = @DI::config()->get('system', 'proxyuser');
-
- if (strlen($proxyuser)) {
- @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyuser);
- }
- }
-
- if (DI::config()->get('system', 'ipv4_resolve', false)) {
- curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
- }
-
- if ($binary) {
- @curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
- }
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
- $curl_info = @curl_getinfo($ch);
-
- // Special treatment for HTTP Code 416
- // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416
- if (($curl_info['http_code'] == 416) && ($range > 0)) {
- @curl_setopt($ch, CURLOPT_RANGE, '');
- $s = @curl_exec($ch);
- $curl_info = @curl_getinfo($ch);
- }
-
- $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
-
- if ($curlResponse->isRedirectUrl()) {
- $redirects++;
- Logger::log('curl: redirect ' . $url . ' to ' . $curlResponse->getRedirectUrl());
- @curl_close($ch);
- return self::curl($curlResponse->getRedirectUrl(), $binary, $opts, $redirects);
- }
-
- @curl_close($ch);
-
- DI::profiler()->saveTimestamp($stamp1, 'network', System::callstack());
-
- return $curlResponse;
- }
-
- /**
- * Send POST request to $url
- *
- * @param string $url URL to post
- * @param mixed $params array of POST variables
- * @param array $headers HTTP headers
- * @param int $redirects Recursion counter for internal use - default = 0
- * @param int $timeout The timeout in seconds, default system config value or 60 seconds
- *
- * @return CurlResult The content
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- */
- public static function post(string $url, $params, array $headers = [], int $timeout = 0, int &$redirects = 0)
- {
- $stamp1 = microtime(true);
-
- if (self::isUrlBlocked($url)) {
- Logger::log('post_url: domain of ' . $url . ' is blocked', Logger::DATA);
- return CurlResult::createErrorCurl($url);
- }
-
- $a = DI::app();
- $ch = curl_init($url);
-
- if (($redirects > 8) || (!$ch)) {
- return CurlResult::createErrorCurl($url);
- }
-
- Logger::log('post_url: start ' . $url, Logger::DATA);
-
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
- curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
-
- if (DI::config()->get('system', 'ipv4_resolve', false)) {
- curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
- }
-
- if (intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- } else {
- $curl_time = DI::config()->get('system', 'curl_timeout', 60);
- curl_setopt($ch, CURLOPT_TIMEOUT, intval($curl_time));
- }
-
- if (!empty($headers)) {
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
- }
-
- $check_cert = DI::config()->get('system', 'verifyssl');
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-
- if ($check_cert) {
- @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- }
-
- $proxy = DI::config()->get('system', 'proxy');
-
- if (strlen($proxy)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $proxy);
- $proxyuser = DI::config()->get('system', 'proxyuser');
- if (strlen($proxyuser)) {
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyuser);
- }
- }
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $curl_info = curl_getinfo($ch);
-
- $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
-
- 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);
- }
-
- curl_close($ch);
-
- DI::profiler()->saveTimestamp($stamp1, 'network', System::callstack());
-
- // Very old versions of Lighttpd don't like the "Expect" header, so we remove it when needed
- if ($curlResponse->getReturnCode() == 417) {
- $redirects++;
-
- if (empty($headers)) {
- $headers = ['Expect:'];
- } else {
- if (!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
- Logger::info('Server responds with 417, applying workaround', ['url' => $url]);
- return self::post($url, $params, $headers, $redirects, $timeout);
- }
-
- Logger::log('post_url: end ' . $url, Logger::DATA);
-
- return $curlResponse;
- }
/**
* Return raw post data from a post request
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Database\DBA;
+use Friendica\Network\HTTPRequest;
/**
* Get information about a given URL
return $siteinfo;
}
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if (!$curlResult->isSuccess()) {
return $siteinfo;
}
use Friendica\Core\Logger;
use Friendica\Database\DBA;
use Friendica\DI;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
/**
* Check the git repository VERSION file and save the version to the DB
Logger::log("Checking VERSION from: ".$checked_url, Logger::DEBUG);
// fetch the VERSION file
- $gitversion = DBA::escape(trim(Network::fetchUrl($checked_url)));
+ $gitversion = DBA::escape(trim(HTTPRequest::fetchUrl($checked_url)));
Logger::log("Upstream VERSION is: ".$gitversion, Logger::DEBUG);
DI::config()->set('system', 'git_friendica_version', $gitversion);
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\GContact;
-use Friendica\Model\GServer;
use Friendica\Model\Nodeinfo;
use Friendica\Model\Photo;
use Friendica\Model\User;
-use Friendica\Network\Probe;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings;
// Now trying to register
$url = 'http://the-federation.info/register/' . DI::baseUrl()->getHostname();
Logger::debug('Check registering url', ['url' => $url]);
- $ret = Network::fetchUrl($url);
+ $ret = HTTPRequest::fetchUrl($url);
Logger::debug('Check registering answer', ['answer' => $ret]);
Logger::info('cron_end');
break;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
/**
* Sends updated profile data to the directory
Logger::log('Updating directory: ' . $arr['url'], Logger::DEBUG);
if (strlen($arr['url'])) {
- Network::fetchUrl($dir . '?url=' . bin2hex($arr['url']));
+ HTTPRequest::fetchUrl($dir . '?url=' . bin2hex($arr['url']));
}
return;
use Friendica\Model\Contact;
use Friendica\Model\Item;
use Friendica\Model\User;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\Email;
use Friendica\Protocol\Feed;
use Friendica\Protocol\PortableContact;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
. '&type=data&last_update=' . $last_update
. '&perm=' . $perm;
- $curlResult = Network::curl($url);
+ $curlResult = HTTPRequest::curl($url);
if (!$curlResult->isSuccess() && ($curlResult->getErrorNumber() == CURLE_OPERATION_TIMEDOUT)) {
// set the last-update so we don't keep polling
$postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
$postvars['perm'] = 'rw';
- return Network::post($contact['poll'], $postvars)->getBody();
+ return HTTPRequest::post($contact['poll'], $postvars)->getBody();
}
/**
}
$cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
- $curlResult = Network::curl($contact['poll'], false, ['cookiejar' => $cookiejar]);
+ $curlResult = HTTPRequest::curl($contact['poll'], false, ['cookiejar' => $cookiejar]);
unlink($cookiejar);
if ($curlResult->isTimeout()) {
DBA::update('contact', ['hub-verify' => $verify_token], ['id' => $contact['id']]);
}
- $postResult = Network::post($url, $params);
+ $postResult = HTTPRequest::post($url, $params);
Logger::log('subscribe_to_hub: returns: ' . $postResult->getReturnCode(), Logger::DEBUG);
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\PushSubscriber;
+use Friendica\Network\HTTPRequest;
use Friendica\Protocol\OStatus;
-use Friendica\Util\Network;
class PubSubPublish
{
Logger::log('POST ' . print_r($headers, true) . "\n" . $params, Logger::DATA);
- $postResult = Network::post($subscriber['callback_url'], $params, $headers);
+ $postResult = HTTPRequest::post($subscriber['callback_url'], $params, $headers);
$ret = $postResult->getReturnCode();
if ($ret >= 200 && $ret <= 299) {
use Friendica\Model\Contact;
use Friendica\Model\GContact;
use Friendica\Model\GServer;
-use Friendica\Util\Network;
+use Friendica\Network\HTTPRequest;
use Friendica\Util\Strings;
class SearchDirectory
}
}
- $x = Network::fetchUrl(Search::getGlobalDirectory() . '/lsearch?p=1&n=500&search=' . urlencode($search));
+ $x = HTTPRequest::fetchUrl(Search::getGlobalDirectory() . '/lsearch?p=1&n=500&search=' . urlencode($search));
$j = json_decode($x);
if (!empty($j->results)) {