Merge pull request #9416 from nupplaphil/task/revert_guzzlehttp
Revert GuzzleHttp / PSR-7 introduction
This commit is contained in:
commit
bdb73ff326
22 changed files with 200 additions and 472 deletions
|
@ -31,7 +31,6 @@
|
||||||
"divineomega/password_exposed": "^2.8",
|
"divineomega/password_exposed": "^2.8",
|
||||||
"ezyang/htmlpurifier": "^4.7",
|
"ezyang/htmlpurifier": "^4.7",
|
||||||
"friendica/json-ld": "^1.0",
|
"friendica/json-ld": "^1.0",
|
||||||
"guzzlehttp/guzzle": "^6.5",
|
|
||||||
"league/html-to-markdown": "^4.8",
|
"league/html-to-markdown": "^4.8",
|
||||||
"level-2/dice": "^4",
|
"level-2/dice": "^4",
|
||||||
"lightopenid/lightopenid": "dev-master",
|
"lightopenid/lightopenid": "dev-master",
|
||||||
|
|
2
composer.lock
generated
2
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6c141820d2160b278dffecc3e89f86e3",
|
"content-hash": "fd22bd8c29dcea3d6b6eeb117d79af52",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "asika/simple-console",
|
"name": "asika/simple-console",
|
||||||
|
|
|
@ -90,14 +90,13 @@ function parse_url_content(App $a)
|
||||||
if ($curlResponse->isSuccess()) {
|
if ($curlResponse->isSuccess()) {
|
||||||
// Convert the header fields into an array
|
// Convert the header fields into an array
|
||||||
$hdrs = [];
|
$hdrs = [];
|
||||||
$h = $curlResponse->getHeaders();
|
$h = explode("\n", $curlResponse->getHeader());
|
||||||
foreach ($h as $l) {
|
foreach ($h as $l) {
|
||||||
foreach ($l as $k => $v) {
|
$header = array_map('trim', explode(':', trim($l), 2));
|
||||||
if (empty($hdrs[$k])) {
|
if (count($header) == 2) {
|
||||||
|
list($k, $v) = $header;
|
||||||
$hdrs[$k] = $v;
|
$hdrs[$k] = $v;
|
||||||
}
|
}
|
||||||
$hdrs[$k] .= " " . $v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$type = null;
|
$type = null;
|
||||||
$content_type = '';
|
$content_type = '';
|
||||||
|
|
|
@ -491,8 +491,8 @@ class BBCode
|
||||||
}
|
}
|
||||||
|
|
||||||
$i = $curlResult->getBody();
|
$i = $curlResult->getBody();
|
||||||
$contType = $curlResult->getContentType();
|
$type = $curlResult->getContentType();
|
||||||
$type = Images::getMimeTypeByData($i, $mtch[1], $contType);
|
$type = Images::getMimeTypeByData($i, $mtch[1], $type);
|
||||||
|
|
||||||
if ($i) {
|
if ($i) {
|
||||||
$Image = new Image($i, $type);
|
$Image = new Image($i, $type);
|
||||||
|
|
|
@ -30,7 +30,7 @@ use Friendica\Core\Worker;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Module\Register;
|
use Friendica\Module\Register;
|
||||||
use Friendica\Network\IHTTPResult;
|
use Friendica\Network\CurlResult;
|
||||||
use Friendica\Protocol\Diaspora;
|
use Friendica\Protocol\Diaspora;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
|
@ -631,18 +631,17 @@ class GServer
|
||||||
* Detect server type by using the nodeinfo data
|
* Detect server type by using the nodeinfo data
|
||||||
*
|
*
|
||||||
* @param string $url address of the server
|
* @param string $url address of the server
|
||||||
* @param IHTTPResult $httpResult
|
* @param CurlResult $curlResult
|
||||||
*
|
|
||||||
* @return array Server data
|
* @return array Server data
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
private static function fetchNodeinfo(string $url, IHTTPResult $httpResult)
|
private static function fetchNodeinfo(string $url, CurlResult $curlResult)
|
||||||
{
|
{
|
||||||
if (!$httpResult->isSuccess()) {
|
if (!$curlResult->isSuccess()) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$nodeinfo = json_decode($httpResult->getBody(), true);
|
$nodeinfo = json_decode($curlResult->getBody(), true);
|
||||||
|
|
||||||
if (!is_array($nodeinfo) || empty($nodeinfo['links'])) {
|
if (!is_array($nodeinfo) || empty($nodeinfo['links'])) {
|
||||||
return [];
|
return [];
|
||||||
|
|
|
@ -424,17 +424,16 @@ class Photo
|
||||||
if (!empty($image_url)) {
|
if (!empty($image_url)) {
|
||||||
$ret = DI::httpRequest()->get($image_url, true);
|
$ret = DI::httpRequest()->get($image_url, true);
|
||||||
$img_str = $ret->getBody();
|
$img_str = $ret->getBody();
|
||||||
$contType = $ret->getContentType();
|
$type = $ret->getContentType();
|
||||||
} else {
|
} else {
|
||||||
$img_str = '';
|
$img_str = '';
|
||||||
$contType = '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($quit_on_error && ($img_str == "")) {
|
if ($quit_on_error && ($img_str == "")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$type = Images::getMimeTypeByData($img_str, $image_url, $contType);
|
$type = Images::getMimeTypeByData($img_str, $image_url, $type);
|
||||||
|
|
||||||
$Image = new Image($img_str, $type);
|
$Image = new Image($img_str, $type);
|
||||||
if ($Image->isValid()) {
|
if ($Image->isValid()) {
|
||||||
|
|
|
@ -1005,13 +1005,13 @@ class User
|
||||||
$curlResult = DI::httpRequest()->get($photo, true);
|
$curlResult = DI::httpRequest()->get($photo, true);
|
||||||
if ($curlResult->isSuccess()) {
|
if ($curlResult->isSuccess()) {
|
||||||
$img_str = $curlResult->getBody();
|
$img_str = $curlResult->getBody();
|
||||||
$contType = $curlResult->getContentType();
|
$type = $curlResult->getContentType();
|
||||||
} else {
|
} else {
|
||||||
$img_str = '';
|
$img_str = '';
|
||||||
$contType = '';
|
$type = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$type = Images::getMimeTypeByData($img_str, $photo, $contType);
|
$type = Images::getMimeTypeByData($img_str, $photo, $type);
|
||||||
|
|
||||||
$Image = new Image($img_str, $type);
|
$Image = new Image($img_str, $type);
|
||||||
if ($Image->isValid()) {
|
if ($Image->isValid()) {
|
||||||
|
|
|
@ -29,7 +29,7 @@ use Friendica\Util\Network;
|
||||||
/**
|
/**
|
||||||
* A content class for Curl call results
|
* A content class for Curl call results
|
||||||
*/
|
*/
|
||||||
class CurlResult implements IHTTPResult
|
class CurlResult
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var int HTTP return code or 0 if timeout or failure
|
* @var int HTTP return code or 0 if timeout or failure
|
||||||
|
@ -101,7 +101,7 @@ class CurlResult implements IHTTPResult
|
||||||
*
|
*
|
||||||
* @param string $url optional URL
|
* @param string $url optional URL
|
||||||
*
|
*
|
||||||
* @return IHTTPResult a CURL with error response
|
* @return CurlResult a CURL with error response
|
||||||
* @throws InternalServerErrorException
|
* @throws InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public static function createErrorCurl($url = '')
|
public static function createErrorCurl($url = '')
|
||||||
|
@ -229,43 +229,57 @@ class CurlResult implements IHTTPResult
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* Gets the Curl Code
|
||||||
|
*
|
||||||
|
* @return string The Curl Code
|
||||||
|
*/
|
||||||
public function getReturnCode()
|
public function getReturnCode()
|
||||||
{
|
{
|
||||||
return $this->returnCode;
|
return $this->returnCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* Returns the Curl Content Type
|
||||||
|
*
|
||||||
|
* @return string the Curl Content Type
|
||||||
|
*/
|
||||||
public function getContentType()
|
public function getContentType()
|
||||||
{
|
{
|
||||||
return $this->contentType;
|
return $this->contentType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
public function getHeader($header)
|
* Returns the Curl headers
|
||||||
|
*
|
||||||
|
* @param string $field optional header field. Return all fields if empty
|
||||||
|
*
|
||||||
|
* @return string the Curl headers or the specified content of the header variable
|
||||||
|
*/
|
||||||
|
public function getHeader(string $field = '')
|
||||||
{
|
{
|
||||||
if (empty($header)) {
|
if (empty($field)) {
|
||||||
return [];
|
return $this->header;
|
||||||
}
|
}
|
||||||
|
|
||||||
$header = strtolower(trim($header));
|
$field = strtolower(trim($field));
|
||||||
|
|
||||||
$headers = $this->getHeaderArray();
|
$headers = $this->getHeaderArray();
|
||||||
|
|
||||||
if (isset($headers[$header])) {
|
if (isset($headers[$field])) {
|
||||||
return $headers[$header];
|
return $headers[$field];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
public function getHeaders()
|
* Check if a specified header exists
|
||||||
{
|
*
|
||||||
return $this->getHeaderArray();
|
* @param string $field header field
|
||||||
}
|
*
|
||||||
|
* @return boolean "true" if header exists
|
||||||
/** {@inheritDoc} */
|
*/
|
||||||
public function inHeader(string $field)
|
public function inHeader(string $field)
|
||||||
{
|
{
|
||||||
$field = strtolower(trim($field));
|
$field = strtolower(trim($field));
|
||||||
|
@ -275,7 +289,11 @@ class CurlResult implements IHTTPResult
|
||||||
return array_key_exists($field, $headers);
|
return array_key_exists($field, $headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* Returns the Curl headers as an associated array
|
||||||
|
*
|
||||||
|
* @return array associated header array
|
||||||
|
*/
|
||||||
public function getHeaderArray()
|
public function getHeaderArray()
|
||||||
{
|
{
|
||||||
if (!empty($this->header_fields)) {
|
if (!empty($this->header_fields)) {
|
||||||
|
@ -289,59 +307,79 @@ class CurlResult implements IHTTPResult
|
||||||
$parts = explode(':', $line);
|
$parts = explode(':', $line);
|
||||||
$headerfield = strtolower(trim(array_shift($parts)));
|
$headerfield = strtolower(trim(array_shift($parts)));
|
||||||
$headerdata = trim(implode(':', $parts));
|
$headerdata = trim(implode(':', $parts));
|
||||||
if (empty($this->header_fields[$headerfield])) {
|
$this->header_fields[$headerfield] = $headerdata;
|
||||||
$this->header_fields[$headerfield] = [$headerdata];
|
|
||||||
} elseif (!in_array($headerdata, $this->header_fields[$headerfield])) {
|
|
||||||
$this->header_fields[$headerfield][] = $headerdata;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->header_fields;
|
return $this->header_fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function isSuccess()
|
public function isSuccess()
|
||||||
{
|
{
|
||||||
return $this->isSuccess;
|
return $this->isSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function getUrl()
|
public function getUrl()
|
||||||
{
|
{
|
||||||
return $this->url;
|
return $this->url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function getRedirectUrl()
|
public function getRedirectUrl()
|
||||||
{
|
{
|
||||||
return $this->redirectUrl;
|
return $this->redirectUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function getBody()
|
public function getBody()
|
||||||
{
|
{
|
||||||
return $this->body;
|
return $this->body;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getInfo()
|
||||||
|
{
|
||||||
|
return $this->info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function isRedirectUrl()
|
public function isRedirectUrl()
|
||||||
{
|
{
|
||||||
return $this->isRedirectUrl;
|
return $this->isRedirectUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
public function getErrorNumber()
|
public function getErrorNumber()
|
||||||
{
|
{
|
||||||
return $this->errorNumber;
|
return $this->errorNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function getError()
|
public function getError()
|
||||||
{
|
{
|
||||||
return $this->error;
|
return $this->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function isTimeout()
|
public function isTimeout()
|
||||||
{
|
{
|
||||||
return $this->isTimeout;
|
return $this->isTimeout;
|
||||||
|
|
|
@ -1,148 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright Copyright (C) 2020, Friendica
|
|
||||||
*
|
|
||||||
* @license GNU AGPL 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\Network\HTTPException\NotImplementedException;
|
|
||||||
use GuzzleHttp\Psr7\Response;
|
|
||||||
use Psr\Http\Message\ResponseInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A content wrapper class for Guzzle call results
|
|
||||||
*/
|
|
||||||
class GuzzleResponse extends Response implements IHTTPResult, ResponseInterface
|
|
||||||
{
|
|
||||||
/** @var string The URL */
|
|
||||||
private $url;
|
|
||||||
/** @var boolean */
|
|
||||||
private $isTimeout;
|
|
||||||
/** @var boolean */
|
|
||||||
private $isSuccess;
|
|
||||||
/**
|
|
||||||
* @var int the error number or 0 (zero) if no error
|
|
||||||
*/
|
|
||||||
private $errorNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string the error message or '' (the empty string) if no
|
|
||||||
*/
|
|
||||||
private $error;
|
|
||||||
|
|
||||||
public function __construct(ResponseInterface $response, string $url, $errorNumber = 0, $error = '')
|
|
||||||
{
|
|
||||||
parent::__construct($response->getStatusCode(), $response->getHeaders(), $response->getBody(), $response->getProtocolVersion(), $response->getReasonPhrase());
|
|
||||||
$this->url = $url;
|
|
||||||
$this->error = $error;
|
|
||||||
$this->errorNumber = $errorNumber;
|
|
||||||
|
|
||||||
$this->checkSuccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
private function checkSuccess()
|
|
||||||
{
|
|
||||||
$this->isSuccess = ($this->getStatusCode() >= 200 && $this->getStatusCode() <= 299) || $this->errorNumber == 0;
|
|
||||||
|
|
||||||
// Everything higher or equal 400 is not a success
|
|
||||||
if ($this->getReturnCode() >= 400) {
|
|
||||||
$this->isSuccess = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->isSuccess) {
|
|
||||||
Logger::notice('http error', ['url' => $this->url, 'code' => $this->getReturnCode(), 'error' => $this->error, 'callstack' => System::callstack(20)]);
|
|
||||||
Logger::debug('debug', ['info' => $this->getHeaders()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) {
|
|
||||||
$this->isTimeout = true;
|
|
||||||
} else {
|
|
||||||
$this->isTimeout = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getReturnCode()
|
|
||||||
{
|
|
||||||
return $this->getStatusCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getContentType()
|
|
||||||
{
|
|
||||||
$contentTypes = $this->getHeader('Content-Type') ?? [];
|
|
||||||
return array_pop($contentTypes) ?? '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function inHeader(string $field)
|
|
||||||
{
|
|
||||||
return $this->hasHeader($field);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getHeaderArray()
|
|
||||||
{
|
|
||||||
return $this->getHeaders();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function isSuccess()
|
|
||||||
{
|
|
||||||
return $this->isSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getUrl()
|
|
||||||
{
|
|
||||||
return $this->url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getRedirectUrl()
|
|
||||||
{
|
|
||||||
return $this->url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function isRedirectUrl()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getErrorNumber()
|
|
||||||
{
|
|
||||||
return $this->errorNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function getError()
|
|
||||||
{
|
|
||||||
return $this->error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
|
||||||
public function isTimeout()
|
|
||||||
{
|
|
||||||
return $this->isTimeout;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -28,12 +28,6 @@ use Friendica\Core\Config\IConfig;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Util\Network;
|
use Friendica\Util\Network;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
use GuzzleHttp\Client;
|
|
||||||
use GuzzleHttp\Exception\RequestException;
|
|
||||||
use GuzzleHttp\Exception\TransferException;
|
|
||||||
use Psr\Http\Message\RequestInterface;
|
|
||||||
use Psr\Http\Message\ResponseInterface;
|
|
||||||
use Psr\Http\Message\UriInterface;
|
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,8 +54,12 @@ class HTTPRequest implements IHTTPRequest
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* @param int $redirects The recursion counter for internal use - default 0
|
||||||
|
*
|
||||||
|
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public function get(string $url, bool $binary = false, array $opts = [])
|
public function get(string $url, bool $binary = false, array $opts = [], int &$redirects = 0)
|
||||||
{
|
{
|
||||||
$stamp1 = microtime(true);
|
$stamp1 = microtime(true);
|
||||||
|
|
||||||
|
@ -88,140 +86,124 @@ class HTTPRequest implements IHTTPRequest
|
||||||
return CurlResult::createErrorCurl($url);
|
return CurlResult::createErrorCurl($url);
|
||||||
}
|
}
|
||||||
|
|
||||||
$curlOptions = [];
|
$ch = @curl_init($url);
|
||||||
|
|
||||||
$curlOptions[CURLOPT_HEADER] = true;
|
if (($redirects > 8) || (!$ch)) {
|
||||||
|
return CurlResult::createErrorCurl($url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@curl_setopt($ch, CURLOPT_HEADER, true);
|
||||||
|
|
||||||
if (!empty($opts['cookiejar'])) {
|
if (!empty($opts['cookiejar'])) {
|
||||||
$curlOptions[CURLOPT_COOKIEJAR] = $opts["cookiejar"];
|
curl_setopt($ch, CURLOPT_COOKIEJAR, $opts["cookiejar"]);
|
||||||
$curlOptions[CURLOPT_COOKIEFILE] = $opts["cookiejar"];
|
curl_setopt($ch, CURLOPT_COOKIEFILE, $opts["cookiejar"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// These settings aren't needed. We're following the location already.
|
// These settings aren't needed. We're following the location already.
|
||||||
// $curlOptions[CURLOPT_FOLLOWLOCATION] =true;
|
// @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||||
// $curlOptions[CURLOPT_MAXREDIRS] = 5;
|
// @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
|
||||||
|
|
||||||
if (!empty($opts['accept_content'])) {
|
if (!empty($opts['accept_content'])) {
|
||||||
if (empty($curlOptions[CURLOPT_HTTPHEADER])) {
|
curl_setopt(
|
||||||
$curlOptions[CURLOPT_HTTPHEADER] = [];
|
$ch,
|
||||||
}
|
CURLOPT_HTTPHEADER,
|
||||||
array_push($curlOptions[CURLOPT_HTTPHEADER], 'Accept: ' . $opts['accept_content']);
|
['Accept: ' . $opts['accept_content']]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($opts['header'])) {
|
if (!empty($opts['header'])) {
|
||||||
if (empty($curlOptions[CURLOPT_HTTPHEADER])) {
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['header']);
|
||||||
$curlOptions[CURLOPT_HTTPHEADER] = [];
|
|
||||||
}
|
|
||||||
$curlOptions[CURLOPT_HTTPHEADER] = array_merge($opts['header'], $curlOptions[CURLOPT_HTTPHEADER]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$curlOptions[CURLOPT_RETURNTRANSFER] = true;
|
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
$curlOptions[CURLOPT_USERAGENT] = $this->getUserAgent();
|
@curl_setopt($ch, CURLOPT_USERAGENT, $this->getUserAgent());
|
||||||
|
|
||||||
$range = intval($this->config->get('system', 'curl_range_bytes', 0));
|
$range = intval($this->config->get('system', 'curl_range_bytes', 0));
|
||||||
|
|
||||||
if ($range > 0) {
|
if ($range > 0) {
|
||||||
$curlOptions[CURLOPT_RANGE] = '0-' . $range;
|
@curl_setopt($ch, CURLOPT_RANGE, '0-' . $range);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Without this setting it seems as if some webservers send compressed content
|
// Without this setting it seems as if some webservers send compressed content
|
||||||
// This seems to confuse curl so that it shows this uncompressed.
|
// This seems to confuse curl so that it shows this uncompressed.
|
||||||
/// @todo We could possibly set this value to "gzip" or something similar
|
/// @todo We could possibly set this value to "gzip" or something similar
|
||||||
$curlOptions[CURLOPT_ENCODING] = '';
|
curl_setopt($ch, CURLOPT_ENCODING, '');
|
||||||
|
|
||||||
if (!empty($opts['headers'])) {
|
if (!empty($opts['headers'])) {
|
||||||
if (empty($curlOptions[CURLOPT_HTTPHEADER])) {
|
@curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
|
||||||
$curlOptions[CURLOPT_HTTPHEADER] = [];
|
|
||||||
}
|
|
||||||
$curlOptions[CURLOPT_HTTPHEADER] = array_merge($opts['headers'], $curlOptions[CURLOPT_HTTPHEADER]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($opts['nobody'])) {
|
if (!empty($opts['nobody'])) {
|
||||||
$curlOptions[CURLOPT_NOBODY] = $opts['nobody'];
|
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$curlOptions[CURLOPT_CONNECTTIMEOUT] = 10;
|
@curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
||||||
|
|
||||||
if (!empty($opts['timeout'])) {
|
if (!empty($opts['timeout'])) {
|
||||||
$curlOptions[CURLOPT_TIMEOUT] = $opts['timeout'];
|
@curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
|
||||||
} else {
|
} else {
|
||||||
$curl_time = $this->config->get('system', 'curl_timeout', 60);
|
$curl_time = $this->config->get('system', 'curl_timeout', 60);
|
||||||
$curlOptions[CURLOPT_TIMEOUT] = intval($curl_time);
|
@curl_setopt($ch, CURLOPT_TIMEOUT, intval($curl_time));
|
||||||
}
|
}
|
||||||
|
|
||||||
// by default we will allow self-signed certs
|
// by default we will allow self-signed certs
|
||||||
// but you can override this
|
// but you can override this
|
||||||
|
|
||||||
$check_cert = $this->config->get('system', 'verifyssl');
|
$check_cert = $this->config->get('system', 'verifyssl');
|
||||||
$curlOptions[CURLOPT_SSL_VERIFYPEER] = ($check_cert) ? true : false;
|
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
|
||||||
|
|
||||||
if ($check_cert) {
|
if ($check_cert) {
|
||||||
$curlOptions[CURLOPT_SSL_VERIFYHOST] = 2;
|
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
$proxy = $this->config->get('system', 'proxy');
|
$proxy = $this->config->get('system', 'proxy');
|
||||||
|
|
||||||
if (!empty($proxy)) {
|
if (!empty($proxy)) {
|
||||||
$curlOptions[CURLOPT_HTTPPROXYTUNNEL] = 1;
|
@curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
|
||||||
$curlOptions[CURLOPT_PROXY] = $proxy;
|
@curl_setopt($ch, CURLOPT_PROXY, $proxy);
|
||||||
$proxyuser = $this->config->get('system', 'proxyuser');
|
$proxyuser = $this->config->get('system', 'proxyuser');
|
||||||
|
|
||||||
if (!empty($proxyuser)) {
|
if (!empty($proxyuser)) {
|
||||||
$curlOptions[CURLOPT_PROXYUSERPWD] = $proxyuser;
|
@curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyuser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->config->get('system', 'ipv4_resolve', false)) {
|
if ($this->config->get('system', 'ipv4_resolve', false)) {
|
||||||
$curlOptions[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
|
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($binary) {
|
if ($binary) {
|
||||||
$curlOptions[CURLOPT_BINARYTRANSFER] = 1;
|
@curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$logger = $this->logger;
|
// don't let curl abort the entire application
|
||||||
|
// if it throws any errors.
|
||||||
|
|
||||||
$onRedirect = function(
|
$s = @curl_exec($ch);
|
||||||
RequestInterface $request,
|
$curl_info = @curl_getinfo($ch);
|
||||||
ResponseInterface $response,
|
|
||||||
UriInterface $uri
|
|
||||||
) use ($logger) {
|
|
||||||
$logger->notice('Curl redirect.', ['url' => $request->getUri(), 'to' => $uri]);
|
|
||||||
};
|
|
||||||
|
|
||||||
$onHeaders = function (ResponseInterface $response) use ($opts) {
|
// Special treatment for HTTP Code 416
|
||||||
if (!empty($opts['content_length']) &&
|
// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416
|
||||||
$response->getHeaderLine('Content-Length') > $opts['content_length']) {
|
if (($curl_info['http_code'] == 416) && ($range > 0)) {
|
||||||
throw new TransferException('The file is too big!');
|
@curl_setopt($ch, CURLOPT_RANGE, '');
|
||||||
|
$s = @curl_exec($ch);
|
||||||
|
$curl_info = @curl_getinfo($ch);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
$client = new Client([
|
$curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
|
||||||
'allow_redirect' => [
|
|
||||||
'max' => 8,
|
|
||||||
'on_redirect' => $onRedirect,
|
|
||||||
'track_redirect' => true,
|
|
||||||
'strict' => true,
|
|
||||||
'referer' => true,
|
|
||||||
],
|
|
||||||
'on_headers' => $onHeaders,
|
|
||||||
'sink' => tempnam(get_temppath(), 'guzzle'),
|
|
||||||
'curl' => $curlOptions
|
|
||||||
]);
|
|
||||||
|
|
||||||
try {
|
if (!Network::isRedirectBlocked($url) && $curlResponse->isRedirectUrl()) {
|
||||||
$response = $client->get($url);
|
$redirects++;
|
||||||
return new GuzzleResponse($response, $url);
|
$this->logger->notice('Curl redirect.', ['url' => $url, 'to' => $curlResponse->getRedirectUrl()]);
|
||||||
} catch (TransferException $exception) {
|
@curl_close($ch);
|
||||||
if ($exception instanceof RequestException &&
|
return $this->get($curlResponse->getRedirectUrl(), $binary, $opts, $redirects);
|
||||||
$exception->hasResponse()) {
|
|
||||||
return new GuzzleResponse($exception->getResponse(), $url, $exception->getCode(), '');
|
|
||||||
} else {
|
|
||||||
return new CurlResult($url, '', ['http_code' => $exception->getCode()], $exception->getCode(), '');
|
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
|
@curl_close($ch);
|
||||||
|
|
||||||
$this->profiler->saveTimestamp($stamp1, 'network');
|
$this->profiler->saveTimestamp($stamp1, 'network');
|
||||||
}
|
|
||||||
|
return $curlResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -476,7 +458,8 @@ class HTTPRequest implements IHTTPRequest
|
||||||
'timeout' => $timeout,
|
'timeout' => $timeout,
|
||||||
'accept_content' => $accept_content,
|
'accept_content' => $accept_content,
|
||||||
'cookiejar' => $cookiejar
|
'cookiejar' => $cookiejar
|
||||||
]
|
],
|
||||||
|
$redirects
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ interface IHTTPRequest
|
||||||
* @param string $accept_content supply Accept: header with 'accept_content' as the value
|
* @param string $accept_content supply Accept: header with 'accept_content' as the value
|
||||||
* @param string $cookiejar Path to cookie jar file
|
* @param string $cookiejar Path to cookie jar file
|
||||||
*
|
*
|
||||||
* @return IHTTPResult With all relevant information, 'body' contains the actual fetched content.
|
* @return CurlResult With all relevant information, 'body' contains the actual fetched content.
|
||||||
*/
|
*/
|
||||||
public function fetchFull(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '');
|
public function fetchFull(string $url, bool $binary = false, int $timeout = 0, string $accept_content = '', string $cookiejar = '');
|
||||||
|
|
||||||
|
@ -75,9 +75,8 @@ interface IHTTPRequest
|
||||||
* 'nobody' => only return the header
|
* 'nobody' => only return the header
|
||||||
* 'cookiejar' => path to cookie jar file
|
* 'cookiejar' => path to cookie jar file
|
||||||
* 'header' => header array
|
* 'header' => header array
|
||||||
* 'content_length' => int maximum File content length
|
|
||||||
*
|
*
|
||||||
* @return IHTTPResult
|
* @return CurlResult
|
||||||
*/
|
*/
|
||||||
public function get(string $url, bool $binary = false, array $opts = []);
|
public function get(string $url, bool $binary = false, array $opts = []);
|
||||||
|
|
||||||
|
@ -89,7 +88,7 @@ interface IHTTPRequest
|
||||||
* @param array $headers HTTP headers
|
* @param array $headers HTTP headers
|
||||||
* @param int $timeout The timeout in seconds, default system config value or 60 seconds
|
* @param int $timeout The timeout in seconds, default system config value or 60 seconds
|
||||||
*
|
*
|
||||||
* @return IHTTPResult The content
|
* @return CurlResult The content
|
||||||
*/
|
*/
|
||||||
public function post(string $url, $params, array $headers = [], int $timeout = 0);
|
public function post(string $url, $params, array $headers = [], int $timeout = 0);
|
||||||
|
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Friendica\Network;
|
|
||||||
|
|
||||||
use Psr\Http\Message\MessageInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Temporary class to map Friendica used variables based on PSR-7 HTTPResponse
|
|
||||||
*/
|
|
||||||
interface IHTTPResult
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Gets the Return Code
|
|
||||||
*
|
|
||||||
* @return string The Return Code
|
|
||||||
*/
|
|
||||||
public function getReturnCode();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the Content Type
|
|
||||||
*
|
|
||||||
* @return string the Content Type
|
|
||||||
*/
|
|
||||||
public function getContentType();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the headers
|
|
||||||
* @see MessageInterface::getHeader()
|
|
||||||
*
|
|
||||||
* @param string $header optional header field. Return all fields if empty
|
|
||||||
*
|
|
||||||
* @return string[] the headers or the specified content of the header variable
|
|
||||||
*/
|
|
||||||
public function getHeader($header);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns all headers
|
|
||||||
* @see MessageInterface::getHeaders()
|
|
||||||
*
|
|
||||||
* @return string[][]
|
|
||||||
*/
|
|
||||||
public function getHeaders();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a specified header exists
|
|
||||||
* @see MessageInterface::hasHeader()
|
|
||||||
*
|
|
||||||
* @param string $field header field
|
|
||||||
*
|
|
||||||
* @return boolean "true" if header exists
|
|
||||||
*/
|
|
||||||
public function inHeader(string $field);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the headers as an associated array
|
|
||||||
* @see MessageInterface::getHeaders()
|
|
||||||
* @deprecated
|
|
||||||
*
|
|
||||||
* @return string[][] associated header array
|
|
||||||
*/
|
|
||||||
public function getHeaderArray();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isSuccess();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getRedirectUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see MessageInterface::getBody()
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getBody();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function isRedirectUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return integer
|
|
||||||
*/
|
|
||||||
public function getErrorNumber();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getError();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function isTimeout();
|
|
||||||
}
|
|
|
@ -423,11 +423,16 @@ class Probe
|
||||||
*/
|
*/
|
||||||
private static function getHideStatus($url)
|
private static function getHideStatus($url)
|
||||||
{
|
{
|
||||||
$curlResult = DI::httpRequest()->get($url, false, ['content_length' => 1000000]);
|
$curlResult = DI::httpRequest()->get($url);
|
||||||
if (!$curlResult->isSuccess()) {
|
if (!$curlResult->isSuccess()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the file is too large then exit
|
||||||
|
if (($curlResult->getInfo()['download_content_length'] ?? 0) > 1000000) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// If it isn't a HTML file then exit
|
// If it isn't a HTML file then exit
|
||||||
if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) {
|
if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1358,7 +1358,7 @@ class DFRN
|
||||||
return -9; // timed out
|
return -9; // timed out
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($curl_stat == 503) && $postResult->inHeader('retry-after')) {
|
if (($curl_stat == 503) && stristr($postResult->getHeader(), 'retry-after')) {
|
||||||
return -10;
|
return -10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1453,7 +1453,7 @@ class DFRN
|
||||||
return -9; // timed out
|
return -9; // timed out
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($curl_stat == 503) && $postResult->inHeader('retry-after')) {
|
if (($curl_stat == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
|
||||||
return -10;
|
return -10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -746,8 +746,7 @@ class OStatus
|
||||||
|
|
||||||
$xml = '';
|
$xml = '';
|
||||||
|
|
||||||
if ($curlResult->inHeader('Content-Type') &&
|
if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) {
|
||||||
in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) {
|
|
||||||
$xml = $curlResult->getBody();
|
$xml = $curlResult->getBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,8 +939,7 @@ class OStatus
|
||||||
|
|
||||||
$xml = '';
|
$xml = '';
|
||||||
|
|
||||||
if ($curlResult->inHeader('Content-Type') &&
|
if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) {
|
||||||
in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) {
|
|
||||||
Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG);
|
Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG);
|
||||||
$xml = $curlResult->getBody();
|
$xml = $curlResult->getBody();
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@ class Salmon
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($return_code == 503) && $postResult->inHeader('retry-after')) {
|
if (($return_code == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,21 +77,21 @@ class Images
|
||||||
*
|
*
|
||||||
* @param string $image_data Image data
|
* @param string $image_data Image data
|
||||||
* @param string $filename File name (for guessing the type via the extension)
|
* @param string $filename File name (for guessing the type via the extension)
|
||||||
* @param string $mimeType possible mime type
|
* @param string $mime default mime type
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function getMimeTypeByData(string $image_data, string $filename = '', string $mimeType = '')
|
public static function getMimeTypeByData(string $image_data, string $filename = '', string $mime = '')
|
||||||
{
|
{
|
||||||
if (substr($mimeType, 0, 6) == 'image/') {
|
if (substr($mime, 0, 6) == 'image/') {
|
||||||
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mimeType]);
|
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]);
|
||||||
return $mimeType;
|
return $mime;
|
||||||
}
|
}
|
||||||
|
|
||||||
$image = @getimagesizefromstring($image_data);
|
$image = @getimagesizefromstring($image_data);
|
||||||
if (!empty($image['mime'])) {
|
if (!empty($image['mime'])) {
|
||||||
Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mimeType, 'mime' => $image['mime']]);
|
Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mime, 'mime' => $image['mime']]);
|
||||||
return $image['mime'];
|
return $image['mime'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,16 +160,22 @@ class ParseUrl
|
||||||
return $siteinfo;
|
return $siteinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
$curlResult = DI::httpRequest()->get($url, false, ['content_length' => 1000000]);
|
$curlResult = DI::httpRequest()->get($url);
|
||||||
if (!$curlResult->isSuccess()) {
|
if (!$curlResult->isSuccess()) {
|
||||||
return $siteinfo;
|
return $siteinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the file is too large then exit
|
||||||
|
if (($curlResult->getInfo()['download_content_length'] ?? 0) > 1000000) {
|
||||||
|
return $siteinfo;
|
||||||
|
}
|
||||||
|
|
||||||
// If it isn't a HTML file then exit
|
// If it isn't a HTML file then exit
|
||||||
if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) {
|
if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) {
|
||||||
return $siteinfo;
|
return $siteinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$header = $curlResult->getHeader();
|
||||||
$body = $curlResult->getBody();
|
$body = $curlResult->getBody();
|
||||||
|
|
||||||
if ($do_oembed) {
|
if ($do_oembed) {
|
||||||
|
@ -198,7 +204,7 @@ class ParseUrl
|
||||||
$charset = '';
|
$charset = '';
|
||||||
// Look for a charset, first in headers
|
// Look for a charset, first in headers
|
||||||
// Expected form: Content-Type: text/html; charset=ISO-8859-4
|
// Expected form: Content-Type: text/html; charset=ISO-8859-4
|
||||||
if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $curlResult->getContentType(), $matches)) {
|
if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $header, $matches)) {
|
||||||
$charset = trim(trim(trim(array_pop($matches)), ';,'));
|
$charset = trim(trim(trim(array_pop($matches)), ';,'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
return [
|
|
||||||
'http/2 200' => [''],
|
|
||||||
'date' => ['Thu, 11 Oct 2018 18:43:54 GMT'],
|
|
||||||
'content-type' => ['text/html; charset=utf-8'],
|
|
||||||
'vary' => ['Accept-Encoding'],
|
|
||||||
'server' => ['Mastodon'],
|
|
||||||
'x-frame-options' => ['DENY', 'SAMEORIGIN'],
|
|
||||||
'x-content-type-options' => ['nosniff'],
|
|
||||||
'x-xss-protection' => ['1; mode=block'],
|
|
||||||
'etag' => ['W/"706e6c48957e1d46ecf9d7597a7880af"'],
|
|
||||||
'cache-control' => ['max-age=0, private, must-revalidate'],
|
|
||||||
'set-cookie' => ['_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly'],
|
|
||||||
'x-request-id' => ['a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784'],
|
|
||||||
'x-runtime' => ['0.049566'],
|
|
||||||
'strict-transport-security' => ['max-age=31536000; includeSubDomains; preload'],
|
|
||||||
'referrer-policy' => ['same-origin'],
|
|
||||||
'content-security-policy' => ["frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de"],
|
|
||||||
];
|
|
|
@ -1,21 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
return [
|
|
||||||
'http/2 301' => [''],
|
|
||||||
'date' => ['Thu, 11 Oct 2018 18:43:54 GMT'],
|
|
||||||
'content-type' => ['text/html; charset=utf-8'],
|
|
||||||
'vary' => ['Accept-Encoding'],
|
|
||||||
'server' => ['Mastodon'],
|
|
||||||
'location' => ['https://test.other/some/'],
|
|
||||||
'x-frame-options' => ['DENY', 'SAMEORIGIN'],
|
|
||||||
'x-content-type-options' => ['nosniff'],
|
|
||||||
'x-xss-protection' => ['1; mode=block'],
|
|
||||||
'etag' => ['W/"706e6c48957e1d46ecf9d7597a7880af"'],
|
|
||||||
'cache-control' => ['max-age=0, private, must-revalidate'],
|
|
||||||
'set-cookie' => ['_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly'],
|
|
||||||
'x-request-id' => ['a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784'],
|
|
||||||
'x-runtime' => ['0.049566'],
|
|
||||||
'strict-transport-security' => ['max-age=31536000; includeSubDomains; preload'],
|
|
||||||
'referrer-policy' => ['same-origin'],
|
|
||||||
'content-security-policy' => ["frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de"],
|
|
||||||
];
|
|
|
@ -25,7 +25,7 @@ namespace Friendica\Core;
|
||||||
use Dice\Dice;
|
use Dice\Dice;
|
||||||
use Friendica\Core\Config\Cache;
|
use Friendica\Core\Config\Cache;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Network\IHTTPResult;
|
use Friendica\Network\CurlResult;
|
||||||
use Friendica\Network\IHTTPRequest;
|
use Friendica\Network\IHTTPRequest;
|
||||||
use Friendica\Test\MockedTest;
|
use Friendica\Test\MockedTest;
|
||||||
use Friendica\Test\Util\VFSTrait;
|
use Friendica\Test\Util\VFSTrait;
|
||||||
|
@ -297,14 +297,14 @@ class InstallerTest extends MockedTest
|
||||||
$this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
|
$this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
|
||||||
|
|
||||||
// Mocking the CURL Response
|
// Mocking the CURL Response
|
||||||
$IHTTPResult = \Mockery::mock(IHTTPResult::class);
|
$curlResult = \Mockery::mock(CurlResult::class);
|
||||||
$IHTTPResult
|
$curlResult
|
||||||
->shouldReceive('getReturnCode')
|
->shouldReceive('getReturnCode')
|
||||||
->andReturn('404');
|
->andReturn('404');
|
||||||
$IHTTPResult
|
$curlResult
|
||||||
->shouldReceive('getRedirectUrl')
|
->shouldReceive('getRedirectUrl')
|
||||||
->andReturn('');
|
->andReturn('');
|
||||||
$IHTTPResult
|
$curlResult
|
||||||
->shouldReceive('getError')
|
->shouldReceive('getError')
|
||||||
->andReturn('test Error');
|
->andReturn('test Error');
|
||||||
|
|
||||||
|
@ -313,11 +313,11 @@ class InstallerTest extends MockedTest
|
||||||
$networkMock
|
$networkMock
|
||||||
->shouldReceive('fetchFull')
|
->shouldReceive('fetchFull')
|
||||||
->with('https://test/install/testrewrite')
|
->with('https://test/install/testrewrite')
|
||||||
->andReturn($IHTTPResult);
|
->andReturn($curlResult);
|
||||||
$networkMock
|
$networkMock
|
||||||
->shouldReceive('fetchFull')
|
->shouldReceive('fetchFull')
|
||||||
->with('http://test/install/testrewrite')
|
->with('http://test/install/testrewrite')
|
||||||
->andReturn($IHTTPResult);
|
->andReturn($curlResult);
|
||||||
|
|
||||||
$this->dice->shouldReceive('create')
|
$this->dice->shouldReceive('create')
|
||||||
->with(IHTTPRequest::class)
|
->with(IHTTPRequest::class)
|
||||||
|
@ -344,14 +344,14 @@ class InstallerTest extends MockedTest
|
||||||
$this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
|
$this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
|
||||||
|
|
||||||
// Mocking the failed CURL Response
|
// Mocking the failed CURL Response
|
||||||
$IHTTPResultF = \Mockery::mock(IHTTPResult::class);
|
$curlResultF = \Mockery::mock(CurlResult::class);
|
||||||
$IHTTPResultF
|
$curlResultF
|
||||||
->shouldReceive('getReturnCode')
|
->shouldReceive('getReturnCode')
|
||||||
->andReturn('404');
|
->andReturn('404');
|
||||||
|
|
||||||
// Mocking the working CURL Response
|
// Mocking the working CURL Response
|
||||||
$IHTTPResultW = \Mockery::mock(IHTTPResult::class);
|
$curlResultW = \Mockery::mock(CurlResult::class);
|
||||||
$IHTTPResultW
|
$curlResultW
|
||||||
->shouldReceive('getReturnCode')
|
->shouldReceive('getReturnCode')
|
||||||
->andReturn('204');
|
->andReturn('204');
|
||||||
|
|
||||||
|
@ -360,11 +360,11 @@ class InstallerTest extends MockedTest
|
||||||
$networkMock
|
$networkMock
|
||||||
->shouldReceive('fetchFull')
|
->shouldReceive('fetchFull')
|
||||||
->with('https://test/install/testrewrite')
|
->with('https://test/install/testrewrite')
|
||||||
->andReturn($IHTTPResultF);
|
->andReturn($curlResultF);
|
||||||
$networkMock
|
$networkMock
|
||||||
->shouldReceive('fetchFull')
|
->shouldReceive('fetchFull')
|
||||||
->with('http://test/install/testrewrite')
|
->with('http://test/install/testrewrite')
|
||||||
->andReturn($IHTTPResultW);
|
->andReturn($curlResultW);
|
||||||
|
|
||||||
$this->dice->shouldReceive('create')
|
$this->dice->shouldReceive('create')
|
||||||
->with(IHTTPRequest::class)
|
->with(IHTTPRequest::class)
|
||||||
|
|
|
@ -53,7 +53,6 @@ class CurlResultTest extends TestCase
|
||||||
public function testNormal()
|
public function testNormal()
|
||||||
{
|
{
|
||||||
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
||||||
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
|
|
||||||
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,7 +65,7 @@ class CurlResultTest extends TestCase
|
||||||
$this->assertTrue($curlResult->isSuccess());
|
$this->assertTrue($curlResult->isSuccess());
|
||||||
$this->assertFalse($curlResult->isTimeout());
|
$this->assertFalse($curlResult->isTimeout());
|
||||||
$this->assertFalse($curlResult->isRedirectUrl());
|
$this->assertFalse($curlResult->isRedirectUrl());
|
||||||
$this->assertSame($headerArray, $curlResult->getHeaders());
|
$this->assertSame($header, $curlResult->getHeader());
|
||||||
$this->assertSame($body, $curlResult->getBody());
|
$this->assertSame($body, $curlResult->getBody());
|
||||||
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
||||||
$this->assertSame('https://test.local', $curlResult->getUrl());
|
$this->assertSame('https://test.local', $curlResult->getUrl());
|
||||||
|
@ -81,7 +80,6 @@ class CurlResultTest extends TestCase
|
||||||
public function testRedirect()
|
public function testRedirect()
|
||||||
{
|
{
|
||||||
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
||||||
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
|
|
||||||
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,7 +93,7 @@ class CurlResultTest extends TestCase
|
||||||
$this->assertTrue($curlResult->isSuccess());
|
$this->assertTrue($curlResult->isSuccess());
|
||||||
$this->assertFalse($curlResult->isTimeout());
|
$this->assertFalse($curlResult->isTimeout());
|
||||||
$this->assertTrue($curlResult->isRedirectUrl());
|
$this->assertTrue($curlResult->isRedirectUrl());
|
||||||
$this->assertSame($headerArray, $curlResult->getHeaders());
|
$this->assertSame($header, $curlResult->getHeader());
|
||||||
$this->assertSame($body, $curlResult->getBody());
|
$this->assertSame($body, $curlResult->getBody());
|
||||||
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
||||||
$this->assertSame('https://test.local/test/it', $curlResult->getUrl());
|
$this->assertSame('https://test.local/test/it', $curlResult->getUrl());
|
||||||
|
@ -108,7 +106,6 @@ class CurlResultTest extends TestCase
|
||||||
public function testTimeout()
|
public function testTimeout()
|
||||||
{
|
{
|
||||||
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
|
||||||
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
|
|
||||||
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,7 +119,7 @@ class CurlResultTest extends TestCase
|
||||||
$this->assertFalse($curlResult->isSuccess());
|
$this->assertFalse($curlResult->isSuccess());
|
||||||
$this->assertTrue($curlResult->isTimeout());
|
$this->assertTrue($curlResult->isTimeout());
|
||||||
$this->assertFalse($curlResult->isRedirectUrl());
|
$this->assertFalse($curlResult->isRedirectUrl());
|
||||||
$this->assertSame($headerArray, $curlResult->getHeaders());
|
$this->assertSame($header, $curlResult->getHeader());
|
||||||
$this->assertSame($body, $curlResult->getBody());
|
$this->assertSame($body, $curlResult->getBody());
|
||||||
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
||||||
$this->assertSame('https://test.local/test/it', $curlResult->getRedirectUrl());
|
$this->assertSame('https://test.local/test/it', $curlResult->getRedirectUrl());
|
||||||
|
@ -137,7 +134,6 @@ class CurlResultTest extends TestCase
|
||||||
public function testRedirectHeader()
|
public function testRedirectHeader()
|
||||||
{
|
{
|
||||||
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.redirect');
|
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.redirect');
|
||||||
$headerArray = include(__DIR__ . '/../../datasets/curl/about.redirect.php');
|
|
||||||
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,7 +146,7 @@ class CurlResultTest extends TestCase
|
||||||
$this->assertTrue($curlResult->isSuccess());
|
$this->assertTrue($curlResult->isSuccess());
|
||||||
$this->assertFalse($curlResult->isTimeout());
|
$this->assertFalse($curlResult->isTimeout());
|
||||||
$this->assertTrue($curlResult->isRedirectUrl());
|
$this->assertTrue($curlResult->isRedirectUrl());
|
||||||
$this->assertSame($headerArray, $curlResult->getHeaders());
|
$this->assertSame($header, $curlResult->getHeader());
|
||||||
$this->assertSame($body, $curlResult->getBody());
|
$this->assertSame($body, $curlResult->getBody());
|
||||||
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
|
||||||
$this->assertSame('https://test.local/test/it?key=value', $curlResult->getUrl());
|
$this->assertSame('https://test.local/test/it?key=value', $curlResult->getUrl());
|
||||||
|
@ -208,7 +204,7 @@ class CurlResultTest extends TestCase
|
||||||
'url' => 'https://test.local'
|
'url' => 'https://test.local'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertNotEmpty($curlResult->getHeaders());
|
$this->assertNotEmpty($curlResult->getHeader());
|
||||||
$this->assertEmpty($curlResult->getHeader('wrongHeader'));
|
$this->assertEmpty($curlResult->getHeader('wrongHeader'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue