From e66d632ba356d8e42e48de5299afbb942fd04104 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 12 Jan 2021 14:14:14 +0800 Subject: [PATCH] update curl; require https://github.com/ledccn/IYUUBittorrentClient --- app/AutoReseed.php | 6 +- app/Client/AbstractClient.php | 66 -- app/Client/qBittorrent/qBittorrent.php | 351 -------- .../transmission/TransmissionRPCException.php | 48 -- app/Client/transmission/transmission.php | 763 ------------------ composer.json | 3 +- composer.lock | 75 +- vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_static.php | 5 + vendor/composer/installed.json | 65 +- vendor/curl/curl/.gitlab-ci.yml | 34 +- vendor/curl/curl/src/Curl/Curl.php | 151 ++-- 12 files changed, 227 insertions(+), 1341 deletions(-) delete mode 100644 app/Client/AbstractClient.php delete mode 100644 app/Client/qBittorrent/qBittorrent.php delete mode 100644 app/Client/transmission/TransmissionRPCException.php delete mode 100644 app/Client/transmission/transmission.php diff --git a/app/AutoReseed.php b/app/AutoReseed.php index 00820de..897aa51 100644 --- a/app/AutoReseed.php +++ b/app/AutoReseed.php @@ -13,7 +13,7 @@ use IYUU\Library\Table; class AutoReseed { // 版本号 - const VER = '1.10.19'; + const VER = '1.10.20'; // RPC连接 private static $links = []; // 客户端配置 @@ -298,7 +298,7 @@ class AutoReseed continue; } echo "正在从下载器 clients_".$k." 获取种子哈希……".PHP_EOL; - $hashArray = self::$links[$k]['rpc']->getList(); + $hashArray = self::$links[$k]['rpc']->all(); if (empty($hashArray)) { continue; } @@ -618,7 +618,7 @@ class AutoReseed } echo "正在从下载器 clients_".$k." 获取种子哈希……".PHP_EOL; $move = []; // 客户端做种列表 传址 - $hashArray = self::$links[$k]['rpc']->getList($move); + $hashArray = self::$links[$k]['rpc']->all($move); if (empty($hashArray)) { // 失败 continue; diff --git a/app/Client/AbstractClient.php b/app/Client/AbstractClient.php deleted file mode 100644 index 5f8d761..0000000 --- a/app/Client/AbstractClient.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Date: 2020-2-14 - * Time: 21:31:49 - */ - -namespace IYUU\Client; - -abstract class AbstractClient -{ - /** - * 公共方法:创建客户端实例 - */ - public static function create($config = array()) - { - $type = $config['type']; - $host = $config['host']; - $username = $config['username']; - $password = $config['password']; - $file = __DIR__ . DIRECTORY_SEPARATOR . $type . DIRECTORY_SEPARATOR . $type .'.php'; - if (!is_file($file)) { - die($file.' 文件不存在'); - } - $className = "\IYUU\Client\\" . $type . "\\" . $type; - if (class_exists($className)) { - echo $type." 客户端正在实例化!".PHP_EOL; - return new $className($host, $username, $password); - } else { - die($className.' 客户端不存在'); - } - } - - /** - * 查询Bittorrent客户端状态 - * - * @return string - */ - abstract public function status(); - - /** - * 获取种子列表 - * @return array( - 'hash' => string json, - 'sha1' => string, - 'hashString '=> array - ) - */ - abstract public function getList(&$move = array()); - - /** - * 添加种子连接 - */ - abstract public function add($torrent_url, $save_path = '', $extra_options = array()); - - /** - * 添加种子原数据 - */ - abstract public function add_metainfo($torrent_url, $save_path = '', $extra_options = array()); - - /** - * 删除种子 - */ - abstract public function delete($hash, $deleteFiles = false); -} diff --git a/app/Client/qBittorrent/qBittorrent.php b/app/Client/qBittorrent/qBittorrent.php deleted file mode 100644 index 2c83f6e..0000000 --- a/app/Client/qBittorrent/qBittorrent.php +++ /dev/null @@ -1,351 +0,0 @@ - [ - '1' => '/login', - '2' => '/api/v2/auth/login' - ], - 'app_version' => [ - '1' => '/version/qbittorrent', - '2' => '/api/v2/app/version' - ], - 'api_version' => [ - '1' => '/version/api', - '2' => '/api/v2/app/webapiVersion' - ], - 'build_info' => [ - '1' => null, - '2' => '/api/v2/app/buildInfo' - ], - 'preferences' => [ - '1' => null, - '2' => '/api/v2/app/preferences' - ], - 'setPreferences' => [ - '1' => null, - '2' => '/api/v2/app/setPreferences' - ], - 'defaultSavePath' => [ - '1' => null, - '2' => '/api/v2/app/defaultSavePath' - ], - 'torrent_list' => [ - '1' => null, - '2' => '/api/v2/torrents/info' - ], - 'torrent_add' => [ - '1' => null, - '2' => '/api/v2/torrents/add' - ], - 'torrent_delete' => [ - '1' => null, - '2' => '/api/v2/torrents/delete' - ], - 'torrent_pause' => [ - '1' => null, - '2' => '/api/v2/torrents/pause' - ], - 'torrent_resume' => [ - '1' => null, - '2' => '/api/v2/torrents/resume' - ], - 'set_torrent_location' => [ - '1' => null, - '2' => '/api/v2/torrents/setLocation' - ], - 'maindata' => [ - '1' => null, - '2' => '/api/v2/sync/maindata' - ] - ]; - - public function __construct($url='', $username='', $password='', $api_version = 2, $debug = false) - { - $this->debug = $debug; - $this->url = rtrim($url, '/'); - $this->username = $username; - $this->password = $password; - $this->api_version = $api_version; - $this->curl = new Curl(); - $this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书 - $this->curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); // 不检查证书 - $this->curl->setOpt(CURLOPT_CONNECTTIMEOUT, 60); // 超时 - $this->curl->setOpt(CURLOPT_TIMEOUT, 600); // 超时 - // Authenticate and get cookie, else throw exception - if (!$this->authenticate()) { - throw new \Exception("qBittorrent Unable to authenticate with Web Api."); - } - } - - public function appVersion() - { - return $this->getData('app_version'); - } - - public function apiVersion() - { - return $this->getData('api_version'); - } - - public function buildInfo() - { - return $this->getData('build_info'); - } - - public function preferences($data = null) - { - if (!empty($data)) { - return $this->postData('setPreferences', ['json' => json_encode($data)]); - } - - return $this->getData('preferences'); - } - - public function torrentList() - { - return $this->getData('torrent_list'); - } - /** - * @param array $extra_options - array( - 'urls' => '', - 'savepath' => '', - 'cookie' => '', - 'category' => '', - 'skip_checking' => true, - 'paused' => true, - 'root_folder' => true, - ) - * @return array - */ - public function add($torrent_url, $save_path = '', $extra_options = array()) - { - if (!empty($save_path)) { - $extra_options['savepath'] = $save_path; - } - $extra_options['urls'] = $torrent_url; - #$extra_options['skip_checking'] = 'true'; //跳校验 - // 关键 上传文件流 multipart/form-data【严格按照api文档编写】 - $post_data = $this->buildUrls($extra_options); - #p($post_data); - // 设置请求头 - $this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter); - $this->curl->setHeader('Content-Length', strlen($post_data)); - return $this->postData('torrent_add', $post_data); - } - - public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array()) - { - if (!empty($save_path)) { - $extra_options['savepath'] = $save_path; - } - $extra_options['torrents'] = $torrent_metainfo; - #$extra_options['skip_checking'] = 'true'; //跳校验 - // 关键 上传文件流 multipart/form-data【严格按照api文档编写】 - $post_data = $this->buildData($extra_options); - // 设置请求头 - $this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter); - $this->curl->setHeader('Content-Length', strlen($post_data)); - return $this->postData('torrent_add', $post_data); - } - - public function torrentDeleteAll($deleteFiles = false) - { - $torrents = json_decode($this->torrentList()); - $response = ''; - foreach ($torrents as $torrent) { - $response .= $this->delete($torrent->hash, $deleteFiles); - } - - return $response; - } - - public function torrentPause($hash) - { - return $this->postData('torrent_pause', ['hashes' => $hash]); - } - - public function torrentResume($hash) - { - return $this->postData('torrent_resume', ['hashes' => $hash]); - } - - public function setTorrentLocation($hash, $location) - { - return $this->postData('set_torrent_location', ['hashes' => $hash, 'location' => $location]); - } - - private function getData($endpoint) - { - $this->curl->get($this->url . $this->endpoints[$endpoint][$this->api_version]); - - if ($this->debug) { - var_dump($this->curl->request_headers); - var_dump($this->curl->response_headers); - } - - if ($this->curl->error) { - return $this->errorMessage(); - } - - return $this->curl->response; - } - - private function postData($endpoint, $data) - { - $this->curl->post($this->url . $this->endpoints[$endpoint][$this->api_version], $data); - - if ($this->debug) { - var_dump($this->curl->request_headers); - var_dump($this->curl->response_headers); - } - - if ($this->curl->error) { - return $this->errorMessage(); - } - - return $this->curl->response; - } - - private function authenticate() - { - $this->curl->post($this->url . $this->endpoints['login'][$this->api_version], [ - 'username' => $this->username, - 'password' => $this->password - ]); - - if ($this->debug) { - var_dump($this->curl->request_headers); - var_dump($this->curl->response_headers); - } - - // Find authentication cookie and set in curl connection - foreach ($this->curl->response_headers as $header) { - if (preg_match('/SID=(\S[^;]+)/', $header, $matches)) { - $qb415 = '; QB_'.$matches[0]; // 兼容qBittorrent v4.1.5[小钢炮等] - $this->curl->setHeader('Cookie', $matches[0].$qb415); - return true; - } - }; - - return false; - } - - private function errorMessage() - { - return 'Curl Error Code: ' . $this->curl->error_code . ' (' . $this->curl->response . ')'; - } - /** - * 拼接种子urls multipart/form-data - * https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent - */ - private function buildUrls($param) - { - $this->delimiter = uniqid(); - $eol = "\r\n"; - $data = ''; - // 拼接文件流 - foreach ($param as $name => $content) { - $data .= "--" . $this->delimiter . $eol; - $data .= 'Content-Disposition: form-data; name="' .$name. '"' . $eol . $eol; - $data .= $content . $eol; - } - $data .= "--" . $this->delimiter . "--" . $eol; - return $data; - } - /** - * 拼接种子上传文件流 multipart/form-data - * https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent - */ - private function buildData($param) - { - $this->delimiter = uniqid(); - $eol = "\r\n"; - $data = ''; - // 拼接文件流 - $data .= "--" . $this->delimiter . $eol; - $data .= 'Content-Disposition: form-data; name="' .$param['name']. '"; filename="'.$param['filename'].'"' . $eol; - $data .= 'Content-Type: application/x-bittorrent' . $eol . $eol; - $data .= $param['torrents'] . $eol; - unset($param['name']); - unset($param['filename']); - unset($param['torrents']); - if (!empty($param)) { - foreach ($param as $name => $content) { - $data .= "--" . $this->delimiter . $eol; - $data .= 'Content-Disposition: form-data; name="' . $name . '"' . $eol . $eol; - $data .= $content . $eol; - } - } - $data .= "--" . $this->delimiter . "--" . $eol; - return $data; - } - - /** - * 抽象方法,子类实现 - */ - public function status() - { - return $this->appVersion(); - } - - /** - * 抽象方法,子类实现 - */ - public function getList(&$move = array()) - { - $result = $this->getData('torrent_list'); - $res = json_decode($result, true); - if (empty($res)) { - echo "获取种子列表失败,可能qBittorrent暂时无响应,请稍后重试!".PHP_EOL; - return array(); - } - // 过滤,只保留正常做种 - $res = array_filter($res, function ($v) { - if (isset($v['state']) && in_array($v['state'], array('uploading','stalledUP','pausedUP','queuedUP','checkingUP','forcedUP'))) { - return true; - } - return false; - }, ARRAY_FILTER_USE_BOTH); - - if (empty($res)) { - echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL; - return array(); - } - // 提取数组:hashString - $info_hash = array_column($res, 'hash'); - // 升序排序 - sort($info_hash); - $json = json_encode($info_hash, JSON_UNESCAPED_UNICODE); - // 去重 应该从文件读入,防止重复提交 - $sha1 = sha1($json); - // 组装返回数据 - $hashArray['hash'] = $json; - $hashArray['sha1'] = $sha1; - // 变换数组:hashString为键 - $hashArray['hashString'] = array_column($res, "save_path", 'hash'); - return $hashArray; - } - - /** - * 抽象方法,子类实现 - */ - public function delete($hash='', $deleteFiles = false) - { - return $this->postData('torrent_delete', ['hashes' => $hash, 'deleteFiles' => $deleteFiles ? 'true':'false']); - } -} diff --git a/app/Client/transmission/TransmissionRPCException.php b/app/Client/transmission/TransmissionRPCException.php deleted file mode 100644 index 770e03a..0000000 --- a/app/Client/transmission/TransmissionRPCException.php +++ /dev/null @@ -1,48 +0,0 @@ -=')) { - parent::__construct($message, $code, $previous); - } else { - parent::__construct($message, $code); - } - } -} diff --git a/app/Client/transmission/transmission.php b/app/Client/transmission/transmission.php deleted file mode 100644 index ed4e9d5..0000000 --- a/app/Client/transmission/transmission.php +++ /dev/null @@ -1,763 +0,0 @@ -, - * Bryce Chidester - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * PHP version specific information - * version_compare() (PHP 4 >= 4.1.0, PHP 5) - * ctype_digit() (PHP 4 >= 4.0.4, PHP 5) - * stream_context_create (PHP 4 >= 4.3.0, PHP 5) - * PHP Class support (PHP 5) (PHP 4 might work, untested) - */ - -namespace IYUU\Client\transmission; - -use IYUU\Client\AbstractClient; - -/** - * A friendly little version check... - */ -if (version_compare(PHP_VERSION, '5.2.10', '<')) { - die("The TransmissionRPC class requires PHP version 5.2.10 or above." . PHP_EOL); -} - -/** - * Transmission bittorrent client/daemon RPC communication class - * - * Usage example: - * - * $rpc = new TransmissionRPC($rpc_url); - * $result = $rpc->add_file( $url_or_path_to_torrent, $target_folder ); - * - * - */ -class transmission extends AbstractClient -{ - /** - * User agent used in all http communication - */ - const HTTP_UA = 'TransmissionRPC for PHP/0.3'; - - /** - * The URL to the bittorent client you want to communicate with - * the port (default: 9091) can be set in you Transmission preferences - * @var string - */ - public $url = ''; - - /** - * If your Transmission RPC requires authentication, supply username here - * @var string - */ - public $username = ''; - - /** - * If your Transmission RPC requires authentication, supply password here - * @var string - */ - public $password = ''; - - /** - * Print debugging information, default is off - * @var bool - */ - public $debug = false; - - /** - * Transmission RPC version - * @var int - */ - protected $rpc_version = 0; - - /** - * Transmission uses a session id to prevent CSRF attacks - * @var string - */ - protected $session_id = ''; - - /** - * Default values for stream context - * @var array - */ - private $default_context_opts = array( - 'http' => array( - 'user_agent' => self::HTTP_UA, - 'timeout' => '60', // Don't want to be too slow - 'ignore_errors' => true, // Leave the error parsing/handling to the code - ), - "ssl"=>array( - "verify_peer"=>false, - "verify_peer_name"=>false, - ) - ); - - /** - * Constants for torrent status - */ - const TR_STATUS_STOPPED = 0; - const TR_STATUS_CHECK_WAIT = 1; - const TR_STATUS_CHECK = 2; - const TR_STATUS_DOWNLOAD_WAIT = 3; - const TR_STATUS_DOWNLOAD = 4; - const TR_STATUS_SEED_WAIT = 5; - const TR_STATUS_SEED = 6; - - const RPC_LT_14_TR_STATUS_CHECK_WAIT = 1; - const RPC_LT_14_TR_STATUS_CHECK = 2; - const RPC_LT_14_TR_STATUS_DOWNLOAD = 4; - const RPC_LT_14_TR_STATUS_SEED = 8; - const RPC_LT_14_TR_STATUS_STOPPED = 16; - - /** - * Takes the connection parameters - * - * @param string $url - * @param string $username - * @param string $password - */ - public function __construct($url = 'http://127.0.0.1:9091/transmission/rpc', $username = null, $password = null) - { - $this->url = rtrim($url, '/'); - $this->username = $username; - $this->password = $password; - } - - /** - * Start one or more torrents - * - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function start($ids) - { - if (!is_array($ids)) { - $ids = array($ids); - } - $request = array("ids" => $ids); - return $this->request("torrent-start", $request); - } - - /** - * Stop one or more torrents - * - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function stop($ids) - { - if (!is_array($ids)) { - $ids = array($ids); - } - $request = array("ids" => $ids); - return $this->request("torrent-stop", $request); - } - - /** - * Reannounce one or more torrents - * - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function reannounce($ids) - { - if (!is_array($ids)) { - $ids = array($ids); - } - $request = array("ids" => $ids); - return $this->request("torrent-reannounce", $request); - } - - /** - * Verify one or more torrents - * - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function verify($ids) - { - if (!is_array($ids)) { - $ids = array($ids); - } - $request = array("ids" => $ids); - return $this->request("torrent-verify", $request); - } - - /** - * Get information on torrents in transmission, if the ids parameter is - * empty all torrents will be returned. The fields array can be used to return certain - * fields. Default fields are: "id", "name", "status", "doneDate", "haveValid", "totalSize". - * See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields - * - * @param array fields An array of return fields - * @param int|array ids A list of transmission torrent ids - * - * Request: - * { - * "arguments": { - * "fields": [ "id", "name", "totalSize" ], - * "ids": [ 7, 10 ] - * }, - * "method": "torrent-get", - * "tag": 39693 - * } - * - * Response: - * { - * "arguments": { - * "torrents": [ - * { - * "id": 10, - * "name": "Fedora x86_64 DVD", - * "totalSize": 34983493932, - * }, - * { - * "id": 7, - * "name": "Ubuntu x86_64 DVD", - * "totalSize", 9923890123, - * } - * ] - * }, - * "result": "success", - * "tag": 39693 - * } - * @return mixed - * @throws TransmissionRPCException - */ - public function get($ids = array(), $fields = array()) - { - if (!is_array($ids)) { - $ids = array($ids); - } // Convert $ids to an array if only a single id was passed - if (count($fields) == 0) { - $fields = array("id", "name", "status", "doneDate", "haveValid", "totalSize"); - } // Defaults - $request = array( - "fields" => $fields, - "ids" => $ids - ); - return $this->request("torrent-get", $request); - } - - /** - * Set properties on one or more torrents, available fields are: - * "bandwidthPriority" | number this torrent's bandwidth tr_priority_t - * "downloadLimit" | number maximum download speed (in K/s) - * "downloadLimited" | boolean true if "downloadLimit" is honored - * "files-wanted" | array indices of file(s) to download - * "files-unwanted" | array indices of file(s) to not download - * "honorsSessionLimits" | boolean true if session upload limits are honored - * "ids" | array torrent list, as described in 3.1 - * "location" | string new location of the torrent's content - * "peer-limit" | number maximum number of peers - * "priority-high" | array indices of high-priority file(s) - * "priority-low" | array indices of low-priority file(s) - * "priority-normal" | array indices of normal-priority file(s) - * "seedRatioLimit" | double session seeding ratio - * "seedRatioMode" | number which ratio to use. See tr_ratiolimit - * "uploadLimit" | number maximum upload speed (in K/s) - * "uploadLimited" | boolean true if "uploadLimit" is honored - * See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for more information - * - * @param array arguments An associative array of arguments to set - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function set($ids = array(), $arguments = array()) - { - // See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields - if (!is_array($ids)) { - $ids = array($ids); - } // Convert $ids to an array if only a single id was passed - if (!isset($arguments['ids'])) { - $arguments['ids'] = $ids; - } // Any $ids given in $arguments overrides the method parameter - return $this->request("torrent-set", $arguments); - } - - /** - * Add a new torrent - * - * Available extra options: - * key | value type & description - * ---------------------+------------------------------------------------- - * "download-dir" | string path to download the torrent to - * "filename" | string filename or URL of the .torrent file - * "metainfo" | string base64-encoded .torrent content - * "paused" | boolean if true, don't start the torrent - * "peer-limit" | number maximum number of peers - * "bandwidthPriority" | number torrent's bandwidth tr_priority_t - * "files-wanted" | array indices of file(s) to download - * "files-unwanted" | array indices of file(s) to not download - * "priority-high" | array indices of high-priority file(s) - * "priority-low" | array indices of low-priority file(s) - * "priority-normal" | array indices of normal-priority file(s) - * - * Either "filename" OR "metainfo" MUST be included. - * All other arguments are optional. - * - * @param string $torrent_location The URL or path to the torrent file - * @param string $save_path Folder to save torrent in - * @param array $extra_options Optional extra torrent options - * @return mixed - * @throws TransmissionRPCException - */ - public function add_file($torrent_location, $save_path = '', $extra_options = array()) - { - if (!empty($save_path)) { - $extra_options['download-dir'] = $save_path; - } - $extra_options['filename'] = $torrent_location; - - return $this->request("torrent-add", $extra_options); - } - - /* Add a new torrent using a file path or a URL (For backwards compatibility) - * @param torrent_location The URL or path to the torrent file - * @param save_path Folder to save torrent in - * @param extra options Optional extra torrent options - */ - public function add($torrent_location, $save_path = '', $extra_options = array()) - { - return $this->add_file($torrent_location, $save_path, $extra_options); - } - - /** - * Add a torrent using the raw torrent data - * - * @param string $torrent_metainfo The raw, unencoded contents (metainfo) of a torrent - * @param string $save_path Folder to save torrent in - * @param array $extra_options Optional extra torrent options - * @return mixed - * @throws TransmissionRPCException - */ - public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array()) - { - if (!empty($save_path)) { - $extra_options['download-dir'] = $save_path; - } - $extra_options['metainfo'] = base64_encode($torrent_metainfo); - - return $this->request("torrent-add", $extra_options); - } - - /** - * Remove torrent from transmission - * - * @param bool delete_local_data Also remove local data? - * @param int|array ids A list of transmission torrent ids - * @return mixed - * @throws TransmissionRPCException - */ - public function delete($ids, $delete_local_data = false) - { - if (!is_array($ids)) { - $ids = array($ids); - } // Convert $ids to an array if only a single id was passed - $request = array( - "ids" => $ids, - "delete-local-data" => $delete_local_data - ); - return $this->request("torrent-remove", $request); - } - - /** - * Move local storage location - * - * @param int|array ids A list of transmission torrent ids - * @param string target_location The new storage location - * @param string move_existing_data Move existing data or scan new location for available data - * @return mixed - * @throws TransmissionRPCException - */ - public function move($ids, $target_location, $move_existing_data = true) - { - if (!is_array($ids)) { - $ids = array($ids); - } // Convert $ids to an array if only a single id was passed - $request = array( - "ids" => $ids, - "location" => $target_location, - "move" => $move_existing_data - ); - return $this->request("torrent-set-location", $request); - } - - /** - * 3.7. Renaming a Torrent's Path - * - * Method name: "torrent-rename-path" - * - * For more information on the use of this function, see the transmission.h - * documentation of tr_torrentRenamePath(). In particular, note that if this - * call succeeds you'll want to update the torrent's "files" and "name" field - * with torrent-get. - * - * Request arguments: - * - * string | value type & description - * ---------------------------------+------------------------------------------------- - * "ids" | array the torrent torrent list, as described in 3.1 - * | (must only be 1 torrent) - * "path" | string the path to the file or folder that will be renamed - * "name" | string the file or folder's new name - * Response arguments: "path", "name", and "id", holding the torrent ID integer - * - * @param int|array ids A 1-element list of transmission torrent ids - * @param string path The path to the file or folder that will be renamed - * @param string name The file or folder's new name - * @return mixed - * @throws TransmissionRPCException - */ - public function rename($ids, $path, $name) - { - if (!is_array($ids)) { - $ids = array($ids); - } // Convert $id to an array if only a single id was passed - if (count($ids) !== 1) { - throw new TransmissionRPCException('A single id is accepted', TransmissionRPCException::E_INVALIDARG); - } - - $request = array( - "ids" => $ids, - "path" => $path, - "name" => $name - ); - return $this->request("torrent-rename-path", $request); - } - - - /** - * Retrieve session statistics - * - * @returns array of statistics - */ - public function sstats() - { - return $this->request("session-stats", array()); - } - - /** - * Retrieve all session variables - * - * @returns array of session information - */ - public function sget() - { - return $this->request("session-get", array()); - } - - /** - * Set session variable(s) - * - * @param array of session variables to set - * @return mixed - * @throws TransmissionRPCException - */ - public function sset($arguments) - { - return $this->request("session-set", $arguments); - } - - /** - * Return the interpretation of the torrent status - * - * @param int The integer "torrent status" - * @returns string The translated meaning - * @return string - */ - public function getStatusString($intstatus) - { - if ($this->rpc_version < 14) { - if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK_WAIT) { - return "Waiting to verify local files"; - } - if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK) { - return "Verifying local files"; - } - if ($intstatus == self::RPC_LT_14_TR_STATUS_DOWNLOAD) { - return "Downloading"; - } - if ($intstatus == self::RPC_LT_14_TR_STATUS_SEED) { - return "Seeding"; - } - if ($intstatus == self::RPC_LT_14_TR_STATUS_STOPPED) { - return "Stopped"; - } - } else { - if ($intstatus == self::TR_STATUS_CHECK_WAIT) { - return "Waiting to verify local files"; - } - if ($intstatus == self::TR_STATUS_CHECK) { - return "Verifying local files"; - } - if ($intstatus == self::TR_STATUS_DOWNLOAD) { - return "Downloading"; - } - if ($intstatus == self::TR_STATUS_SEED) { - return "Seeding"; - } - if ($intstatus == self::TR_STATUS_STOPPED) { - return "Stopped"; - } - if ($intstatus == self::TR_STATUS_SEED_WAIT) { - return "Queued for seeding"; - } - if ($intstatus == self::TR_STATUS_DOWNLOAD_WAIT) { - return "Queued for download"; - } - } - return "Unknown"; - } - - - - /** - * Here be dragons (Internal methods) - */ - - - /** - * Clean up the request array. Removes any empty fields from the request - * - * @param array array The request associative array to clean - * @returns array The cleaned array - * @return array|null - */ - protected function cleanRequestData($array) - { - if (!is_array($array) || count($array) == 0) { - return null; - } // Nothing to clean - setlocale(LC_NUMERIC, 'en_US.utf8'); // Override the locale - if the system locale is wrong, then 12.34 will encode as 12,34 which is invalid JSON - foreach ($array as $index => $value) { - if (is_object($value)) { - $array[$index] = $value->toArray(); - } // Convert objects to arrays so they can be JSON encoded - if (is_array($value)) { - $array[$index] = $this->cleanRequestData($value); - } // Recursion - if (empty($value) && $value !== 0) { // Remove empty members - unset($array[$index]); - continue; // Skip the rest of the tests - they may re-add the element. - } - if (is_numeric($value)) { - $array[$index] = $value + 0; - } // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc) - if (is_bool($value)) { - $array[$index] = ($value ? 1 : 0); - } // Store boolean values as 0 or 1 - if (is_string($value)) { - $type = mb_detect_encoding($value, "auto"); - if ($type !== 'UTF-8') { - $array[$index] = mb_convert_encoding($value, "UTF-8"); - //utf8_encode( $value ); // Make sure all data is UTF-8 encoded for Transmission - } - } - } - return $array; - } - - /** - * 执行 rpc 请求 - * - * @param string $method 请求类型/方法, 详见 $this->allowMethods - * @param array $arguments 附加参数, 可选 - * @return array - * @throws TransmissionRPCException - */ - protected function request($method, $arguments = array()) - { - // Check the parameters - if (!is_scalar($method)) { - throw new TransmissionRPCException('Method name has no scalar value', TransmissionRPCException::E_INVALIDARG); - } - if (!is_array($arguments)) { - throw new TransmissionRPCException('Arguments must be given as array', TransmissionRPCException::E_INVALIDARG); - } - - $arguments = $this->cleanRequestData($arguments); // Sanitize input - - // Grab the X-Transmission-Session-Id if we don't have it already - if (!$this->session_id) { - if (!$this->GetSessionID()) { - throw new TransmissionRPCException('Unable to acquire X-Transmission-Session-Id', TransmissionRPCException::E_SESSIONID); - } - } - - $data = array( - 'method' => $method, - 'arguments' => $arguments - ); - - $header = array( - 'Content-Type: application/json', - 'Authorization: Basic ' . base64_encode(sprintf("%s:%s", $this->username, $this->password)), - 'X-Transmission-Session-Id: ' . $this->session_id - ); - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $this->url); - if (stripos($this->url, 'https://') === 0) { - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书 - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 不检查证书 - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $this->username . ':' . $this->password); - curl_setopt($ch, CURLOPT_HEADER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); - curl_setopt($ch, CURLOPT_TIMEOUT, 600); - $content = curl_exec($ch); - curl_close($ch); - - if (!$content) { - $content = array('result' => 'failed'); - } - return json_decode($content, true); - } - - /** - * Performs an empty GET on the Transmission RPC to get the X-Transmission-Session-Id - * and store it in $this->session_id - * - * @return string - * @throws TransmissionRPCException - */ - public function GetSessionID() - { - if (!$this->url) { - throw new TransmissionRPCException("Class must be initialized before GetSessionID() can be called.", TransmissionRPCException::E_INVALIDARG); - } - - // Setup the context - $contextopts = $this->default_context_opts; // Start with the defaults - - // Make sure it's blank/empty (reset) - $this->session_id = null; - - // Setup authentication (if provided) - if ($this->username && $this->password) { - $contextopts['http']['header'] = sprintf("Authorization: Basic %s\r\n", base64_encode($this->username . ':' . $this->password)); - } - - if ($this->debug) { - echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream context created with options:" . - PHP_EOL . print_r($contextopts, true); - } - - $context = stream_context_create($contextopts); // Create the context for this request - if (!$fp = @fopen($this->url, 'r', false, $context)) { // Open a filepointer to the data, and use fgets to get the result - throw new TransmissionRPCException('Unable to connect to ' . $this->url, TransmissionRPCException::E_CONNECTION); - } - - // Check the response (headers etc) - $stream_meta = stream_get_meta_data($fp); - fclose($fp); - if ($this->debug) { - echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream meta info: " . - PHP_EOL . print_r($stream_meta, true); - } - if ($stream_meta['timed_out']) { - throw new TransmissionRPCException("Timed out connecting to {$this->url}", TransmissionRPCException::E_CONNECTION); - } - if (substr($stream_meta['wrapper_data'][0], 9, 3) == "401") { - throw new TransmissionRPCException("Invalid username/password.", TransmissionRPCException::E_AUTHENTICATION); - } elseif (substr($stream_meta['wrapper_data'][0], 9, 3) == "409") { // This is what we're hoping to find - // Loop through the returned headers and extract the X-Transmission-Session-Id - foreach ($stream_meta['wrapper_data'] as $header) { - if (strpos($header, 'X-Transmission-Session-Id: ') === 0) { - if ($this->debug) { - echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Session-Id header: " . - PHP_EOL . print_r($header, true); - } - $this->session_id = trim(substr($header, 27)); - break; - } - } - if (!$this->session_id) { // Didn't find a session_id - throw new TransmissionRPCException("Unable to retrieve X-Transmission-Session-Id", TransmissionRPCException::E_SESSIONID); - } - } else { - throw new TransmissionRPCException("Unexpected response from Transmission RPC: " . $stream_meta['wrapper_data'][0]); - } - return $this->session_id; - } - - /** - * 抽象方法,子类实现 - */ - public function status() - { - $rs = $this->sstats(); - return isset($rs['result']) ? $rs['result'] : 'error'; - } - - /** - * 抽象方法,子类实现 - */ - public function getList(&$move = array()) - { - $ids = array(); - $fields = array( "id", "status", "name", "hashString", "downloadDir", "torrentFile" ); - $res = $this->get($ids, $fields); - if (isset($res['result']) && $res['result'] == 'success') { - // 成功 - } else { - // 失败 - echo "获取种子列表失败,可能transmission暂时无响应,请稍后重试!".PHP_EOL; - return array(); - } - if (empty($res['arguments']['torrents'])) { - echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL; - return array(); - } - $res = $res['arguments']['torrents']; - // 过滤,只保留正常做种 - $res = array_filter($res, function ($v) { - return isset($v['status']) && $v['status']===6; - }, ARRAY_FILTER_USE_BOTH); - - if (empty($res)) { - echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL; - return array(); - } - // 提取数组:hashString - $info_hash = array_column($res, 'hashString'); - // 升序排序 - sort($info_hash); - $json = json_encode($info_hash, JSON_UNESCAPED_UNICODE); - // 去重 应该从文件读入,防止重复提交 - $sha1 = sha1($json); - // 组装返回数据 - $hashArray['hash'] = $json; - $hashArray['sha1'] = $sha1; - // 变换数组:hashString为键 - $hashArray['hashString'] = array_column($res, "downloadDir", 'hashString'); - $move = array_column($res, null, 'hashString'); - return $hashArray; - } -} diff --git a/composer.json b/composer.json index 5866b38..4210b01 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,8 @@ "ext-json": "*", "ext-mbstring": "*", "ext-curl": "*", - "curl/curl": "^2.2" + "curl/curl": "^2.2", + "ledccn/iyuubittorrentclient": "dev-master" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 3f3130e..300e894 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "10281f19c929443b7db18d1ab159ec63", + "content-hash": "568a690b54981e283a0cc9ee09f5d696", "packages": [ { "name": "curl/curl", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/php-mod/curl.git", - "reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff" + "reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff", - "reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff", + "url": "https://api.github.com/repos/php-mod/curl/zipball/3ad560b1fc1bbdf5c7681356ab953fb961f255e5", + "reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5", "shasum": "", "mirrors": [ { @@ -45,15 +45,15 @@ "MIT" ], "authors": [ + { + "name": "php-curl-class", + "homepage": "https://github.com/php-curl-class" + }, { "name": "Hassan Amouhzi", "email": "hassan@anezi.net", "homepage": "http://hassan.amouhzi.com" }, - { - "name": "php-curl-class", - "homepage": "https://github.com/php-curl-class" - }, { "name": "user52", "homepage": "https://github.com/user52" @@ -65,13 +65,66 @@ "curl", "dot" ], - "time": "2018-12-04T19:47:03+00:00" + "time": "2020-03-19T20:07:26+00:00" + }, + { + "name": "ledccn/iyuubittorrentclient", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ledccn/IYUUBittorrentClient.git", + "reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ledccn/IYUUBittorrentClient/zipball/cb59d3380efd8cab7d277eefbc7e2590845bf805", + "reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "curl/curl": "^2.3", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^5.6 | ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "IYUU\\Client\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "David", + "email": "367013672@qq.com" + } + ], + "description": "实现pt客户端管理的代码库", + "homepage": "https://github.com/ledccn/IYUUBittorrentClient", + "keywords": [ + "qbittorrent", + "transmission" + ], + "time": "2021-01-12T06:07:08+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "ledccn/iyuubittorrentclient": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 7f5e0ef..7ee8b87 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,5 +6,6 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + 'IYUU\\Client\\' => array($vendorDir . '/ledccn/iyuubittorrentclient/src'), 'IYUU\\' => array($baseDir . '/app'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 5f38f2d..39f262a 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -13,11 +13,16 @@ class ComposerStaticInitd8553673db02b2a444a853f28e16196e public static $prefixLengthsPsr4 = array ( 'I' => array ( + 'IYUU\\Client\\' => 12, 'IYUU\\' => 5, ), ); public static $prefixDirsPsr4 = array ( + 'IYUU\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/ledccn/iyuubittorrentclient/src', + ), 'IYUU\\' => array ( 0 => __DIR__ . '/../..' . '/app', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 02e3e39..8fe6d3c 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,17 +1,17 @@ [ { "name": "curl/curl", - "version": "2.2.0", - "version_normalized": "2.2.0.0", + "version": "2.3.0", + "version_normalized": "2.3.0.0", "source": { "type": "git", "url": "https://github.com/php-mod/curl.git", - "reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff" + "reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff", - "reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff", + "url": "https://api.github.com/repos/php-mod/curl/zipball/3ad560b1fc1bbdf5c7681356ab953fb961f255e5", + "reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5", "shasum": "", "mirrors": [ { @@ -28,7 +28,7 @@ "phpunit/phpunit": "^5.7", "squizlabs/php_codesniffer": "~2.1" }, - "time": "2018-12-04T19:47:03+00:00", + "time": "2020-03-19T20:07:26+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -41,15 +41,15 @@ "MIT" ], "authors": [ + { + "name": "php-curl-class", + "homepage": "https://github.com/php-curl-class" + }, { "name": "Hassan Amouhzi", "email": "hassan@anezi.net", "homepage": "http://hassan.amouhzi.com" }, - { - "name": "php-curl-class", - "homepage": "https://github.com/php-curl-class" - }, { "name": "user52", "homepage": "https://github.com/user52" @@ -63,18 +63,18 @@ ] }, { - "name": "owner888/phpspider", - "version": "v2.1.6", - "version_normalized": "2.1.6.0", + "name": "ledccn/iyuubittorrentclient", + "version": "dev-master", + "version_normalized": "9999999-dev", "source": { "type": "git", - "url": "https://github.com/owner888/phpspider.git", - "reference": "e6021148adec201418c16ba26f39bc013ba5b4d9" + "url": "https://github.com/ledccn/IYUUBittorrentClient.git", + "reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owner888/phpspider/zipball/e6021148adec201418c16ba26f39bc013ba5b4d9", - "reference": "e6021148adec201418c16ba26f39bc013ba5b4d9", + "url": "https://api.github.com/repos/ledccn/IYUUBittorrentClient/zipball/cb59d3380efd8cab7d277eefbc7e2590845bf805", + "reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805", "shasum": "", "mirrors": [ { @@ -84,36 +84,35 @@ ] }, "require": { - "php": ">=5.5.0" + "curl/curl": "^2.3", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^5.6 | ^7.0" }, - "suggest": { - "ext-pcntl、ext-redis": "For better performance. " - }, - "time": "2018-08-15T08:04:29+00:00", + "time": "2021-01-12T06:07:08+00:00", "type": "library", - "installation-source": "dist", + "installation-source": "source", "autoload": { "psr-4": { - "phpspider\\": "./" + "IYUU\\Client\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "GPL-3.0-or-later" ], "authors": [ { - "name": "Seatle Yang", - "email": "seatle@foxmail.com", - "homepage": "http://www.phpspider.org", - "role": "Developer" + "name": "David", + "email": "367013672@qq.com" } ], - "description": "The PHPSpider Framework.", - "homepage": "http://www.phpspider.org", + "description": "实现pt客户端管理的代码库", + "homepage": "https://github.com/ledccn/IYUUBittorrentClient", "keywords": [ - "framework", - "phpspider" + "qbittorrent", + "transmission" ] } ] diff --git a/vendor/curl/curl/.gitlab-ci.yml b/vendor/curl/curl/.gitlab-ci.yml index ff2854f..cac8842 100644 --- a/vendor/curl/curl/.gitlab-ci.yml +++ b/vendor/curl/curl/.gitlab-ci.yml @@ -27,7 +27,6 @@ tests-php5.6: - php --version - if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi; - php composer.phar install @@ -36,7 +35,6 @@ tests-php5.6: cache: key: php5.6 paths: - - composer.phar - vendor tests-php7.0: @@ -51,7 +49,6 @@ tests-php7.0: - php --version - if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi; - php composer.phar install @@ -75,7 +72,6 @@ tests-php7.1: - php --version - if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi; - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi; - php composer.phar install @@ -89,25 +85,37 @@ tests-php7.1: - vendor tests-php7.2: - image: alpine:3.8 + image: alpine:3.9 stage: test services: - name: "$CI_REGISTRY_IMAGE:server-test" alias: server_test script: - - apk add --no-cache php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml + - apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml - php --version - - if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi; - - if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi; - - php composer.phar install + - composer install - vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src - nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 & - vendor/bin/phpunit cache: key: php7.2 paths: - - composer.phar + - vendor + +tests-php7.3: + image: alpine:3.11 + stage: test + services: + - name: "$CI_REGISTRY_IMAGE:server-test" + alias: server_test + script: + - apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml + - php --version + - composer install + - vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src + - nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 & + - vendor/bin/phpunit + cache: + key: php7.3 + paths: - vendor diff --git a/vendor/curl/curl/src/Curl/Curl.php b/vendor/curl/curl/src/Curl/Curl.php index 60567a6..583f112 100644 --- a/vendor/curl/curl/src/Curl/Curl.php +++ b/vendor/curl/curl/src/Curl/Curl.php @@ -78,12 +78,12 @@ class Curl public $curl; /** - * @var bool Whether an error occured or not + * @var bool Whether an error occurred or not */ public $error = false; /** - * @var int Contains the error code of the curren request, 0 means no error happend + * @var int Contains the error code of the current request, 0 means no error happened */ public $error_code = 0; @@ -93,12 +93,12 @@ class Curl public $error_message = null; /** - * @var bool Whether an error occured or not + * @var bool Whether an error occurred or not */ public $curl_error = false; /** - * @var int Contains the error code of the curren request, 0 means no error happend. + * @var int Contains the error code of the current request, 0 means no error happened. * @see https://curl.haxx.se/libcurl/c/libcurl-errors.html */ public $curl_error_code = 0; @@ -109,7 +109,7 @@ class Curl public $curl_error_message = null; /** - * @var bool Whether an error occured or not + * @var bool Whether an error occurred or not */ public $http_error = false; @@ -124,17 +124,17 @@ class Curl public $http_error_message = null; /** - * @var string|array TBD (ensure type) Contains the request header informations + * @var string|array TBD (ensure type) Contains the request header information */ public $request_headers = null; /** - * @var string|array TBD (ensure type) Contains the response header informations + * @var string|array TBD (ensure type) Contains the response header information */ public $response_headers = array(); /** - * @var string Contains the response from the curl request + * @var string|false|null Contains the response from the curl request */ public $response = null; @@ -146,12 +146,12 @@ class Curl /** * Constructor ensures the available curl extension is loaded. * - * @throws \ErrorException + * @throws \RuntimeException */ public function __construct() { if (!extension_loaded('curl')) { - throw new \ErrorException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php'); + throw new \RuntimeException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php'); } $this->init(); @@ -162,7 +162,7 @@ class Curl /** * Initializer for the curl resource. * - * Is called by the __construct() of the class or when the curl request is reseted. + * Is called by the __construct() of the class or when the curl request is reset. * @return self */ private function init() @@ -202,7 +202,7 @@ class Curl // protected methods /** - * Execute the curl request based on the respectiv settings. + * Execute the curl request based on the respective settings. * * @return int Returns the error code for the current curl request */ @@ -212,14 +212,14 @@ class Curl $this->response = curl_exec($this->curl); $this->curl_error_code = curl_errno($this->curl); $this->curl_error_message = curl_error($this->curl); - $this->curl_error = !($this->curl_error_code === 0); - $this->http_status_code = curl_getinfo($this->curl, CURLINFO_HTTP_CODE); - $this->http_error = in_array(floor($this->http_status_code / 100), array(4, 5)); + $this->curl_error = !($this->getErrorCode() === 0); + $this->http_status_code = intval(curl_getinfo($this->curl, CURLINFO_HTTP_CODE)); + $this->http_error = $this->isError(); $this->error = $this->curl_error || $this->http_error; - $this->error_code = $this->error ? ($this->curl_error ? $this->curl_error_code : $this->http_status_code) : 0; + $this->error_code = $this->error ? ($this->curl_error ? $this->getErrorCode() : $this->getHttpStatus()) : 0; $this->request_headers = preg_split('/\r\n/', curl_getinfo($this->curl, CURLINFO_HEADER_OUT), null, PREG_SPLIT_NO_EMPTY); $this->http_error_message = $this->error ? (isset($this->response_headers['0']) ? $this->response_headers['0'] : '') : ''; - $this->error_message = $this->curl_error ? $this->curl_error_message : $this->http_error_message; + $this->error_message = $this->curl_error ? $this->getErrorMessage() : $this->http_error_message; return $this->error_code; } @@ -250,6 +250,18 @@ class Curl $this->setOpt(CURLOPT_POSTFIELDS, $data); } + /** + * Set the json payload informations to the postfield curl option. + * + * @param array $data The data to be sent. + * @return void + */ + protected function prepareJsonPayload(array $data) + { + $this->setOpt(CURLOPT_POST, true); + $this->setOpt(CURLOPT_POSTFIELDS, json_encode($data)); + } + /** * Set auth options for the current request. * @@ -307,12 +319,17 @@ class Curl * * @param string $url The url to make the post request * @param array $data Post data to pass to the url + * @param boolean $asJson Whether the data should be passed as json or not. {@insce 2.2.1} * @return self */ - public function post($url, $data = array()) + public function post($url, $data = array(), $asJson = false) { $this->setOpt(CURLOPT_URL, $url); - $this->preparePayload($data); + if ($asJson) { + $this->prepareJsonPayload($data); + } else { + $this->preparePayload($data); + } $this->exec(); return $this; } @@ -320,7 +337,7 @@ class Curl /** * Make a put request with optional data. * - * The put request data can be either sent via payload or as get paramters of the string. + * The put request data can be either sent via payload or as get parameters of the string. * * @param string $url The url to make the put request * @param array $data Optional data to pass to the $url @@ -346,7 +363,7 @@ class Curl /** * Make a patch request with optional data. * - * The patch request data can be either sent via payload or as get paramters of the string. + * The patch request data can be either sent via payload or as get parameters of the string. * * @param string $url The url to make the patch request * @param array $data Optional data to pass to the $url @@ -398,7 +415,7 @@ class Curl /** * Pass basic auth data. * - * If the the rquested url is secured by an httaccess basic auth mechanism you can use this method to provided the auth data. + * If the the requested url is secured by an htaccess basic auth mechanism you can use this method to provided the auth data. * * ```php * $curl = new Curl(); @@ -406,8 +423,8 @@ class Curl * $curl->get('http://example.com/secure.php'); * ``` * - * @param string $username The username for the authentification - * @param string $password The password for the given username for the authentification + * @param string $username The username for the authentication + * @param string $password The password for the given username for the authentication * @return self */ public function setBasicAuthentication($username, $password) @@ -418,7 +435,7 @@ class Curl } /** - * Provide optional header informations. + * Provide optional header information. * * In order to pass optional headers by key value pairing: * @@ -442,7 +459,7 @@ class Curl /** * Provide a User Agent. * - * In order to provide you cusomtized user agent name you can use this method. + * In order to provide you customized user agent name you can use this method. * * ```php * $curl = new Curl(); @@ -461,6 +478,9 @@ class Curl /** * @deprecated Call setReferer() instead + * + * @param $referrer + * @return self */ public function setReferrer($referrer) { @@ -471,7 +491,7 @@ class Curl /** * Set the HTTP referer header. * - * The $referer informations can help identify the requested client where the requested was made. + * The $referer Information can help identify the requested client where the requested was made. * * @param string $referer An url to pass and will be set as referer header * @return self @@ -503,24 +523,26 @@ class Curl * * @see http://php.net/curl_setopt * - * @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION` - * @param mixed $value The value to pass for the given $option + * @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION` + * @param mixed $value The value to pass for the given $option + * @return bool */ public function setOpt($option, $value) { return curl_setopt($this->curl, $option, $value); } - + /** - * Get customized curl options. - * - * To see a full list of options: http://php.net/curl_getinfo - * - * @see http://php.net/curl_getinfo - * - * @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION` - * @param mixed $value The value to check for the given $option - */ + * Get customized curl options. + * + * To see a full list of options: http://php.net/curl_getinfo + * + * @see http://php.net/curl_getinfo + * + * @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION` + * @param mixed The value to check for the given $option + * @return mixed + */ public function getOpt($option) { return curl_getinfo($this->curl, $option); @@ -539,17 +561,26 @@ class Curl } /** - * Enable verbositiy. + * Enable verbosity. * - * @todo As to keep naming convention it should be renamed to `setVerbose()` + * @param bool $on + * @return self + */ + public function setVerbose($on = true) + { + $this->setOpt(CURLOPT_VERBOSE, $on); + return $this; + } + + /** + * @deprecated Call setVerbose() instead * - * @param string $on + * @param bool $on * @return self */ public function verbose($on = true) { - $this->setOpt(CURLOPT_VERBOSE, $on); - return $this; + return $this->setVerbose($on); } /** @@ -574,7 +605,7 @@ class Curl $this->http_error_message = null; $this->request_headers = null; $this->response_headers = array(); - $this->response = null; + $this->response = false; $this->init(); return $this; } @@ -605,7 +636,7 @@ class Curl */ public function isInfo() { - return $this->http_status_code >= 100 && $this->http_status_code < 200; + return $this->getHttpStatus() >= 100 && $this->getHttpStatus() < 200; } /** @@ -614,7 +645,7 @@ class Curl */ public function isSuccess() { - return $this->http_status_code >= 200 && $this->http_status_code < 300; + return $this->getHttpStatus() >= 200 && $this->getHttpStatus() < 300; } /** @@ -623,7 +654,7 @@ class Curl */ public function isRedirect() { - return $this->http_status_code >= 300 && $this->http_status_code < 400; + return $this->getHttpStatus() >= 300 && $this->getHttpStatus() < 400; } /** @@ -632,7 +663,7 @@ class Curl */ public function isError() { - return $this->http_status_code >= 400 && $this->http_status_code < 600; + return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 600; } /** @@ -641,7 +672,7 @@ class Curl */ public function isClientError() { - return $this->http_status_code >= 400 && $this->http_status_code < 500; + return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 500; } /** @@ -650,7 +681,7 @@ class Curl */ public function isServerError() { - return $this->http_status_code >= 500 && $this->http_status_code < 600; + return $this->getHttpStatus() >= 500 && $this->getHttpStatus() < 600; } /** @@ -673,7 +704,7 @@ class Curl * ``` * * @param string $headerKey Optional key to get from the array. - * @return bool|string + * @return bool|string|array * @since 1.9 */ public function getResponseHeaders($headerKey = null) @@ -697,21 +728,37 @@ class Curl return $headers; } + /** + * Get response from the curl request + * @return string|false + */ public function getResponse() { return $this->response; } + /** + * Get curl error code + * @return string + */ public function getErrorCode() { return $this->curl_error_code; } + /** + * Get curl error message + * @return string + */ public function getErrorMessage() { return $this->curl_error_message; } + /** + * Get http status code from the curl request + * @return int + */ public function getHttpStatus() { return $this->http_status_code;