作者 郭文星

'123'

正在显示 50 个修改的文件 包含 1822 行增加450 行删除

要显示太多修改。

为保证性能只显示 50 of 50+ 个文件。

@@ -14,11 +14,12 @@ class Base extends Api @@ -14,11 +14,12 @@ class Base extends Api
14 protected $AppID; 14 protected $AppID;
15 protected $AppSecret; 15 protected $AppSecret;
16 protected $qiniuUrl; 16 protected $qiniuUrl;
17 - 17 + public $url_h5;//前端h5的首页地址 分销需要加参数
18 public function __construct(Request $request = null) 18 public function __construct(Request $request = null)
19 { 19 {
20 parent::__construct($request); 20 parent::__construct($request);
21 $this->qiniuUrl = 'https://coupon.xp.yn.cn'; 21 $this->qiniuUrl = 'https://coupon.xp.yn.cn';
  22 + $this->url_h5 = 'https://coupon.xp.yn.cn';
22 $this->AppID = config("site.appid");//微信小程序AppID 23 $this->AppID = config("site.appid");//微信小程序AppID
23 $this->AppSecret = config("site.appsecret");//微信小程序密钥 24 $this->AppSecret = config("site.appsecret");//微信小程序密钥
24 } 25 }
@@ -23,22 +23,22 @@ class Client extends Api @@ -23,22 +23,22 @@ class Client extends Api
23 $this->postParam = $postParam; 23 $this->postParam = $postParam;
24 24
25 $res=$this->request->header(); 25 $res=$this->request->header();
26 - print_r($res); 26 +
27 parent::_initialize(); 27 parent::_initialize();
28 $this->auth->id ;//测试用 28 $this->auth->id ;//测试用
29 $postParam = $this->request->param(); 29 $postParam = $this->request->param();
30 $this->postParam = $postParam; 30 $this->postParam = $postParam;
31 - if (empty($postParam['code'])) {  
32 - $this->error("门店code异常"); 31 + if (empty($postParam['store_id'])) {
  32 + $this->error("门店store_id异常");
33 } 33 }
34 - $this->store_id = $postParam['code']; 34 + $this->store_id = $postParam['store_id'];
35 $store = Db::name("verification_store")->where("id", $this->store_id)->find(); 35 $store = Db::name("verification_store")->where("id", $this->store_id)->find();
36 if (empty($store)) { 36 if (empty($store)) {
37 $this->error("门店不存在,请退出登录后重试!"); 37 $this->error("门店不存在,请退出登录后重试!");
38 } 38 }
39 $this->store = $store; 39 $this->store = $store;
40 if (empty($this->auth->id)) { 40 if (empty($this->auth->id)) {
41 - print_r([$this->auth->id]); 41 +
42 return; 42 return;
43 } 43 }
44 44
@@ -229,4 +229,46 @@ class Client extends Api @@ -229,4 +229,46 @@ class Client extends Api
229 $this->success("查询成功",$receive); 229 $this->success("查询成功",$receive);
230 } 230 }
231 231
  232 +
  233 + /*
  234 + 7.生成二维码 及 规则 https://coupon.xp.yn.cn?store_id=1&activity_id=3
  235 + 二维码 没有则创新
  236 + 参数 用户id 门店id 活动id
  237 + store_id activiy_id
  238 + 请求需要加 header token
  239 + 由前端自行合成分销图片
  240 + */
  241 + public function synthesis(){
  242 + //参数
  243 + $param = request()->param();
  244 + $user_id = $this->auth->id;
  245 + $user_id=2;
  246 + //验证
  247 + if(empty($user_id)){return $this->error('用户信息错误');}
  248 + if(empty($param['store_id'])){return $this->error('请确认门店');}
  249 + if(empty($param['activity_id'])){return $this->error('请确认活动');}
  250 + $w['user_id'] = $user_id;
  251 + $w['store_id'] = $param['store_id'];
  252 + $w['activity_id'] = $param['activity_id'];
  253 + $r = Db::name('verification_user_synthesis')->where($w)->find();
  254 + //有 则 返回 无 则新增
  255 + if(empty($r)){
  256 + $url = (new \app\api\controller\v1\Base())->url_h5.'?'.http_build_query($param);
  257 + $res = (new \app\api\controller\v1\Index())->build($url);
  258 + $w['create_at'] = time();
  259 + $w['url'] = request()->domain().$res;
  260 + Db::name('verification_user_synthesis')->insert($w);
  261 + $res = $w['url'];
  262 + }else{
  263 + $res = $r['url'];
  264 + }
  265 + //获取 当前活动当前门店的背景图
  266 + $st_a['verification_store_id'] = $param['store_id'];
  267 + $st_a['id'] = $param['activity_id'];
  268 + $storeActivity = Db::name('verification_activity')->where($st_a)->find();
  269 + $data['ercode_url'] = $res;//二维码地址
  270 + $data['bg_url'] = !empty($storeActivity['poster'])?request()->domain().$storeActivity['poster']:'';//背景图
  271 + return $this->success('',$data);
  272 + }
  273 +
232 } 274 }
@@ -14,7 +14,7 @@ use think\Config; @@ -14,7 +14,7 @@ use think\Config;
14 use think\Db; 14 use think\Db;
15 use think\Response; 15 use think\Response;
16 use think\Validate; 16 use think\Validate;
17 - 17 +use app\server\Synthesis;
18 /** 18 /**
19 * 首页公共 19 * 首页公共
20 */ 20 */
@@ -232,17 +232,19 @@ class Index extends Api @@ -232,17 +232,19 @@ class Index extends Api
232 return $this->success("", $data); 232 return $this->success("", $data);
233 } 233 }
234 234
235 - // 生成二维码  
236 - public function build() 235 + /*
  236 + 生成二维码 $href 当前用户的 分享二维码 http格式
  237 + 扫码 后 跳转 首页
  238 + app/api/v1/index?share_id=$user_id
  239 + */
  240 + public function build($href)
237 { 241 {
238 - $post = $this->request->param("");  
239 - $text=$post['text'];  
240 - $label=$post['label']; 242 +
241 $config = get_addon_config('qrcode'); 243 $config = get_addon_config('qrcode');
242 $params = $this->request->get(); 244 $params = $this->request->get();
243 $params = array_intersect_key($params, array_flip(['text', 'size', 'padding', 'errorlevel', 'foreground', 'background', 'logo', 'logosize', 'logopath', 'label', 'labelfontsize', 'labelalignment'])); 245 $params = array_intersect_key($params, array_flip(['text', 'size', 'padding', 'errorlevel', 'foreground', 'background', 'logo', 'logosize', 'logopath', 'label', 'labelfontsize', 'labelalignment']));
244 - $params['text'] = $text;  
245 - $params['label'] = $label; 246 + $params['text'] = $href;
  247 + $params['label'] = "";
246 $qrCode = \addons\qrcode\library\Service::qrcode($params); 248 $qrCode = \addons\qrcode\library\Service::qrcode($params);
247 $mimetype = $config['format'] == 'png' ? 'image/png' : 'image/svg+xml'; 249 $mimetype = $config['format'] == 'png' ? 'image/png' : 'image/svg+xml';
248 $response = Response::create()->header("Content-Type", $mimetype); 250 $response = Response::create()->header("Content-Type", $mimetype);
@@ -263,9 +265,10 @@ class Index extends Api @@ -263,9 +265,10 @@ class Index extends Api
263 $code_path="/uploads/qrcode/".$code_name; 265 $code_path="/uploads/qrcode/".$code_name;
264 } 266 }
265 267
266 - return $this->success("", $code_path); 268 + return $code_path;
267 269
268 } 270 }
  271 +
269 272
270 /** 273 /**
271 * 名字加* 274 * 名字加*
@@ -150,6 +150,12 @@ class Wechat extends Api @@ -150,6 +150,12 @@ class Wechat extends Api
150 =snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) 150 =snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
151 https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 151 https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
152 2.2 由微信回跳后,获取code 和 state 参数,由前端post code给后台 152 2.2 由微信回跳后,获取code 和 state 参数,由前端post code给后台
  153 + 返回 token 前端存储 每次请求 放在header里
  154 + 2.3 分销地址 如 https://coupon.xp.yn.cn?store_id=1&activity_id=3
  155 + 假设 首页地址有参数 store_id activity_id,则表示分销首页,因此
  156 + 2.3.1 未登录 则跳转官方,需要携带分销参数 登录成功后 获取token,再发送请求 store_id activity_id
  157 + 2.3.2 已登录 有获取token,再发送请求 store_id activity_id
  158 + 无地址参数则不发送请求
153 */ 159 */
154 160
155 public function get_user_info_by_code (){ 161 public function get_user_info_by_code (){
@@ -177,8 +183,7 @@ class Wechat extends Api @@ -177,8 +183,7 @@ class Wechat extends Api
177 }else{ 183 }else{
178 Db::name('user')->where($w)->update($save); 184 Db::name('user')->where($w)->update($save);
179 } 185 }
180 - //注册成功 继续注册分销关系  
181 - 186 +
182 //设置同域下的登录缓存 187 //设置同域下的登录缓存
183 $user = Db::name('user')->where($w)->find(); 188 $user = Db::name('user')->where($w)->find();
184 //登录成功 存储服务器本地 189 //登录成功 存储服务器本地
@@ -190,7 +195,13 @@ class Wechat extends Api @@ -190,7 +195,13 @@ class Wechat extends Api
190 $this->error($e->getMessage()); 195 $this->error($e->getMessage());
191 } 196 }
192 if($user_id !=0){ 197 if($user_id !=0){
  198 +<<<<<<< HEAD
193 $this->success('完成',$user_id); 199 $this->success('完成',$user_id);
  200 +=======
  201 + $data['token'] = $this->auth->getToken();
  202 + $data['user_info'] = $user;
  203 + $this->success('完成',$data);
  204 +>>>>>>> 0dba521a562d536413694ddd919d77475f2e2ee8
194 }else{ 205 }else{
195 $this->error('code处理失败'); 206 $this->error('code处理失败');
196 } 207 }
@@ -198,6 +209,8 @@ class Wechat extends Api @@ -198,6 +209,8 @@ class Wechat extends Api
198 } 209 }
199 210
200 211
  212 +
  213 +
201 214
202 /* 215 /*
203 3.订单支付 前端请求 216 3.订单支付 前端请求
@@ -220,7 +233,7 @@ class Wechat extends Api @@ -220,7 +233,7 @@ class Wechat extends Api
220 */ 233 */
221 public function prepare_order($order_no = ''){ 234 public function prepare_order($order_no = ''){
222 $user_id = $this->auth->id; 235 $user_id = $this->auth->id;
223 - $user_id = 2;//模拟用户 236 +
224 if(empty($user_id)){ 237 if(empty($user_id)){
225 return $this->error('用户信息错误'); 238 return $this->error('用户信息错误');
226 } 239 }
  1 +<?php
  2 +// +----------------------------------------------------------------------
  3 +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4 +// +----------------------------------------------------------------------
  5 +// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
  6 +// +----------------------------------------------------------------------
  7 +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8 +// +----------------------------------------------------------------------
  9 +// | Author: yunwuxin <448901948@qq.com>
  10 +// +----------------------------------------------------------------------
  11 +
  12 +return [
  13 + 'connector' => 'Sync'
  14 +];
  1 +<?php
  2 +
  3 +namespace app\server;
  4 +use Kkokk\Poster\PosterManager;
  5 +use Kkokk\Poster\Exception\Exception;
  6 +
  7 +class Synthesis{
  8 +
  9 +
  10 + /**
  11 + * 图片合成
  12 + * $qrcode 二维码
  13 + */
  14 + static public function buildImDst($qrcode){
  15 + $saveHBPath = '';// # 设置保存路径和文件名
  16 + $poster = PosterManager::Poster($saveHBPath);
  17 + $BGPath = '';//背景图路径
  18 + $poster->buildImDst($BGPath);
  19 + //根据背景图的大小调整
  20 + $dst_x=408;
  21 + $dst_y=731;
  22 + $src_x=0;
  23 + $src_y=0;
  24 + $size=4;
  25 + $margin=1;
  26 + $result = $poster->buildImage('http://localhost/'.$qrcode,$dst_x,$dst_y,$src_x,$src_y)->getPoster(); # 合成二维码
  27 + return $result;
  28 + }
  29 +
  30 + /**创建二维码 186x186 */
  31 + static public function qrcode($url){
  32 + try{
  33 + $qrcodePath = ROOT_PATH . 'public/uploads/qrcode/';
  34 + $res = PosterManager::Poster()->Qr($url,$qrcodePath,'H',6);
  35 + }catch(\Exception $e){
  36 + abort(404,$e->getMessage());
  37 + }
  38 +
  39 + }
  40 +}
@@ -30,7 +30,8 @@ @@ -30,7 +30,8 @@
30 "ext-curl": "*", 30 "ext-curl": "*",
31 "ext-pdo": "*", 31 "ext-pdo": "*",
32 "ext-bcmath": "*", 32 "ext-bcmath": "*",
33 - "txthinking/mailer": "^2.0" 33 + "txthinking/mailer": "^2.0",
  34 + "kkokk/poster": "^2.0"
34 }, 35 },
35 "config": { 36 "config": {
36 "preferred-install": "dist", 37 "preferred-install": "dist",
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 // | Author: liu21st <liu21st@gmail.com> 9 // | Author: liu21st <liu21st@gmail.com>
10 // +---------------------------------------------------------------------- 10 // +----------------------------------------------------------------------
11 11
12 -define('THINK_VERSION', '5.0.24'); 12 +define('THINK_VERSION', '5.0.25');
13 define('THINK_START_TIME', microtime(true)); 13 define('THINK_START_TIME', microtime(true));
14 define('THINK_START_MEM', memory_get_usage()); 14 define('THINK_START_MEM', memory_get_usage());
15 define('EXT', '.php'); 15 define('EXT', '.php');
@@ -3,21 +3,8 @@ @@ -3,21 +3,8 @@
3 // autoload.php @generated by Composer 3 // autoload.php @generated by Composer
4 4
5 if (PHP_VERSION_ID < 50600) { 5 if (PHP_VERSION_ID < 50600) {
6 - if (!headers_sent()) {  
7 - header('HTTP/1.1 500 Internal Server Error');  
8 - }  
9 - $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;  
10 - if (!ini_get('display_errors')) {  
11 - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {  
12 - fwrite(STDERR, $err);  
13 - } elseif (!headers_sent()) {  
14 - echo $err;  
15 - }  
16 - }  
17 - trigger_error(  
18 - $err,  
19 - E_USER_ERROR  
20 - ); 6 + echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
  7 + exit(1);
21 } 8 }
22 9
23 require_once __DIR__ . '/composer/autoload_real.php'; 10 require_once __DIR__ . '/composer/autoload_real.php';
@@ -10,7 +10,7 @@ return array( @@ -10,7 +10,7 @@ return array(
10 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 10 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
11 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 11 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
12 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 12 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
13 - 'Stringable' => $vendorDir . '/myclabs/php-enum/stubs/Stringable.php', 13 + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
14 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 14 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
15 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 15 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
16 ); 16 );
@@ -9,7 +9,7 @@ return array( @@ -9,7 +9,7 @@ return array(
9 'think\\helper\\' => array($vendorDir . '/topthink/think-helper/src'), 9 'think\\helper\\' => array($vendorDir . '/topthink/think-helper/src'),
10 'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'), 10 'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
11 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'), 11 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'),
12 - 'think\\' => array($vendorDir . '/karsonzhang/fastadmin-addons/src', $vendorDir . '/topthink/think-queue/src', $baseDir . '/thinkphp/library/think'), 12 + 'think\\' => array($baseDir . '/thinkphp/library/think', $vendorDir . '/karsonzhang/fastadmin-addons/src', $vendorDir . '/topthink/think-queue/src'),
13 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), 13 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
14 'Tx\\' => array($vendorDir . '/txthinking/mailer/src'), 14 'Tx\\' => array($vendorDir . '/txthinking/mailer/src'),
15 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 15 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
@@ -26,7 +26,7 @@ return array( @@ -26,7 +26,7 @@ return array(
26 'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'), 26 'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
27 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 27 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
28 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 28 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
29 - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 29 + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),
30 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 30 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
31 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 31 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
32 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 32 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
@@ -38,6 +38,7 @@ return array( @@ -38,6 +38,7 @@ return array(
38 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), 38 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'),
39 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 39 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
40 'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'), 40 'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'),
  41 + 'Kkokk\\Poster\\' => array($vendorDir . '/kkokk/poster/src'),
41 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 42 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
42 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 43 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
43 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), 44 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
@@ -77,6 +77,10 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65 @@ -77,6 +77,10 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65
77 'Monolog\\' => 8, 77 'Monolog\\' => 8,
78 'Matrix\\' => 7, 78 'Matrix\\' => 7,
79 ), 79 ),
  80 + 'K' =>
  81 + array (
  82 + 'Kkokk\\Poster\\' => 13,
  83 + ),
80 'G' => 84 'G' =>
81 array ( 85 array (
82 'GuzzleHttp\\Psr7\\' => 16, 86 'GuzzleHttp\\Psr7\\' => 16,
@@ -109,9 +113,9 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65 @@ -109,9 +113,9 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65
109 ), 113 ),
110 'think\\' => 114 'think\\' =>
111 array ( 115 array (
112 - 0 => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src',  
113 - 1 => __DIR__ . '/..' . '/topthink/think-queue/src',  
114 - 2 => __DIR__ . '/../..' . '/thinkphp/library/think', 116 + 0 => __DIR__ . '/../..' . '/thinkphp/library/think',
  117 + 1 => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src',
  118 + 2 => __DIR__ . '/..' . '/topthink/think-queue/src',
115 ), 119 ),
116 'ZipStream\\' => 120 'ZipStream\\' =>
117 array ( 121 array (
@@ -179,8 +183,8 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65 @@ -179,8 +183,8 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65
179 ), 183 ),
180 'Psr\\Http\\Message\\' => 184 'Psr\\Http\\Message\\' =>
181 array ( 185 array (
182 - 0 => __DIR__ . '/..' . '/psr/http-factory/src',  
183 - 1 => __DIR__ . '/..' . '/psr/http-message/src', 186 + 0 => __DIR__ . '/..' . '/psr/http-message/src',
  187 + 1 => __DIR__ . '/..' . '/psr/http-factory/src',
184 ), 188 ),
185 'Psr\\Http\\Client\\' => 189 'Psr\\Http\\Client\\' =>
186 array ( 190 array (
@@ -226,6 +230,10 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65 @@ -226,6 +230,10 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65
226 array ( 230 array (
227 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src', 231 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src',
228 ), 232 ),
  233 + 'Kkokk\\Poster\\' =>
  234 + array (
  235 + 0 => __DIR__ . '/..' . '/kkokk/poster/src',
  236 + ),
229 'GuzzleHttp\\Psr7\\' => 237 'GuzzleHttp\\Psr7\\' =>
230 array ( 238 array (
231 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', 239 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
@@ -274,7 +282,7 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65 @@ -274,7 +282,7 @@ class ComposerStaticInit73f9e72fede2c36621e52f7b610bbb65
274 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 282 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
275 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 283 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
276 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 284 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
277 - 'Stringable' => __DIR__ . '/..' . '/myclabs/php-enum/stubs/Stringable.php', 285 + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
278 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 286 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
279 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 287 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
280 ); 288 );
@@ -4,11 +4,22 @@ @@ -4,11 +4,22 @@
4 "name": "easywechat-composer/easywechat-composer", 4 "name": "easywechat-composer/easywechat-composer",
5 "version": "1.4.1", 5 "version": "1.4.1",
6 "version_normalized": "1.4.1.0", 6 "version_normalized": "1.4.1.0",
  7 + "source": {
  8 + "type": "git",
  9 + "url": "https://github.com/mingyoung/easywechat-composer.git",
  10 + "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd"
  11 + },
7 "dist": { 12 "dist": {
8 "type": "zip", 13 "type": "zip",
9 - "url": "https://mirrors.cloud.tencent.com/repository/composer/easywechat-composer/easywechat-composer/1.4.1/easywechat-composer-easywechat-composer-1.4.1.zip", 14 + "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
10 "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", 15 "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
11 - "shasum": "" 16 + "shasum": "",
  17 + "mirrors": [
  18 + {
  19 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  20 + "preferred": true
  21 + }
  22 + ]
12 }, 23 },
13 "require": { 24 "require": {
14 "composer-plugin-api": "^1.0 || ^2.0", 25 "composer-plugin-api": "^1.0 || ^2.0",
@@ -29,6 +40,7 @@ @@ -29,6 +40,7 @@
29 "EasyWeChatComposer\\": "src/" 40 "EasyWeChatComposer\\": "src/"
30 } 41 }
31 }, 42 },
  43 + "notification-url": "https://packagist.org/downloads/",
32 "license": [ 44 "license": [
33 "MIT" 45 "MIT"
34 ], 46 ],
@@ -39,17 +51,32 @@ @@ -39,17 +51,32 @@
39 } 51 }
40 ], 52 ],
41 "description": "The composer plugin for EasyWeChat", 53 "description": "The composer plugin for EasyWeChat",
  54 + "support": {
  55 + "issues": "https://github.com/mingyoung/easywechat-composer/issues",
  56 + "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1"
  57 + },
42 "install-path": "../easywechat-composer/easywechat-composer" 58 "install-path": "../easywechat-composer/easywechat-composer"
43 }, 59 },
44 { 60 {
45 "name": "ezyang/htmlpurifier", 61 "name": "ezyang/htmlpurifier",
46 "version": "v4.16.0", 62 "version": "v4.16.0",
47 "version_normalized": "4.16.0.0", 63 "version_normalized": "4.16.0.0",
  64 + "source": {
  65 + "type": "git",
  66 + "url": "https://github.com/ezyang/htmlpurifier.git",
  67 + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
  68 + },
48 "dist": { 69 "dist": {
49 "type": "zip", 70 "type": "zip",
50 - "url": "https://mirrors.cloud.tencent.com/repository/composer/ezyang/htmlpurifier/v4.16.0/ezyang-htmlpurifier-v4.16.0.zip", 71 + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
51 "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", 72 "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
52 - "shasum": "" 73 + "shasum": "",
  74 + "mirrors": [
  75 + {
  76 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  77 + "preferred": true
  78 + }
  79 + ]
53 }, 80 },
54 "require": { 81 "require": {
55 "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" 82 "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
@@ -78,6 +105,7 @@ @@ -78,6 +105,7 @@
78 "/library/HTMLPurifier/Language/" 105 "/library/HTMLPurifier/Language/"
79 ] 106 ]
80 }, 107 },
  108 + "notification-url": "https://packagist.org/downloads/",
81 "license": [ 109 "license": [
82 "LGPL-2.1-or-later" 110 "LGPL-2.1-or-later"
83 ], 111 ],
@@ -93,22 +121,37 @@ @@ -93,22 +121,37 @@
93 "keywords": [ 121 "keywords": [
94 "html" 122 "html"
95 ], 123 ],
  124 + "support": {
  125 + "issues": "https://github.com/ezyang/htmlpurifier/issues",
  126 + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
  127 + },
96 "install-path": "../ezyang/htmlpurifier" 128 "install-path": "../ezyang/htmlpurifier"
97 }, 129 },
98 { 130 {
99 "name": "guzzlehttp/guzzle", 131 "name": "guzzlehttp/guzzle",
100 - "version": "7.5.0",  
101 - "version_normalized": "7.5.0.0", 132 + "version": "7.7.0",
  133 + "version_normalized": "7.7.0.0",
  134 + "source": {
  135 + "type": "git",
  136 + "url": "https://github.com/guzzle/guzzle.git",
  137 + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5"
  138 + },
102 "dist": { 139 "dist": {
103 "type": "zip", 140 "type": "zip",
104 - "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/guzzle/7.5.0/guzzlehttp-guzzle-7.5.0.zip",  
105 - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba",  
106 - "shasum": "" 141 + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5",
  142 + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5",
  143 + "shasum": "",
  144 + "mirrors": [
  145 + {
  146 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  147 + "preferred": true
  148 + }
  149 + ]
107 }, 150 },
108 "require": { 151 "require": {
109 "ext-json": "*", 152 "ext-json": "*",
110 - "guzzlehttp/promises": "^1.5",  
111 - "guzzlehttp/psr7": "^1.9 || ^2.4", 153 + "guzzlehttp/promises": "^1.5.3 || ^2.0",
  154 + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
112 "php": "^7.2.5 || ^8.0", 155 "php": "^7.2.5 || ^8.0",
113 "psr/http-client": "^1.0", 156 "psr/http-client": "^1.0",
114 "symfony/deprecation-contracts": "^2.2 || ^3.0" 157 "symfony/deprecation-contracts": "^2.2 || ^3.0"
@@ -119,7 +162,8 @@ @@ -119,7 +162,8 @@
119 "require-dev": { 162 "require-dev": {
120 "bamarni/composer-bin-plugin": "^1.8.1", 163 "bamarni/composer-bin-plugin": "^1.8.1",
121 "ext-curl": "*", 164 "ext-curl": "*",
122 - "php-http/client-integration-tests": "^3.0", 165 + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
  166 + "php-http/message-factory": "^1.1",
123 "phpunit/phpunit": "^8.5.29 || ^9.5.23", 167 "phpunit/phpunit": "^8.5.29 || ^9.5.23",
124 "psr/log": "^1.1 || ^2.0 || ^3.0" 168 "psr/log": "^1.1 || ^2.0 || ^3.0"
125 }, 169 },
@@ -128,15 +172,12 @@ @@ -128,15 +172,12 @@
128 "ext-intl": "Required for Internationalized Domain Name (IDN) support", 172 "ext-intl": "Required for Internationalized Domain Name (IDN) support",
129 "psr/log": "Required for using the Log middleware" 173 "psr/log": "Required for using the Log middleware"
130 }, 174 },
131 - "time": "2022-08-28T15:39:27+00:00", 175 + "time": "2023-05-21T14:04:53+00:00",
132 "type": "library", 176 "type": "library",
133 "extra": { 177 "extra": {
134 "bamarni-bin": { 178 "bamarni-bin": {
135 "bin-links": true, 179 "bin-links": true,
136 "forward-command": false 180 "forward-command": false
137 - },  
138 - "branch-alias": {  
139 - "dev-master": "7.5-dev"  
140 } 181 }
141 }, 182 },
142 "installation-source": "dist", 183 "installation-source": "dist",
@@ -148,6 +189,7 @@ @@ -148,6 +189,7 @@
148 "GuzzleHttp\\": "src/" 189 "GuzzleHttp\\": "src/"
149 } 190 }
150 }, 191 },
  192 + "notification-url": "https://packagist.org/downloads/",
151 "license": [ 193 "license": [
152 "MIT" 194 "MIT"
153 ], 195 ],
@@ -200,17 +242,46 @@ @@ -200,17 +242,46 @@
200 "rest", 242 "rest",
201 "web service" 243 "web service"
202 ], 244 ],
  245 + "support": {
  246 + "issues": "https://github.com/guzzle/guzzle/issues",
  247 + "source": "https://github.com/guzzle/guzzle/tree/7.7.0"
  248 + },
  249 + "funding": [
  250 + {
  251 + "url": "https://github.com/GrahamCampbell",
  252 + "type": "github"
  253 + },
  254 + {
  255 + "url": "https://github.com/Nyholm",
  256 + "type": "github"
  257 + },
  258 + {
  259 + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
  260 + "type": "tidelift"
  261 + }
  262 + ],
203 "install-path": "../guzzlehttp/guzzle" 263 "install-path": "../guzzlehttp/guzzle"
204 }, 264 },
205 { 265 {
206 "name": "guzzlehttp/promises", 266 "name": "guzzlehttp/promises",
207 - "version": "1.5.2",  
208 - "version_normalized": "1.5.2.0", 267 + "version": "1.5.3",
  268 + "version_normalized": "1.5.3.0",
  269 + "source": {
  270 + "type": "git",
  271 + "url": "https://github.com/guzzle/promises.git",
  272 + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e"
  273 + },
209 "dist": { 274 "dist": {
210 "type": "zip", 275 "type": "zip",
211 - "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/promises/1.5.2/guzzlehttp-promises-1.5.2.zip",  
212 - "reference": "b94b2807d85443f9719887892882d0329d1e2598",  
213 - "shasum": "" 276 + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e",
  277 + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e",
  278 + "shasum": "",
  279 + "mirrors": [
  280 + {
  281 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  282 + "preferred": true
  283 + }
  284 + ]
214 }, 285 },
215 "require": { 286 "require": {
216 "php": ">=5.5" 287 "php": ">=5.5"
@@ -218,13 +289,8 @@ @@ -218,13 +289,8 @@
218 "require-dev": { 289 "require-dev": {
219 "symfony/phpunit-bridge": "^4.4 || ^5.1" 290 "symfony/phpunit-bridge": "^4.4 || ^5.1"
220 }, 291 },
221 - "time": "2022-08-28T14:55:35+00:00", 292 + "time": "2023-05-21T12:31:43+00:00",
222 "type": "library", 293 "type": "library",
223 - "extra": {  
224 - "branch-alias": {  
225 - "dev-master": "1.5-dev"  
226 - }  
227 - },  
228 "installation-source": "dist", 294 "installation-source": "dist",
229 "autoload": { 295 "autoload": {
230 "files": [ 296 "files": [
@@ -234,6 +300,7 @@ @@ -234,6 +300,7 @@
234 "GuzzleHttp\\Promise\\": "src/" 300 "GuzzleHttp\\Promise\\": "src/"
235 } 301 }
236 }, 302 },
  303 + "notification-url": "https://packagist.org/downloads/",
237 "license": [ 304 "license": [
238 "MIT" 305 "MIT"
239 ], 306 ],
@@ -263,22 +330,51 @@ @@ -263,22 +330,51 @@
263 "keywords": [ 330 "keywords": [
264 "promise" 331 "promise"
265 ], 332 ],
  333 + "support": {
  334 + "issues": "https://github.com/guzzle/promises/issues",
  335 + "source": "https://github.com/guzzle/promises/tree/1.5.3"
  336 + },
  337 + "funding": [
  338 + {
  339 + "url": "https://github.com/GrahamCampbell",
  340 + "type": "github"
  341 + },
  342 + {
  343 + "url": "https://github.com/Nyholm",
  344 + "type": "github"
  345 + },
  346 + {
  347 + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
  348 + "type": "tidelift"
  349 + }
  350 + ],
266 "install-path": "../guzzlehttp/promises" 351 "install-path": "../guzzlehttp/promises"
267 }, 352 },
268 { 353 {
269 "name": "guzzlehttp/psr7", 354 "name": "guzzlehttp/psr7",
270 - "version": "2.4.3",  
271 - "version_normalized": "2.4.3.0", 355 + "version": "2.5.0",
  356 + "version_normalized": "2.5.0.0",
  357 + "source": {
  358 + "type": "git",
  359 + "url": "https://github.com/guzzle/psr7.git",
  360 + "reference": "b635f279edd83fc275f822a1188157ffea568ff6"
  361 + },
272 "dist": { 362 "dist": {
273 "type": "zip", 363 "type": "zip",
274 - "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/psr7/2.4.3/guzzlehttp-psr7-2.4.3.zip",  
275 - "reference": "67c26b443f348a51926030c83481b85718457d3d",  
276 - "shasum": "" 364 + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
  365 + "reference": "b635f279edd83fc275f822a1188157ffea568ff6",
  366 + "shasum": "",
  367 + "mirrors": [
  368 + {
  369 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  370 + "preferred": true
  371 + }
  372 + ]
277 }, 373 },
278 "require": { 374 "require": {
279 "php": "^7.2.5 || ^8.0", 375 "php": "^7.2.5 || ^8.0",
280 "psr/http-factory": "^1.0", 376 "psr/http-factory": "^1.0",
281 - "psr/http-message": "^1.0", 377 + "psr/http-message": "^1.1 || ^2.0",
282 "ralouphie/getallheaders": "^3.0" 378 "ralouphie/getallheaders": "^3.0"
283 }, 379 },
284 "provide": { 380 "provide": {
@@ -293,15 +389,12 @@ @@ -293,15 +389,12 @@
293 "suggest": { 389 "suggest": {
294 "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 390 "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
295 }, 391 },
296 - "time": "2022-10-26T14:07:24+00:00", 392 + "time": "2023-04-17T16:11:26+00:00",
297 "type": "library", 393 "type": "library",
298 "extra": { 394 "extra": {
299 "bamarni-bin": { 395 "bamarni-bin": {
300 "bin-links": true, 396 "bin-links": true,
301 "forward-command": false 397 "forward-command": false
302 - },  
303 - "branch-alias": {  
304 - "dev-master": "2.4-dev"  
305 } 398 }
306 }, 399 },
307 "installation-source": "dist", 400 "installation-source": "dist",
@@ -310,6 +403,7 @@ @@ -310,6 +403,7 @@
310 "GuzzleHttp\\Psr7\\": "src/" 403 "GuzzleHttp\\Psr7\\": "src/"
311 } 404 }
312 }, 405 },
  406 + "notification-url": "https://packagist.org/downloads/",
313 "license": [ 407 "license": [
314 "MIT" 408 "MIT"
315 ], 409 ],
@@ -361,17 +455,46 @@ @@ -361,17 +455,46 @@
361 "uri", 455 "uri",
362 "url" 456 "url"
363 ], 457 ],
  458 + "support": {
  459 + "issues": "https://github.com/guzzle/psr7/issues",
  460 + "source": "https://github.com/guzzle/psr7/tree/2.5.0"
  461 + },
  462 + "funding": [
  463 + {
  464 + "url": "https://github.com/GrahamCampbell",
  465 + "type": "github"
  466 + },
  467 + {
  468 + "url": "https://github.com/Nyholm",
  469 + "type": "github"
  470 + },
  471 + {
  472 + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
  473 + "type": "tidelift"
  474 + }
  475 + ],
364 "install-path": "../guzzlehttp/psr7" 476 "install-path": "../guzzlehttp/psr7"
365 }, 477 },
366 { 478 {
367 "name": "karsonzhang/fastadmin-addons", 479 "name": "karsonzhang/fastadmin-addons",
368 "version": "1.3.3", 480 "version": "1.3.3",
369 "version_normalized": "1.3.3.0", 481 "version_normalized": "1.3.3.0",
  482 + "source": {
  483 + "type": "git",
  484 + "url": "https://github.com/karsonzhang/fastadmin-addons.git",
  485 + "reference": "f5bb4dabda55271b08371a8ae9355a205be48c56"
  486 + },
370 "dist": { 487 "dist": {
371 "type": "zip", 488 "type": "zip",
372 - "url": "https://mirrors.cloud.tencent.com/repository/composer/karsonzhang/fastadmin-addons/1.3.3/karsonzhang-fastadmin-addons-1.3.3.zip", 489 + "url": "https://api.github.com/repos/karsonzhang/fastadmin-addons/zipball/f5bb4dabda55271b08371a8ae9355a205be48c56",
373 "reference": "f5bb4dabda55271b08371a8ae9355a205be48c56", 490 "reference": "f5bb4dabda55271b08371a8ae9355a205be48c56",
374 - "shasum": "" 491 + "shasum": "",
  492 + "mirrors": [
  493 + {
  494 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  495 + "preferred": true
  496 + }
  497 + ]
375 }, 498 },
376 "require": { 499 "require": {
377 "nelexa/zip": "^3.3", 500 "nelexa/zip": "^3.3",
@@ -394,6 +517,7 @@ @@ -394,6 +517,7 @@
394 "think\\": "src/" 517 "think\\": "src/"
395 } 518 }
396 }, 519 },
  520 + "notification-url": "https://packagist.org/downloads/",
397 "license": [ 521 "license": [
398 "Apache-2.0" 522 "Apache-2.0"
399 ], 523 ],
@@ -409,17 +533,85 @@ @@ -409,17 +533,85 @@
409 ], 533 ],
410 "description": "addons package for fastadmin", 534 "description": "addons package for fastadmin",
411 "homepage": "https://github.com/karsonzhang/fastadmin-addons", 535 "homepage": "https://github.com/karsonzhang/fastadmin-addons",
  536 + "support": {
  537 + "issues": "https://github.com/karsonzhang/fastadmin-addons/issues",
  538 + "source": "https://github.com/karsonzhang/fastadmin-addons/tree/v1.3.3"
  539 + },
412 "install-path": "../karsonzhang/fastadmin-addons" 540 "install-path": "../karsonzhang/fastadmin-addons"
413 }, 541 },
414 { 542 {
  543 + "name": "kkokk/poster",
  544 + "version": "v2.0.6",
  545 + "version_normalized": "2.0.6.0",
  546 + "source": {
  547 + "type": "git",
  548 + "url": "https://github.com/kkokk/poster.git",
  549 + "reference": "a657ab240330b2d667416431fd7454dff73bebdf"
  550 + },
  551 + "dist": {
  552 + "type": "zip",
  553 + "url": "https://api.github.com/repos/kkokk/poster/zipball/a657ab240330b2d667416431fd7454dff73bebdf",
  554 + "reference": "a657ab240330b2d667416431fd7454dff73bebdf",
  555 + "shasum": "",
  556 + "mirrors": [
  557 + {
  558 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  559 + "preferred": true
  560 + }
  561 + ]
  562 + },
  563 + "require": {
  564 + "ext-gd": "*",
  565 + "ext-iconv": "*",
  566 + "ext-json": "*",
  567 + "ext-mbstring": "*",
  568 + "php": ">=5.6.0"
  569 + },
  570 + "time": "2023-05-19T10:39:17+00:00",
  571 + "type": "project",
  572 + "installation-source": "dist",
  573 + "autoload": {
  574 + "psr-4": {
  575 + "Kkokk\\Poster\\": "src/"
  576 + }
  577 + },
  578 + "notification-url": "https://packagist.org/downloads/",
  579 + "license": [
  580 + "MIT"
  581 + ],
  582 + "authors": [
  583 + {
  584 + "name": "lang",
  585 + "email": "732853989@qq.com"
  586 + }
  587 + ],
  588 + "description": "PHP生成海报",
  589 + "support": {
  590 + "issues": "https://github.com/kkokk/poster/issues",
  591 + "source": "https://github.com/kkokk/poster/tree/v2.0.6"
  592 + },
  593 + "install-path": "../kkokk/poster"
  594 + },
  595 + {
415 "name": "maennchen/zipstream-php", 596 "name": "maennchen/zipstream-php",
416 "version": "2.2.6", 597 "version": "2.2.6",
417 "version_normalized": "2.2.6.0", 598 "version_normalized": "2.2.6.0",
  599 + "source": {
  600 + "type": "git",
  601 + "url": "https://github.com/maennchen/ZipStream-PHP.git",
  602 + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f"
  603 + },
418 "dist": { 604 "dist": {
419 "type": "zip", 605 "type": "zip",
420 - "url": "https://mirrors.cloud.tencent.com/repository/composer/maennchen/zipstream-php/2.2.6/maennchen-zipstream-php-2.2.6.zip", 606 + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f",
421 "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", 607 "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f",
422 - "shasum": "" 608 + "shasum": "",
  609 + "mirrors": [
  610 + {
  611 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  612 + "preferred": true
  613 + }
  614 + ]
423 }, 615 },
424 "require": { 616 "require": {
425 "myclabs/php-enum": "^1.5", 617 "myclabs/php-enum": "^1.5",
@@ -444,6 +636,7 @@ @@ -444,6 +636,7 @@
444 "ZipStream\\": "src/" 636 "ZipStream\\": "src/"
445 } 637 }
446 }, 638 },
  639 + "notification-url": "https://packagist.org/downloads/",
447 "license": [ 640 "license": [
448 "MIT" 641 "MIT"
449 ], 642 ],
@@ -470,17 +663,42 @@ @@ -470,17 +663,42 @@
470 "stream", 663 "stream",
471 "zip" 664 "zip"
472 ], 665 ],
  666 + "support": {
  667 + "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
  668 + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6"
  669 + },
  670 + "funding": [
  671 + {
  672 + "url": "https://github.com/maennchen",
  673 + "type": "github"
  674 + },
  675 + {
  676 + "url": "https://opencollective.com/zipstream",
  677 + "type": "open_collective"
  678 + }
  679 + ],
473 "install-path": "../maennchen/zipstream-php" 680 "install-path": "../maennchen/zipstream-php"
474 }, 681 },
475 { 682 {
476 "name": "markbaker/complex", 683 "name": "markbaker/complex",
477 "version": "3.0.2", 684 "version": "3.0.2",
478 "version_normalized": "3.0.2.0", 685 "version_normalized": "3.0.2.0",
  686 + "source": {
  687 + "type": "git",
  688 + "url": "https://github.com/MarkBaker/PHPComplex.git",
  689 + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
  690 + },
479 "dist": { 691 "dist": {
480 "type": "zip", 692 "type": "zip",
481 - "url": "https://mirrors.cloud.tencent.com/repository/composer/markbaker/complex/3.0.2/markbaker-complex-3.0.2.zip", 693 + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
482 "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", 694 "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
483 - "shasum": "" 695 + "shasum": "",
  696 + "mirrors": [
  697 + {
  698 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  699 + "preferred": true
  700 + }
  701 + ]
484 }, 702 },
485 "require": { 703 "require": {
486 "php": "^7.2 || ^8.0" 704 "php": "^7.2 || ^8.0"
@@ -499,6 +717,7 @@ @@ -499,6 +717,7 @@
499 "Complex\\": "classes/src/" 717 "Complex\\": "classes/src/"
500 } 718 }
501 }, 719 },
  720 + "notification-url": "https://packagist.org/downloads/",
502 "license": [ 721 "license": [
503 "MIT" 722 "MIT"
504 ], 723 ],
@@ -514,17 +733,32 @@ @@ -514,17 +733,32 @@
514 "complex", 733 "complex",
515 "mathematics" 734 "mathematics"
516 ], 735 ],
  736 + "support": {
  737 + "issues": "https://github.com/MarkBaker/PHPComplex/issues",
  738 + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
  739 + },
517 "install-path": "../markbaker/complex" 740 "install-path": "../markbaker/complex"
518 }, 741 },
519 { 742 {
520 "name": "markbaker/matrix", 743 "name": "markbaker/matrix",
521 "version": "3.0.1", 744 "version": "3.0.1",
522 "version_normalized": "3.0.1.0", 745 "version_normalized": "3.0.1.0",
  746 + "source": {
  747 + "type": "git",
  748 + "url": "https://github.com/MarkBaker/PHPMatrix.git",
  749 + "reference": "728434227fe21be27ff6d86621a1b13107a2562c"
  750 + },
523 "dist": { 751 "dist": {
524 "type": "zip", 752 "type": "zip",
525 - "url": "https://mirrors.cloud.tencent.com/repository/composer/markbaker/matrix/3.0.1/markbaker-matrix-3.0.1.zip", 753 + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
526 "reference": "728434227fe21be27ff6d86621a1b13107a2562c", 754 "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
527 - "shasum": "" 755 + "shasum": "",
  756 + "mirrors": [
  757 + {
  758 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  759 + "preferred": true
  760 + }
  761 + ]
528 }, 762 },
529 "require": { 763 "require": {
530 "php": "^7.1 || ^8.0" 764 "php": "^7.1 || ^8.0"
@@ -547,6 +781,7 @@ @@ -547,6 +781,7 @@
547 "Matrix\\": "classes/src/" 781 "Matrix\\": "classes/src/"
548 } 782 }
549 }, 783 },
  784 + "notification-url": "https://packagist.org/downloads/",
550 "license": [ 785 "license": [
551 "MIT" 786 "MIT"
552 ], 787 ],
@@ -563,17 +798,32 @@ @@ -563,17 +798,32 @@
563 "matrix", 798 "matrix",
564 "vector" 799 "vector"
565 ], 800 ],
  801 + "support": {
  802 + "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
  803 + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
  804 + },
566 "install-path": "../markbaker/matrix" 805 "install-path": "../markbaker/matrix"
567 }, 806 },
568 { 807 {
569 "name": "monolog/monolog", 808 "name": "monolog/monolog",
570 - "version": "2.8.0",  
571 - "version_normalized": "2.8.0.0", 809 + "version": "2.9.0",
  810 + "version_normalized": "2.9.0.0",
  811 + "source": {
  812 + "type": "git",
  813 + "url": "https://github.com/Seldaek/monolog.git",
  814 + "reference": "e1c0ae1528ce313a450e5e1ad782765c4a8dd3cb"
  815 + },
572 "dist": { 816 "dist": {
573 "type": "zip", 817 "type": "zip",
574 - "url": "https://mirrors.cloud.tencent.com/repository/composer/monolog/monolog/2.8.0/monolog-monolog-2.8.0.zip",  
575 - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50",  
576 - "shasum": "" 818 + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e1c0ae1528ce313a450e5e1ad782765c4a8dd3cb",
  819 + "reference": "e1c0ae1528ce313a450e5e1ad782765c4a8dd3cb",
  820 + "shasum": "",
  821 + "mirrors": [
  822 + {
  823 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  824 + "preferred": true
  825 + }
  826 + ]
577 }, 827 },
578 "require": { 828 "require": {
579 "php": ">=7.2", 829 "php": ">=7.2",
@@ -587,7 +837,7 @@ @@ -587,7 +837,7 @@
587 "doctrine/couchdb": "~1.0@dev", 837 "doctrine/couchdb": "~1.0@dev",
588 "elasticsearch/elasticsearch": "^7 || ^8", 838 "elasticsearch/elasticsearch": "^7 || ^8",
589 "ext-json": "*", 839 "ext-json": "*",
590 - "graylog2/gelf-php": "^1.4.2", 840 + "graylog2/gelf-php": "^1.4.2 || ^2@dev",
591 "guzzlehttp/guzzle": "^7.4", 841 "guzzlehttp/guzzle": "^7.4",
592 "guzzlehttp/psr7": "^2.2", 842 "guzzlehttp/psr7": "^2.2",
593 "mongodb/mongodb": "^1.8", 843 "mongodb/mongodb": "^1.8",
@@ -618,7 +868,7 @@ @@ -618,7 +868,7 @@
618 "rollbar/rollbar": "Allow sending log messages to Rollbar", 868 "rollbar/rollbar": "Allow sending log messages to Rollbar",
619 "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 869 "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
620 }, 870 },
621 - "time": "2022-07-24T11:55:47+00:00", 871 + "time": "2023-02-05T13:07:32+00:00",
622 "type": "library", 872 "type": "library",
623 "extra": { 873 "extra": {
624 "branch-alias": { 874 "branch-alias": {
@@ -631,6 +881,7 @@ @@ -631,6 +881,7 @@
631 "Monolog\\": "src/Monolog" 881 "Monolog\\": "src/Monolog"
632 } 882 }
633 }, 883 },
  884 + "notification-url": "https://packagist.org/downloads/",
634 "license": [ 885 "license": [
635 "MIT" 886 "MIT"
636 ], 887 ],
@@ -648,17 +899,42 @@ @@ -648,17 +899,42 @@
648 "logging", 899 "logging",
649 "psr-3" 900 "psr-3"
650 ], 901 ],
  902 + "support": {
  903 + "issues": "https://github.com/Seldaek/monolog/issues",
  904 + "source": "https://github.com/Seldaek/monolog/tree/2.9.0"
  905 + },
  906 + "funding": [
  907 + {
  908 + "url": "https://github.com/Seldaek",
  909 + "type": "github"
  910 + },
  911 + {
  912 + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
  913 + "type": "tidelift"
  914 + }
  915 + ],
651 "install-path": "../monolog/monolog" 916 "install-path": "../monolog/monolog"
652 }, 917 },
653 { 918 {
654 "name": "myclabs/php-enum", 919 "name": "myclabs/php-enum",
655 - "version": "1.8.4",  
656 - "version_normalized": "1.8.4.0", 920 + "version": "1.8.3",
  921 + "version_normalized": "1.8.3.0",
  922 + "source": {
  923 + "type": "git",
  924 + "url": "https://github.com/myclabs/php-enum.git",
  925 + "reference": "b942d263c641ddb5190929ff840c68f78713e937"
  926 + },
657 "dist": { 927 "dist": {
658 "type": "zip", 928 "type": "zip",
659 - "url": "https://mirrors.cloud.tencent.com/repository/composer/myclabs/php-enum/1.8.4/myclabs-php-enum-1.8.4.zip",  
660 - "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483",  
661 - "shasum": "" 929 + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937",
  930 + "reference": "b942d263c641ddb5190929ff840c68f78713e937",
  931 + "shasum": "",
  932 + "mirrors": [
  933 + {
  934 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  935 + "preferred": true
  936 + }
  937 + ]
662 }, 938 },
663 "require": { 939 "require": {
664 "ext-json": "*", 940 "ext-json": "*",
@@ -669,17 +945,15 @@ @@ -669,17 +945,15 @@
669 "squizlabs/php_codesniffer": "1.*", 945 "squizlabs/php_codesniffer": "1.*",
670 "vimeo/psalm": "^4.6.2" 946 "vimeo/psalm": "^4.6.2"
671 }, 947 },
672 - "time": "2022-08-04T09:53:51+00:00", 948 + "time": "2021-07-05T08:18:36+00:00",
673 "type": "library", 949 "type": "library",
674 "installation-source": "dist", 950 "installation-source": "dist",
675 "autoload": { 951 "autoload": {
676 "psr-4": { 952 "psr-4": {
677 "MyCLabs\\Enum\\": "src/" 953 "MyCLabs\\Enum\\": "src/"
678 - },  
679 - "classmap": [  
680 - "stubs/Stringable.php"  
681 - ] 954 + }
682 }, 955 },
  956 + "notification-url": "https://packagist.org/downloads/",
683 "license": [ 957 "license": [
684 "MIT" 958 "MIT"
685 ], 959 ],
@@ -694,17 +968,42 @@ @@ -694,17 +968,42 @@
694 "keywords": [ 968 "keywords": [
695 "enum" 969 "enum"
696 ], 970 ],
  971 + "support": {
  972 + "issues": "https://github.com/myclabs/php-enum/issues",
  973 + "source": "https://github.com/myclabs/php-enum/tree/1.8.3"
  974 + },
  975 + "funding": [
  976 + {
  977 + "url": "https://github.com/mnapoli",
  978 + "type": "github"
  979 + },
  980 + {
  981 + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
  982 + "type": "tidelift"
  983 + }
  984 + ],
697 "install-path": "../myclabs/php-enum" 985 "install-path": "../myclabs/php-enum"
698 }, 986 },
699 { 987 {
700 "name": "nelexa/zip", 988 "name": "nelexa/zip",
701 "version": "3.3.3", 989 "version": "3.3.3",
702 "version_normalized": "3.3.3.0", 990 "version_normalized": "3.3.3.0",
  991 + "source": {
  992 + "type": "git",
  993 + "url": "https://github.com/Ne-Lexa/php-zip.git",
  994 + "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6"
  995 + },
703 "dist": { 996 "dist": {
704 "type": "zip", 997 "type": "zip",
705 - "url": "https://mirrors.cloud.tencent.com/repository/composer/nelexa/zip/3.3.3/nelexa-zip-3.3.3.zip", 998 + "url": "https://api.github.com/repos/Ne-Lexa/php-zip/zipball/501b52f6fc393a599b44ff348a42740e1eaac7c6",
706 "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6", 999 "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6",
707 - "shasum": "" 1000 + "shasum": "",
  1001 + "mirrors": [
  1002 + {
  1003 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1004 + "preferred": true
  1005 + }
  1006 + ]
708 }, 1007 },
709 "require": { 1008 "require": {
710 "ext-zlib": "*", 1009 "ext-zlib": "*",
@@ -736,6 +1035,7 @@ @@ -736,6 +1035,7 @@
736 "PhpZip\\": "src/" 1035 "PhpZip\\": "src/"
737 } 1036 }
738 }, 1037 },
  1038 + "notification-url": "https://packagist.org/downloads/",
739 "license": [ 1039 "license": [
740 "MIT" 1040 "MIT"
741 ], 1041 ],
@@ -757,17 +1057,32 @@ @@ -757,17 +1057,32 @@
757 "zipalign", 1057 "zipalign",
758 "ziparchive" 1058 "ziparchive"
759 ], 1059 ],
  1060 + "support": {
  1061 + "issues": "https://github.com/Ne-Lexa/php-zip/issues",
  1062 + "source": "https://github.com/Ne-Lexa/php-zip/tree/3.3.3"
  1063 + },
760 "install-path": "../nelexa/zip" 1064 "install-path": "../nelexa/zip"
761 }, 1065 },
762 { 1066 {
763 "name": "overtrue/pinyin", 1067 "name": "overtrue/pinyin",
764 "version": "3.0.6", 1068 "version": "3.0.6",
765 "version_normalized": "3.0.6.0", 1069 "version_normalized": "3.0.6.0",
  1070 + "source": {
  1071 + "type": "git",
  1072 + "url": "https://github.com/overtrue/pinyin.git",
  1073 + "reference": "3b781d267197b74752daa32814d3a2cf5d140779"
  1074 + },
766 "dist": { 1075 "dist": {
767 "type": "zip", 1076 "type": "zip",
768 - "url": "https://mirrors.cloud.tencent.com/repository/composer/overtrue/pinyin/3.0.6/overtrue-pinyin-3.0.6.zip", 1077 + "url": "https://api.github.com/repos/overtrue/pinyin/zipball/3b781d267197b74752daa32814d3a2cf5d140779",
769 "reference": "3b781d267197b74752daa32814d3a2cf5d140779", 1078 "reference": "3b781d267197b74752daa32814d3a2cf5d140779",
770 - "shasum": "" 1079 + "shasum": "",
  1080 + "mirrors": [
  1081 + {
  1082 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1083 + "preferred": true
  1084 + }
  1085 + ]
771 }, 1086 },
772 "require": { 1087 "require": {
773 "php": ">=5.3" 1088 "php": ">=5.3"
@@ -783,6 +1098,7 @@ @@ -783,6 +1098,7 @@
783 "Overtrue\\Pinyin\\": "src/" 1098 "Overtrue\\Pinyin\\": "src/"
784 } 1099 }
785 }, 1100 },
  1101 + "notification-url": "https://packagist.org/downloads/",
786 "license": [ 1102 "license": [
787 "MIT" 1103 "MIT"
788 ], 1104 ],
@@ -799,17 +1115,32 @@ @@ -799,17 +1115,32 @@
799 "Pinyin", 1115 "Pinyin",
800 "cn2pinyin" 1116 "cn2pinyin"
801 ], 1117 ],
  1118 + "support": {
  1119 + "issues": "https://github.com/overtrue/pinyin/issues",
  1120 + "source": "https://github.com/overtrue/pinyin/tree/master"
  1121 + },
802 "install-path": "../overtrue/pinyin" 1122 "install-path": "../overtrue/pinyin"
803 }, 1123 },
804 { 1124 {
805 "name": "overtrue/socialite", 1125 "name": "overtrue/socialite",
806 "version": "2.0.24", 1126 "version": "2.0.24",
807 "version_normalized": "2.0.24.0", 1127 "version_normalized": "2.0.24.0",
  1128 + "source": {
  1129 + "type": "git",
  1130 + "url": "https://github.com/overtrue/socialite.git",
  1131 + "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec"
  1132 + },
808 "dist": { 1133 "dist": {
809 "type": "zip", 1134 "type": "zip",
810 - "url": "https://mirrors.tencent.com/repository/composer/overtrue/socialite/2.0.24/overtrue-socialite-2.0.24.zip", 1135 + "url": "https://api.github.com/repos/overtrue/socialite/zipball/ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
811 "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec", 1136 "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
812 - "shasum": "" 1137 + "shasum": "",
  1138 + "mirrors": [
  1139 + {
  1140 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1141 + "preferred": true
  1142 + }
  1143 + ]
813 }, 1144 },
814 "require": { 1145 "require": {
815 "ext-json": "*", 1146 "ext-json": "*",
@@ -829,6 +1160,7 @@ @@ -829,6 +1160,7 @@
829 "Overtrue\\Socialite\\": "src/" 1160 "Overtrue\\Socialite\\": "src/"
830 } 1161 }
831 }, 1162 },
  1163 + "notification-url": "https://packagist.org/downloads/",
832 "license": [ 1164 "license": [
833 "MIT" 1165 "MIT"
834 ], 1166 ],
@@ -847,17 +1179,38 @@ @@ -847,17 +1179,38 @@
847 "wechat", 1179 "wechat",
848 "weibo" 1180 "weibo"
849 ], 1181 ],
  1182 + "support": {
  1183 + "issues": "https://github.com/overtrue/socialite/issues",
  1184 + "source": "https://github.com/overtrue/socialite/tree/2.0.24"
  1185 + },
  1186 + "funding": [
  1187 + {
  1188 + "url": "https://www.patreon.com/overtrue",
  1189 + "type": "patreon"
  1190 + }
  1191 + ],
850 "install-path": "../overtrue/socialite" 1192 "install-path": "../overtrue/socialite"
851 }, 1193 },
852 { 1194 {
853 "name": "overtrue/wechat", 1195 "name": "overtrue/wechat",
854 - "version": "4.7.0",  
855 - "version_normalized": "4.7.0.0", 1196 + "version": "4.6.0",
  1197 + "version_normalized": "4.6.0.0",
  1198 + "source": {
  1199 + "type": "git",
  1200 + "url": "https://github.com/w7corp/easywechat.git",
  1201 + "reference": "52af4cbe777cd4aea307beafa0a4518c347467b1"
  1202 + },
856 "dist": { 1203 "dist": {
857 "type": "zip", 1204 "type": "zip",
858 - "url": "https://mirrors.cloud.tencent.com/repository/composer/overtrue/wechat/4.7.0/overtrue-wechat-4.7.0.zip",  
859 - "reference": "4accb0627803ffb6e45d2988898a0293d2a48e68",  
860 - "shasum": "" 1205 + "url": "https://api.github.com/repos/w7corp/easywechat/zipball/52af4cbe777cd4aea307beafa0a4518c347467b1",
  1206 + "reference": "52af4cbe777cd4aea307beafa0a4518c347467b1",
  1207 + "shasum": "",
  1208 + "mirrors": [
  1209 + {
  1210 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1211 + "preferred": true
  1212 + }
  1213 + ]
861 }, 1214 },
862 "require": { 1215 "require": {
863 "easywechat-composer/easywechat-composer": "^1.1", 1216 "easywechat-composer/easywechat-composer": "^1.1",
@@ -882,7 +1235,7 @@ @@ -882,7 +1235,7 @@
882 "phpstan/phpstan": "^0.12.0", 1235 "phpstan/phpstan": "^0.12.0",
883 "phpunit/phpunit": "^7.5" 1236 "phpunit/phpunit": "^7.5"
884 }, 1237 },
885 - "time": "2022-10-21T07:00:02+00:00", 1238 + "time": "2022-08-24T07:30:42+00:00",
886 "type": "library", 1239 "type": "library",
887 "installation-source": "dist", 1240 "installation-source": "dist",
888 "autoload": { 1241 "autoload": {
@@ -894,6 +1247,7 @@ @@ -894,6 +1247,7 @@
894 "EasyWeChat\\": "src/" 1247 "EasyWeChat\\": "src/"
895 } 1248 }
896 }, 1249 },
  1250 + "notification-url": "https://packagist.org/downloads/",
897 "license": [ 1251 "license": [
898 "MIT" 1252 "MIT"
899 ], 1253 ],
@@ -911,17 +1265,39 @@ @@ -911,17 +1265,39 @@
911 "weixin", 1265 "weixin",
912 "weixin-sdk" 1266 "weixin-sdk"
913 ], 1267 ],
  1268 + "support": {
  1269 + "issues": "https://github.com/w7corp/easywechat/issues",
  1270 + "source": "https://github.com/w7corp/easywechat/tree/4.6.0"
  1271 + },
  1272 + "funding": [
  1273 + {
  1274 + "url": "https://github.com/overtrue",
  1275 + "type": "github"
  1276 + }
  1277 + ],
  1278 + "abandoned": "w7corp/easywechat",
914 "install-path": "../overtrue/wechat" 1279 "install-path": "../overtrue/wechat"
915 }, 1280 },
916 { 1281 {
917 "name": "paragonie/random_compat", 1282 "name": "paragonie/random_compat",
918 "version": "v9.99.100", 1283 "version": "v9.99.100",
919 "version_normalized": "9.99.100.0", 1284 "version_normalized": "9.99.100.0",
  1285 + "source": {
  1286 + "type": "git",
  1287 + "url": "https://github.com/paragonie/random_compat.git",
  1288 + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
  1289 + },
920 "dist": { 1290 "dist": {
921 "type": "zip", 1291 "type": "zip",
922 - "url": "https://mirrors.cloud.tencent.com/repository/composer/paragonie/random_compat/v9.99.100/paragonie-random_compat-v9.99.100.zip", 1292 + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
923 "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", 1293 "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
924 - "shasum": "" 1294 + "shasum": "",
  1295 + "mirrors": [
  1296 + {
  1297 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1298 + "preferred": true
  1299 + }
  1300 + ]
925 }, 1301 },
926 "require": { 1302 "require": {
927 "php": ">= 7" 1303 "php": ">= 7"
@@ -936,6 +1312,7 @@ @@ -936,6 +1312,7 @@
936 "time": "2020-10-15T08:29:30+00:00", 1312 "time": "2020-10-15T08:29:30+00:00",
937 "type": "library", 1313 "type": "library",
938 "installation-source": "dist", 1314 "installation-source": "dist",
  1315 + "notification-url": "https://packagist.org/downloads/",
939 "license": [ 1316 "license": [
940 "MIT" 1317 "MIT"
941 ], 1318 ],
@@ -953,17 +1330,33 @@ @@ -953,17 +1330,33 @@
953 "pseudorandom", 1330 "pseudorandom",
954 "random" 1331 "random"
955 ], 1332 ],
  1333 + "support": {
  1334 + "email": "info@paragonie.com",
  1335 + "issues": "https://github.com/paragonie/random_compat/issues",
  1336 + "source": "https://github.com/paragonie/random_compat"
  1337 + },
956 "install-path": "../paragonie/random_compat" 1338 "install-path": "../paragonie/random_compat"
957 }, 1339 },
958 { 1340 {
959 "name": "phpoffice/phpspreadsheet", 1341 "name": "phpoffice/phpspreadsheet",
960 "version": "1.19.0", 1342 "version": "1.19.0",
961 "version_normalized": "1.19.0.0", 1343 "version_normalized": "1.19.0.0",
  1344 + "source": {
  1345 + "type": "git",
  1346 + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
  1347 + "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf"
  1348 + },
962 "dist": { 1349 "dist": {
963 "type": "zip", 1350 "type": "zip",
964 - "url": "https://mirrors.cloud.tencent.com/repository/composer/phpoffice/phpspreadsheet/1.19.0/phpoffice-phpspreadsheet-1.19.0.zip", 1351 + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
965 "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf", 1352 "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
966 - "shasum": "" 1353 + "shasum": "",
  1354 + "mirrors": [
  1355 + {
  1356 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1357 + "preferred": true
  1358 + }
  1359 + ]
967 }, 1360 },
968 "require": { 1361 "require": {
969 "ext-ctype": "*", 1362 "ext-ctype": "*",
@@ -1015,6 +1408,7 @@ @@ -1015,6 +1408,7 @@
1015 "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" 1408 "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
1016 } 1409 }
1017 }, 1410 },
  1411 + "notification-url": "https://packagist.org/downloads/",
1018 "license": [ 1412 "license": [
1019 "MIT" 1413 "MIT"
1020 ], 1414 ],
@@ -1050,17 +1444,32 @@ @@ -1050,17 +1444,32 @@
1050 "xls", 1444 "xls",
1051 "xlsx" 1445 "xlsx"
1052 ], 1446 ],
  1447 + "support": {
  1448 + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
  1449 + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.19.0"
  1450 + },
1053 "install-path": "../phpoffice/phpspreadsheet" 1451 "install-path": "../phpoffice/phpspreadsheet"
1054 }, 1452 },
1055 { 1453 {
1056 "name": "pimple/pimple", 1454 "name": "pimple/pimple",
1057 "version": "v3.5.0", 1455 "version": "v3.5.0",
1058 "version_normalized": "3.5.0.0", 1456 "version_normalized": "3.5.0.0",
  1457 + "source": {
  1458 + "type": "git",
  1459 + "url": "https://github.com/silexphp/Pimple.git",
  1460 + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
  1461 + },
1059 "dist": { 1462 "dist": {
1060 "type": "zip", 1463 "type": "zip",
1061 - "url": "https://mirrors.tencent.com/repository/composer/pimple/pimple/v3.5.0/pimple-pimple-v3.5.0.zip", 1464 + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
1062 "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", 1465 "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
1063 - "shasum": "" 1466 + "shasum": "",
  1467 + "mirrors": [
  1468 + {
  1469 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1470 + "preferred": true
  1471 + }
  1472 + ]
1064 }, 1473 },
1065 "require": { 1474 "require": {
1066 "php": ">=7.2.5", 1475 "php": ">=7.2.5",
@@ -1082,6 +1491,7 @@ @@ -1082,6 +1491,7 @@
1082 "Pimple": "src/" 1491 "Pimple": "src/"
1083 } 1492 }
1084 }, 1493 },
  1494 + "notification-url": "https://packagist.org/downloads/",
1085 "license": [ 1495 "license": [
1086 "MIT" 1496 "MIT"
1087 ], 1497 ],
@@ -1097,17 +1507,31 @@ @@ -1097,17 +1507,31 @@
1097 "container", 1507 "container",
1098 "dependency injection" 1508 "dependency injection"
1099 ], 1509 ],
  1510 + "support": {
  1511 + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
  1512 + },
1100 "install-path": "../pimple/pimple" 1513 "install-path": "../pimple/pimple"
1101 }, 1514 },
1102 { 1515 {
1103 "name": "psr/cache", 1516 "name": "psr/cache",
1104 "version": "1.0.1", 1517 "version": "1.0.1",
1105 "version_normalized": "1.0.1.0", 1518 "version_normalized": "1.0.1.0",
  1519 + "source": {
  1520 + "type": "git",
  1521 + "url": "https://github.com/php-fig/cache.git",
  1522 + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
  1523 + },
1106 "dist": { 1524 "dist": {
1107 "type": "zip", 1525 "type": "zip",
1108 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/cache/1.0.1/psr-cache-1.0.1.zip", 1526 + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
1109 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 1527 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
1110 - "shasum": "" 1528 + "shasum": "",
  1529 + "mirrors": [
  1530 + {
  1531 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1532 + "preferred": true
  1533 + }
  1534 + ]
1111 }, 1535 },
1112 "require": { 1536 "require": {
1113 "php": ">=5.3.0" 1537 "php": ">=5.3.0"
@@ -1125,6 +1549,7 @@ @@ -1125,6 +1549,7 @@
1125 "Psr\\Cache\\": "src/" 1549 "Psr\\Cache\\": "src/"
1126 } 1550 }
1127 }, 1551 },
  1552 + "notification-url": "https://packagist.org/downloads/",
1128 "license": [ 1553 "license": [
1129 "MIT" 1554 "MIT"
1130 ], 1555 ],
@@ -1140,17 +1565,31 @@ @@ -1140,17 +1565,31 @@
1140 "psr", 1565 "psr",
1141 "psr-6" 1566 "psr-6"
1142 ], 1567 ],
  1568 + "support": {
  1569 + "source": "https://github.com/php-fig/cache/tree/master"
  1570 + },
1143 "install-path": "../psr/cache" 1571 "install-path": "../psr/cache"
1144 }, 1572 },
1145 { 1573 {
1146 "name": "psr/container", 1574 "name": "psr/container",
1147 "version": "2.0.2", 1575 "version": "2.0.2",
1148 "version_normalized": "2.0.2.0", 1576 "version_normalized": "2.0.2.0",
  1577 + "source": {
  1578 + "type": "git",
  1579 + "url": "https://github.com/php-fig/container.git",
  1580 + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
  1581 + },
1149 "dist": { 1582 "dist": {
1150 "type": "zip", 1583 "type": "zip",
1151 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/container/2.0.2/psr-container-2.0.2.zip", 1584 + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
1152 "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1585 "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
1153 - "shasum": "" 1586 + "shasum": "",
  1587 + "mirrors": [
  1588 + {
  1589 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1590 + "preferred": true
  1591 + }
  1592 + ]
1154 }, 1593 },
1155 "require": { 1594 "require": {
1156 "php": ">=7.4.0" 1595 "php": ">=7.4.0"
@@ -1168,6 +1607,7 @@ @@ -1168,6 +1607,7 @@
1168 "Psr\\Container\\": "src/" 1607 "Psr\\Container\\": "src/"
1169 } 1608 }
1170 }, 1609 },
  1610 + "notification-url": "https://packagist.org/downloads/",
1171 "license": [ 1611 "license": [
1172 "MIT" 1612 "MIT"
1173 ], 1613 ],
@@ -1186,17 +1626,32 @@ @@ -1186,17 +1626,32 @@
1186 "container-interop", 1626 "container-interop",
1187 "psr" 1627 "psr"
1188 ], 1628 ],
  1629 + "support": {
  1630 + "issues": "https://github.com/php-fig/container/issues",
  1631 + "source": "https://github.com/php-fig/container/tree/2.0.2"
  1632 + },
1189 "install-path": "../psr/container" 1633 "install-path": "../psr/container"
1190 }, 1634 },
1191 { 1635 {
1192 "name": "psr/event-dispatcher", 1636 "name": "psr/event-dispatcher",
1193 "version": "1.0.0", 1637 "version": "1.0.0",
1194 "version_normalized": "1.0.0.0", 1638 "version_normalized": "1.0.0.0",
  1639 + "source": {
  1640 + "type": "git",
  1641 + "url": "https://github.com/php-fig/event-dispatcher.git",
  1642 + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
  1643 + },
1195 "dist": { 1644 "dist": {
1196 "type": "zip", 1645 "type": "zip",
1197 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/event-dispatcher/1.0.0/psr-event-dispatcher-1.0.0.zip", 1646 + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
1198 "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 1647 "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
1199 - "shasum": "" 1648 + "shasum": "",
  1649 + "mirrors": [
  1650 + {
  1651 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1652 + "preferred": true
  1653 + }
  1654 + ]
1200 }, 1655 },
1201 "require": { 1656 "require": {
1202 "php": ">=7.2.0" 1657 "php": ">=7.2.0"
@@ -1214,6 +1669,7 @@ @@ -1214,6 +1669,7 @@
1214 "Psr\\EventDispatcher\\": "src/" 1669 "Psr\\EventDispatcher\\": "src/"
1215 } 1670 }
1216 }, 1671 },
  1672 + "notification-url": "https://packagist.org/downloads/",
1217 "license": [ 1673 "license": [
1218 "MIT" 1674 "MIT"
1219 ], 1675 ],
@@ -1229,17 +1685,32 @@ @@ -1229,17 +1685,32 @@
1229 "psr", 1685 "psr",
1230 "psr-14" 1686 "psr-14"
1231 ], 1687 ],
  1688 + "support": {
  1689 + "issues": "https://github.com/php-fig/event-dispatcher/issues",
  1690 + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
  1691 + },
1232 "install-path": "../psr/event-dispatcher" 1692 "install-path": "../psr/event-dispatcher"
1233 }, 1693 },
1234 { 1694 {
1235 "name": "psr/http-client", 1695 "name": "psr/http-client",
1236 "version": "1.0.1", 1696 "version": "1.0.1",
1237 "version_normalized": "1.0.1.0", 1697 "version_normalized": "1.0.1.0",
  1698 + "source": {
  1699 + "type": "git",
  1700 + "url": "https://github.com/php-fig/http-client.git",
  1701 + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
  1702 + },
1238 "dist": { 1703 "dist": {
1239 "type": "zip", 1704 "type": "zip",
1240 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-client/1.0.1/psr-http-client-1.0.1.zip", 1705 + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
1241 "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 1706 "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
1242 - "shasum": "" 1707 + "shasum": "",
  1708 + "mirrors": [
  1709 + {
  1710 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1711 + "preferred": true
  1712 + }
  1713 + ]
1243 }, 1714 },
1244 "require": { 1715 "require": {
1245 "php": "^7.0 || ^8.0", 1716 "php": "^7.0 || ^8.0",
@@ -1258,6 +1729,7 @@ @@ -1258,6 +1729,7 @@
1258 "Psr\\Http\\Client\\": "src/" 1729 "Psr\\Http\\Client\\": "src/"
1259 } 1730 }
1260 }, 1731 },
  1732 + "notification-url": "https://packagist.org/downloads/",
1261 "license": [ 1733 "license": [
1262 "MIT" 1734 "MIT"
1263 ], 1735 ],
@@ -1275,23 +1747,37 @@ @@ -1275,23 +1747,37 @@
1275 "psr", 1747 "psr",
1276 "psr-18" 1748 "psr-18"
1277 ], 1749 ],
  1750 + "support": {
  1751 + "source": "https://github.com/php-fig/http-client/tree/master"
  1752 + },
1278 "install-path": "../psr/http-client" 1753 "install-path": "../psr/http-client"
1279 }, 1754 },
1280 { 1755 {
1281 "name": "psr/http-factory", 1756 "name": "psr/http-factory",
1282 - "version": "1.0.1",  
1283 - "version_normalized": "1.0.1.0", 1757 + "version": "1.0.2",
  1758 + "version_normalized": "1.0.2.0",
  1759 + "source": {
  1760 + "type": "git",
  1761 + "url": "https://github.com/php-fig/http-factory.git",
  1762 + "reference": "e616d01114759c4c489f93b099585439f795fe35"
  1763 + },
1284 "dist": { 1764 "dist": {
1285 "type": "zip", 1765 "type": "zip",
1286 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-factory/1.0.1/psr-http-factory-1.0.1.zip",  
1287 - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",  
1288 - "shasum": "" 1766 + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
  1767 + "reference": "e616d01114759c4c489f93b099585439f795fe35",
  1768 + "shasum": "",
  1769 + "mirrors": [
  1770 + {
  1771 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1772 + "preferred": true
  1773 + }
  1774 + ]
1289 }, 1775 },
1290 "require": { 1776 "require": {
1291 "php": ">=7.0.0", 1777 "php": ">=7.0.0",
1292 - "psr/http-message": "^1.0" 1778 + "psr/http-message": "^1.0 || ^2.0"
1293 }, 1779 },
1294 - "time": "2019-04-30T12:38:16+00:00", 1780 + "time": "2023-04-10T20:10:41+00:00",
1295 "type": "library", 1781 "type": "library",
1296 "extra": { 1782 "extra": {
1297 "branch-alias": { 1783 "branch-alias": {
@@ -1304,13 +1790,14 @@ @@ -1304,13 +1790,14 @@
1304 "Psr\\Http\\Message\\": "src/" 1790 "Psr\\Http\\Message\\": "src/"
1305 } 1791 }
1306 }, 1792 },
  1793 + "notification-url": "https://packagist.org/downloads/",
1307 "license": [ 1794 "license": [
1308 "MIT" 1795 "MIT"
1309 ], 1796 ],
1310 "authors": [ 1797 "authors": [
1311 { 1798 {
1312 "name": "PHP-FIG", 1799 "name": "PHP-FIG",
1313 - "homepage": "http://www.php-fig.org/" 1800 + "homepage": "https://www.php-fig.org/"
1314 } 1801 }
1315 ], 1802 ],
1316 "description": "Common interfaces for PSR-7 HTTP message factories", 1803 "description": "Common interfaces for PSR-7 HTTP message factories",
@@ -1324,26 +1811,40 @@ @@ -1324,26 +1811,40 @@
1324 "request", 1811 "request",
1325 "response" 1812 "response"
1326 ], 1813 ],
  1814 + "support": {
  1815 + "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
  1816 + },
1327 "install-path": "../psr/http-factory" 1817 "install-path": "../psr/http-factory"
1328 }, 1818 },
1329 { 1819 {
1330 "name": "psr/http-message", 1820 "name": "psr/http-message",
1331 - "version": "1.0.1",  
1332 - "version_normalized": "1.0.1.0", 1821 + "version": "1.1",
  1822 + "version_normalized": "1.1.0.0",
  1823 + "source": {
  1824 + "type": "git",
  1825 + "url": "https://github.com/php-fig/http-message.git",
  1826 + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
  1827 + },
1333 "dist": { 1828 "dist": {
1334 "type": "zip", 1829 "type": "zip",
1335 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-message/1.0.1/psr-http-message-1.0.1.zip",  
1336 - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",  
1337 - "shasum": "" 1830 + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
  1831 + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
  1832 + "shasum": "",
  1833 + "mirrors": [
  1834 + {
  1835 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1836 + "preferred": true
  1837 + }
  1838 + ]
1338 }, 1839 },
1339 "require": { 1840 "require": {
1340 - "php": ">=5.3.0" 1841 + "php": "^7.2 || ^8.0"
1341 }, 1842 },
1342 - "time": "2016-08-06T14:39:51+00:00", 1843 + "time": "2023-04-04T09:50:52+00:00",
1343 "type": "library", 1844 "type": "library",
1344 "extra": { 1845 "extra": {
1345 "branch-alias": { 1846 "branch-alias": {
1346 - "dev-master": "1.0.x-dev" 1847 + "dev-master": "1.1.x-dev"
1347 } 1848 }
1348 }, 1849 },
1349 "installation-source": "dist", 1850 "installation-source": "dist",
@@ -1352,6 +1853,7 @@ @@ -1352,6 +1853,7 @@
1352 "Psr\\Http\\Message\\": "src/" 1853 "Psr\\Http\\Message\\": "src/"
1353 } 1854 }
1354 }, 1855 },
  1856 + "notification-url": "https://packagist.org/downloads/",
1355 "license": [ 1857 "license": [
1356 "MIT" 1858 "MIT"
1357 ], 1859 ],
@@ -1371,17 +1873,31 @@ @@ -1371,17 +1873,31 @@
1371 "request", 1873 "request",
1372 "response" 1874 "response"
1373 ], 1875 ],
  1876 + "support": {
  1877 + "source": "https://github.com/php-fig/http-message/tree/1.1"
  1878 + },
1374 "install-path": "../psr/http-message" 1879 "install-path": "../psr/http-message"
1375 }, 1880 },
1376 { 1881 {
1377 "name": "psr/log", 1882 "name": "psr/log",
1378 "version": "1.1.4", 1883 "version": "1.1.4",
1379 "version_normalized": "1.1.4.0", 1884 "version_normalized": "1.1.4.0",
  1885 + "source": {
  1886 + "type": "git",
  1887 + "url": "https://github.com/php-fig/log.git",
  1888 + "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
  1889 + },
1380 "dist": { 1890 "dist": {
1381 "type": "zip", 1891 "type": "zip",
1382 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/log/1.1.4/psr-log-1.1.4.zip", 1892 + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
1383 "reference": "d49695b909c3b7628b6289db5479a1c204601f11", 1893 "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
1384 - "shasum": "" 1894 + "shasum": "",
  1895 + "mirrors": [
  1896 + {
  1897 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1898 + "preferred": true
  1899 + }
  1900 + ]
1385 }, 1901 },
1386 "require": { 1902 "require": {
1387 "php": ">=5.3.0" 1903 "php": ">=5.3.0"
@@ -1399,6 +1915,7 @@ @@ -1399,6 +1915,7 @@
1399 "Psr\\Log\\": "Psr/Log/" 1915 "Psr\\Log\\": "Psr/Log/"
1400 } 1916 }
1401 }, 1917 },
  1918 + "notification-url": "https://packagist.org/downloads/",
1402 "license": [ 1919 "license": [
1403 "MIT" 1920 "MIT"
1404 ], 1921 ],
@@ -1415,17 +1932,31 @@ @@ -1415,17 +1932,31 @@
1415 "psr", 1932 "psr",
1416 "psr-3" 1933 "psr-3"
1417 ], 1934 ],
  1935 + "support": {
  1936 + "source": "https://github.com/php-fig/log/tree/1.1.4"
  1937 + },
1418 "install-path": "../psr/log" 1938 "install-path": "../psr/log"
1419 }, 1939 },
1420 { 1940 {
1421 "name": "psr/simple-cache", 1941 "name": "psr/simple-cache",
1422 "version": "1.0.1", 1942 "version": "1.0.1",
1423 "version_normalized": "1.0.1.0", 1943 "version_normalized": "1.0.1.0",
  1944 + "source": {
  1945 + "type": "git",
  1946 + "url": "https://github.com/php-fig/simple-cache.git",
  1947 + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
  1948 + },
1424 "dist": { 1949 "dist": {
1425 "type": "zip", 1950 "type": "zip",
1426 - "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/simple-cache/1.0.1/psr-simple-cache-1.0.1.zip", 1951 + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
1427 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1952 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
1428 - "shasum": "" 1953 + "shasum": "",
  1954 + "mirrors": [
  1955 + {
  1956 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  1957 + "preferred": true
  1958 + }
  1959 + ]
1429 }, 1960 },
1430 "require": { 1961 "require": {
1431 "php": ">=5.3.0" 1962 "php": ">=5.3.0"
@@ -1443,6 +1974,7 @@ @@ -1443,6 +1974,7 @@
1443 "Psr\\SimpleCache\\": "src/" 1974 "Psr\\SimpleCache\\": "src/"
1444 } 1975 }
1445 }, 1976 },
  1977 + "notification-url": "https://packagist.org/downloads/",
1446 "license": [ 1978 "license": [
1447 "MIT" 1979 "MIT"
1448 ], 1980 ],
@@ -1460,17 +1992,31 @@ @@ -1460,17 +1992,31 @@
1460 "psr-16", 1992 "psr-16",
1461 "simple-cache" 1993 "simple-cache"
1462 ], 1994 ],
  1995 + "support": {
  1996 + "source": "https://github.com/php-fig/simple-cache/tree/master"
  1997 + },
1463 "install-path": "../psr/simple-cache" 1998 "install-path": "../psr/simple-cache"
1464 }, 1999 },
1465 { 2000 {
1466 "name": "ralouphie/getallheaders", 2001 "name": "ralouphie/getallheaders",
1467 "version": "3.0.3", 2002 "version": "3.0.3",
1468 "version_normalized": "3.0.3.0", 2003 "version_normalized": "3.0.3.0",
  2004 + "source": {
  2005 + "type": "git",
  2006 + "url": "https://github.com/ralouphie/getallheaders.git",
  2007 + "reference": "120b605dfeb996808c31b6477290a714d356e822"
  2008 + },
1469 "dist": { 2009 "dist": {
1470 "type": "zip", 2010 "type": "zip",
1471 - "url": "https://mirrors.cloud.tencent.com/repository/composer/ralouphie/getallheaders/3.0.3/ralouphie-getallheaders-3.0.3.zip", 2011 + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
1472 "reference": "120b605dfeb996808c31b6477290a714d356e822", 2012 "reference": "120b605dfeb996808c31b6477290a714d356e822",
1473 - "shasum": "" 2013 + "shasum": "",
  2014 + "mirrors": [
  2015 + {
  2016 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2017 + "preferred": true
  2018 + }
  2019 + ]
1474 }, 2020 },
1475 "require": { 2021 "require": {
1476 "php": ">=5.6" 2022 "php": ">=5.6"
@@ -1487,6 +2033,7 @@ @@ -1487,6 +2033,7 @@
1487 "src/getallheaders.php" 2033 "src/getallheaders.php"
1488 ] 2034 ]
1489 }, 2035 },
  2036 + "notification-url": "https://packagist.org/downloads/",
1490 "license": [ 2037 "license": [
1491 "MIT" 2038 "MIT"
1492 ], 2039 ],
@@ -1497,17 +2044,32 @@ @@ -1497,17 +2044,32 @@
1497 } 2044 }
1498 ], 2045 ],
1499 "description": "A polyfill for getallheaders.", 2046 "description": "A polyfill for getallheaders.",
  2047 + "support": {
  2048 + "issues": "https://github.com/ralouphie/getallheaders/issues",
  2049 + "source": "https://github.com/ralouphie/getallheaders/tree/develop"
  2050 + },
1500 "install-path": "../ralouphie/getallheaders" 2051 "install-path": "../ralouphie/getallheaders"
1501 }, 2052 },
1502 { 2053 {
1503 "name": "symfony/cache", 2054 "name": "symfony/cache",
1504 - "version": "v5.4.15",  
1505 - "version_normalized": "5.4.15.0", 2055 + "version": "v5.4.23",
  2056 + "version_normalized": "5.4.23.0",
  2057 + "source": {
  2058 + "type": "git",
  2059 + "url": "https://github.com/symfony/cache.git",
  2060 + "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107"
  2061 + },
1506 "dist": { 2062 "dist": {
1507 "type": "zip", 2063 "type": "zip",
1508 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/cache/v5.4.15/symfony-cache-v5.4.15.zip",  
1509 - "reference": "60e87188abbacd29ccde44d69c5392a33e888e98",  
1510 - "shasum": "" 2064 + "url": "https://api.github.com/repos/symfony/cache/zipball/983c79ff28612cdfd66d8e44e1a06e5afc87e107",
  2065 + "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107",
  2066 + "shasum": "",
  2067 + "mirrors": [
  2068 + {
  2069 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2070 + "preferred": true
  2071 + }
  2072 + ]
1511 }, 2073 },
1512 "require": { 2074 "require": {
1513 "php": ">=7.2.5", 2075 "php": ">=7.2.5",
@@ -1544,7 +2106,7 @@ @@ -1544,7 +2106,7 @@
1544 "symfony/messenger": "^4.4|^5.0|^6.0", 2106 "symfony/messenger": "^4.4|^5.0|^6.0",
1545 "symfony/var-dumper": "^4.4|^5.0|^6.0" 2107 "symfony/var-dumper": "^4.4|^5.0|^6.0"
1546 }, 2108 },
1547 - "time": "2022-10-27T07:55:40+00:00", 2109 + "time": "2023-04-21T15:38:51+00:00",
1548 "type": "library", 2110 "type": "library",
1549 "installation-source": "dist", 2111 "installation-source": "dist",
1550 "autoload": { 2112 "autoload": {
@@ -1555,6 +2117,7 @@ @@ -1555,6 +2117,7 @@
1555 "/Tests/" 2117 "/Tests/"
1556 ] 2118 ]
1557 }, 2119 },
  2120 + "notification-url": "https://packagist.org/downloads/",
1558 "license": [ 2121 "license": [
1559 "MIT" 2122 "MIT"
1560 ], 2123 ],
@@ -1574,17 +2137,45 @@ @@ -1574,17 +2137,45 @@
1574 "caching", 2137 "caching",
1575 "psr6" 2138 "psr6"
1576 ], 2139 ],
  2140 + "support": {
  2141 + "source": "https://github.com/symfony/cache/tree/v5.4.23"
  2142 + },
  2143 + "funding": [
  2144 + {
  2145 + "url": "https://symfony.com/sponsor",
  2146 + "type": "custom"
  2147 + },
  2148 + {
  2149 + "url": "https://github.com/fabpot",
  2150 + "type": "github"
  2151 + },
  2152 + {
  2153 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2154 + "type": "tidelift"
  2155 + }
  2156 + ],
1577 "install-path": "../symfony/cache" 2157 "install-path": "../symfony/cache"
1578 }, 2158 },
1579 { 2159 {
1580 "name": "symfony/cache-contracts", 2160 "name": "symfony/cache-contracts",
1581 "version": "v2.5.2", 2161 "version": "v2.5.2",
1582 "version_normalized": "2.5.2.0", 2162 "version_normalized": "2.5.2.0",
  2163 + "source": {
  2164 + "type": "git",
  2165 + "url": "https://github.com/symfony/cache-contracts.git",
  2166 + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
  2167 + },
1583 "dist": { 2168 "dist": {
1584 "type": "zip", 2169 "type": "zip",
1585 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/cache-contracts/v2.5.2/symfony-cache-contracts-v2.5.2.zip", 2170 + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
1586 "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", 2171 "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
1587 - "shasum": "" 2172 + "shasum": "",
  2173 + "mirrors": [
  2174 + {
  2175 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2176 + "preferred": true
  2177 + }
  2178 + ]
1588 }, 2179 },
1589 "require": { 2180 "require": {
1590 "php": ">=7.2.5", 2181 "php": ">=7.2.5",
@@ -1610,6 +2201,7 @@ @@ -1610,6 +2201,7 @@
1610 "Symfony\\Contracts\\Cache\\": "" 2201 "Symfony\\Contracts\\Cache\\": ""
1611 } 2202 }
1612 }, 2203 },
  2204 + "notification-url": "https://packagist.org/downloads/",
1613 "license": [ 2205 "license": [
1614 "MIT" 2206 "MIT"
1615 ], 2207 ],
@@ -1633,17 +2225,45 @@ @@ -1633,17 +2225,45 @@
1633 "interoperability", 2225 "interoperability",
1634 "standards" 2226 "standards"
1635 ], 2227 ],
  2228 + "support": {
  2229 + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2"
  2230 + },
  2231 + "funding": [
  2232 + {
  2233 + "url": "https://symfony.com/sponsor",
  2234 + "type": "custom"
  2235 + },
  2236 + {
  2237 + "url": "https://github.com/fabpot",
  2238 + "type": "github"
  2239 + },
  2240 + {
  2241 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2242 + "type": "tidelift"
  2243 + }
  2244 + ],
1636 "install-path": "../symfony/cache-contracts" 2245 "install-path": "../symfony/cache-contracts"
1637 }, 2246 },
1638 { 2247 {
1639 "name": "symfony/deprecation-contracts", 2248 "name": "symfony/deprecation-contracts",
1640 "version": "v2.5.2", 2249 "version": "v2.5.2",
1641 "version_normalized": "2.5.2.0", 2250 "version_normalized": "2.5.2.0",
  2251 + "source": {
  2252 + "type": "git",
  2253 + "url": "https://github.com/symfony/deprecation-contracts.git",
  2254 + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
  2255 + },
1642 "dist": { 2256 "dist": {
1643 "type": "zip", 2257 "type": "zip",
1644 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/deprecation-contracts/v2.5.2/symfony-deprecation-contracts-v2.5.2.zip", 2258 + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
1645 "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", 2259 "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
1646 - "shasum": "" 2260 + "shasum": "",
  2261 + "mirrors": [
  2262 + {
  2263 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2264 + "preferred": true
  2265 + }
  2266 + ]
1647 }, 2267 },
1648 "require": { 2268 "require": {
1649 "php": ">=7.1" 2269 "php": ">=7.1"
@@ -1665,6 +2285,7 @@ @@ -1665,6 +2285,7 @@
1665 "function.php" 2285 "function.php"
1666 ] 2286 ]
1667 }, 2287 },
  2288 + "notification-url": "https://packagist.org/downloads/",
1668 "license": [ 2289 "license": [
1669 "MIT" 2290 "MIT"
1670 ], 2291 ],
@@ -1680,17 +2301,45 @@ @@ -1680,17 +2301,45 @@
1680 ], 2301 ],
1681 "description": "A generic function and convention to trigger deprecation notices", 2302 "description": "A generic function and convention to trigger deprecation notices",
1682 "homepage": "https://symfony.com", 2303 "homepage": "https://symfony.com",
  2304 + "support": {
  2305 + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
  2306 + },
  2307 + "funding": [
  2308 + {
  2309 + "url": "https://symfony.com/sponsor",
  2310 + "type": "custom"
  2311 + },
  2312 + {
  2313 + "url": "https://github.com/fabpot",
  2314 + "type": "github"
  2315 + },
  2316 + {
  2317 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2318 + "type": "tidelift"
  2319 + }
  2320 + ],
1683 "install-path": "../symfony/deprecation-contracts" 2321 "install-path": "../symfony/deprecation-contracts"
1684 }, 2322 },
1685 { 2323 {
1686 "name": "symfony/event-dispatcher", 2324 "name": "symfony/event-dispatcher",
1687 - "version": "v5.4.9",  
1688 - "version_normalized": "5.4.9.0", 2325 + "version": "v5.4.22",
  2326 + "version_normalized": "5.4.22.0",
  2327 + "source": {
  2328 + "type": "git",
  2329 + "url": "https://github.com/symfony/event-dispatcher.git",
  2330 + "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f"
  2331 + },
1689 "dist": { 2332 "dist": {
1690 "type": "zip", 2333 "type": "zip",
1691 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/event-dispatcher/v5.4.9/symfony-event-dispatcher-v5.4.9.zip",  
1692 - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",  
1693 - "shasum": "" 2334 + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1df20e45d56da29a4b1d8259dd6e950acbf1b13f",
  2335 + "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f",
  2336 + "shasum": "",
  2337 + "mirrors": [
  2338 + {
  2339 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2340 + "preferred": true
  2341 + }
  2342 + ]
1694 }, 2343 },
1695 "require": { 2344 "require": {
1696 "php": ">=7.2.5", 2345 "php": ">=7.2.5",
@@ -1719,7 +2368,7 @@ @@ -1719,7 +2368,7 @@
1719 "symfony/dependency-injection": "", 2368 "symfony/dependency-injection": "",
1720 "symfony/http-kernel": "" 2369 "symfony/http-kernel": ""
1721 }, 2370 },
1722 - "time": "2022-05-05T16:45:39+00:00", 2371 + "time": "2023-03-17T11:31:58+00:00",
1723 "type": "library", 2372 "type": "library",
1724 "installation-source": "dist", 2373 "installation-source": "dist",
1725 "autoload": { 2374 "autoload": {
@@ -1730,6 +2379,7 @@ @@ -1730,6 +2379,7 @@
1730 "/Tests/" 2379 "/Tests/"
1731 ] 2380 ]
1732 }, 2381 },
  2382 + "notification-url": "https://packagist.org/downloads/",
1733 "license": [ 2383 "license": [
1734 "MIT" 2384 "MIT"
1735 ], 2385 ],
@@ -1745,17 +2395,45 @@ @@ -1745,17 +2395,45 @@
1745 ], 2395 ],
1746 "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 2396 "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
1747 "homepage": "https://symfony.com", 2397 "homepage": "https://symfony.com",
  2398 + "support": {
  2399 + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.22"
  2400 + },
  2401 + "funding": [
  2402 + {
  2403 + "url": "https://symfony.com/sponsor",
  2404 + "type": "custom"
  2405 + },
  2406 + {
  2407 + "url": "https://github.com/fabpot",
  2408 + "type": "github"
  2409 + },
  2410 + {
  2411 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2412 + "type": "tidelift"
  2413 + }
  2414 + ],
1748 "install-path": "../symfony/event-dispatcher" 2415 "install-path": "../symfony/event-dispatcher"
1749 }, 2416 },
1750 { 2417 {
1751 "name": "symfony/event-dispatcher-contracts", 2418 "name": "symfony/event-dispatcher-contracts",
1752 "version": "v2.5.2", 2419 "version": "v2.5.2",
1753 "version_normalized": "2.5.2.0", 2420 "version_normalized": "2.5.2.0",
  2421 + "source": {
  2422 + "type": "git",
  2423 + "url": "https://github.com/symfony/event-dispatcher-contracts.git",
  2424 + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
  2425 + },
1754 "dist": { 2426 "dist": {
1755 "type": "zip", 2427 "type": "zip",
1756 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/event-dispatcher-contracts/v2.5.2/symfony-event-dispatcher-contracts-v2.5.2.zip", 2428 + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
1757 "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", 2429 "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
1758 - "shasum": "" 2430 + "shasum": "",
  2431 + "mirrors": [
  2432 + {
  2433 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2434 + "preferred": true
  2435 + }
  2436 + ]
1759 }, 2437 },
1760 "require": { 2438 "require": {
1761 "php": ">=7.2.5", 2439 "php": ">=7.2.5",
@@ -1781,6 +2459,7 @@ @@ -1781,6 +2459,7 @@
1781 "Symfony\\Contracts\\EventDispatcher\\": "" 2459 "Symfony\\Contracts\\EventDispatcher\\": ""
1782 } 2460 }
1783 }, 2461 },
  2462 + "notification-url": "https://packagist.org/downloads/",
1784 "license": [ 2463 "license": [
1785 "MIT" 2464 "MIT"
1786 ], 2465 ],
@@ -1804,24 +2483,52 @@ @@ -1804,24 +2483,52 @@
1804 "interoperability", 2483 "interoperability",
1805 "standards" 2484 "standards"
1806 ], 2485 ],
  2486 + "support": {
  2487 + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2"
  2488 + },
  2489 + "funding": [
  2490 + {
  2491 + "url": "https://symfony.com/sponsor",
  2492 + "type": "custom"
  2493 + },
  2494 + {
  2495 + "url": "https://github.com/fabpot",
  2496 + "type": "github"
  2497 + },
  2498 + {
  2499 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2500 + "type": "tidelift"
  2501 + }
  2502 + ],
1807 "install-path": "../symfony/event-dispatcher-contracts" 2503 "install-path": "../symfony/event-dispatcher-contracts"
1808 }, 2504 },
1809 { 2505 {
1810 "name": "symfony/finder", 2506 "name": "symfony/finder",
1811 - "version": "v5.4.11",  
1812 - "version_normalized": "5.4.11.0", 2507 + "version": "v5.4.21",
  2508 + "version_normalized": "5.4.21.0",
  2509 + "source": {
  2510 + "type": "git",
  2511 + "url": "https://github.com/symfony/finder.git",
  2512 + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19"
  2513 + },
1813 "dist": { 2514 "dist": {
1814 "type": "zip", 2515 "type": "zip",
1815 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/finder/v5.4.11/symfony-finder-v5.4.11.zip",  
1816 - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c",  
1817 - "shasum": "" 2516 + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19",
  2517 + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19",
  2518 + "shasum": "",
  2519 + "mirrors": [
  2520 + {
  2521 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2522 + "preferred": true
  2523 + }
  2524 + ]
1818 }, 2525 },
1819 "require": { 2526 "require": {
1820 "php": ">=7.2.5", 2527 "php": ">=7.2.5",
1821 "symfony/deprecation-contracts": "^2.1|^3", 2528 "symfony/deprecation-contracts": "^2.1|^3",
1822 "symfony/polyfill-php80": "^1.16" 2529 "symfony/polyfill-php80": "^1.16"
1823 }, 2530 },
1824 - "time": "2022-07-29T07:37:50+00:00", 2531 + "time": "2023-02-16T09:33:00+00:00",
1825 "type": "library", 2532 "type": "library",
1826 "installation-source": "dist", 2533 "installation-source": "dist",
1827 "autoload": { 2534 "autoload": {
@@ -1832,6 +2539,7 @@ @@ -1832,6 +2539,7 @@
1832 "/Tests/" 2539 "/Tests/"
1833 ] 2540 ]
1834 }, 2541 },
  2542 + "notification-url": "https://packagist.org/downloads/",
1835 "license": [ 2543 "license": [
1836 "MIT" 2544 "MIT"
1837 ], 2545 ],
@@ -1847,17 +2555,45 @@ @@ -1847,17 +2555,45 @@
1847 ], 2555 ],
1848 "description": "Finds files and directories via an intuitive fluent interface", 2556 "description": "Finds files and directories via an intuitive fluent interface",
1849 "homepage": "https://symfony.com", 2557 "homepage": "https://symfony.com",
  2558 + "support": {
  2559 + "source": "https://github.com/symfony/finder/tree/v5.4.21"
  2560 + },
  2561 + "funding": [
  2562 + {
  2563 + "url": "https://symfony.com/sponsor",
  2564 + "type": "custom"
  2565 + },
  2566 + {
  2567 + "url": "https://github.com/fabpot",
  2568 + "type": "github"
  2569 + },
  2570 + {
  2571 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2572 + "type": "tidelift"
  2573 + }
  2574 + ],
1850 "install-path": "../symfony/finder" 2575 "install-path": "../symfony/finder"
1851 }, 2576 },
1852 { 2577 {
1853 "name": "symfony/http-foundation", 2578 "name": "symfony/http-foundation",
1854 - "version": "v5.4.16",  
1855 - "version_normalized": "5.4.16.0", 2579 + "version": "v5.4.24",
  2580 + "version_normalized": "5.4.24.0",
  2581 + "source": {
  2582 + "type": "git",
  2583 + "url": "https://github.com/symfony/http-foundation.git",
  2584 + "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5"
  2585 + },
1856 "dist": { 2586 "dist": {
1857 "type": "zip", 2587 "type": "zip",
1858 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/http-foundation/v5.4.16/symfony-http-foundation-v5.4.16.zip",  
1859 - "reference": "5032c5849aef24741e1970cb03511b0dd131d838",  
1860 - "shasum": "" 2588 + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3c59f97f6249ce552a44f01b93bfcbd786a954f5",
  2589 + "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5",
  2590 + "shasum": "",
  2591 + "mirrors": [
  2592 + {
  2593 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2594 + "preferred": true
  2595 + }
  2596 + ]
1861 }, 2597 },
1862 "require": { 2598 "require": {
1863 "php": ">=7.2.5", 2599 "php": ">=7.2.5",
@@ -1877,7 +2613,7 @@ @@ -1877,7 +2613,7 @@
1877 "suggest": { 2613 "suggest": {
1878 "symfony/mime": "To use the file extension guesser" 2614 "symfony/mime": "To use the file extension guesser"
1879 }, 2615 },
1880 - "time": "2022-11-07T08:06:40+00:00", 2616 + "time": "2023-05-19T07:21:23+00:00",
1881 "type": "library", 2617 "type": "library",
1882 "installation-source": "dist", 2618 "installation-source": "dist",
1883 "autoload": { 2619 "autoload": {
@@ -1888,6 +2624,7 @@ @@ -1888,6 +2624,7 @@
1888 "/Tests/" 2624 "/Tests/"
1889 ] 2625 ]
1890 }, 2626 },
  2627 + "notification-url": "https://packagist.org/downloads/",
1891 "license": [ 2628 "license": [
1892 "MIT" 2629 "MIT"
1893 ], 2630 ],
@@ -1903,17 +2640,45 @@ @@ -1903,17 +2640,45 @@
1903 ], 2640 ],
1904 "description": "Defines an object-oriented layer for the HTTP specification", 2641 "description": "Defines an object-oriented layer for the HTTP specification",
1905 "homepage": "https://symfony.com", 2642 "homepage": "https://symfony.com",
  2643 + "support": {
  2644 + "source": "https://github.com/symfony/http-foundation/tree/v5.4.24"
  2645 + },
  2646 + "funding": [
  2647 + {
  2648 + "url": "https://symfony.com/sponsor",
  2649 + "type": "custom"
  2650 + },
  2651 + {
  2652 + "url": "https://github.com/fabpot",
  2653 + "type": "github"
  2654 + },
  2655 + {
  2656 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2657 + "type": "tidelift"
  2658 + }
  2659 + ],
1906 "install-path": "../symfony/http-foundation" 2660 "install-path": "../symfony/http-foundation"
1907 }, 2661 },
1908 { 2662 {
1909 "name": "symfony/polyfill-mbstring", 2663 "name": "symfony/polyfill-mbstring",
1910 "version": "v1.27.0", 2664 "version": "v1.27.0",
1911 "version_normalized": "1.27.0.0", 2665 "version_normalized": "1.27.0.0",
  2666 + "source": {
  2667 + "type": "git",
  2668 + "url": "https://github.com/symfony/polyfill-mbstring.git",
  2669 + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
  2670 + },
1912 "dist": { 2671 "dist": {
1913 "type": "zip", 2672 "type": "zip",
1914 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-mbstring/v1.27.0/symfony-polyfill-mbstring-v1.27.0.zip", 2673 + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
1915 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 2674 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
1916 - "shasum": "" 2675 + "shasum": "",
  2676 + "mirrors": [
  2677 + {
  2678 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2679 + "preferred": true
  2680 + }
  2681 + ]
1917 }, 2682 },
1918 "require": { 2683 "require": {
1919 "php": ">=7.1" 2684 "php": ">=7.1"
@@ -1944,6 +2709,7 @@ @@ -1944,6 +2709,7 @@
1944 "Symfony\\Polyfill\\Mbstring\\": "" 2709 "Symfony\\Polyfill\\Mbstring\\": ""
1945 } 2710 }
1946 }, 2711 },
  2712 + "notification-url": "https://packagist.org/downloads/",
1947 "license": [ 2713 "license": [
1948 "MIT" 2714 "MIT"
1949 ], 2715 ],
@@ -1966,17 +2732,45 @@ @@ -1966,17 +2732,45 @@
1966 "portable", 2732 "portable",
1967 "shim" 2733 "shim"
1968 ], 2734 ],
  2735 + "support": {
  2736 + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
  2737 + },
  2738 + "funding": [
  2739 + {
  2740 + "url": "https://symfony.com/sponsor",
  2741 + "type": "custom"
  2742 + },
  2743 + {
  2744 + "url": "https://github.com/fabpot",
  2745 + "type": "github"
  2746 + },
  2747 + {
  2748 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2749 + "type": "tidelift"
  2750 + }
  2751 + ],
1969 "install-path": "../symfony/polyfill-mbstring" 2752 "install-path": "../symfony/polyfill-mbstring"
1970 }, 2753 },
1971 { 2754 {
1972 "name": "symfony/polyfill-php73", 2755 "name": "symfony/polyfill-php73",
1973 "version": "v1.27.0", 2756 "version": "v1.27.0",
1974 "version_normalized": "1.27.0.0", 2757 "version_normalized": "1.27.0.0",
  2758 + "source": {
  2759 + "type": "git",
  2760 + "url": "https://github.com/symfony/polyfill-php73.git",
  2761 + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
  2762 + },
1975 "dist": { 2763 "dist": {
1976 "type": "zip", 2764 "type": "zip",
1977 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php73/v1.27.0/symfony-polyfill-php73-v1.27.0.zip", 2765 + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
1978 "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", 2766 "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
1979 - "shasum": "" 2767 + "shasum": "",
  2768 + "mirrors": [
  2769 + {
  2770 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2771 + "preferred": true
  2772 + }
  2773 + ]
1980 }, 2774 },
1981 "require": { 2775 "require": {
1982 "php": ">=7.1" 2776 "php": ">=7.1"
@@ -2004,6 +2798,7 @@ @@ -2004,6 +2798,7 @@
2004 "Resources/stubs" 2798 "Resources/stubs"
2005 ] 2799 ]
2006 }, 2800 },
  2801 + "notification-url": "https://packagist.org/downloads/",
2007 "license": [ 2802 "license": [
2008 "MIT" 2803 "MIT"
2009 ], 2804 ],
@@ -2025,17 +2820,45 @@ @@ -2025,17 +2820,45 @@
2025 "portable", 2820 "portable",
2026 "shim" 2821 "shim"
2027 ], 2822 ],
  2823 + "support": {
  2824 + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
  2825 + },
  2826 + "funding": [
  2827 + {
  2828 + "url": "https://symfony.com/sponsor",
  2829 + "type": "custom"
  2830 + },
  2831 + {
  2832 + "url": "https://github.com/fabpot",
  2833 + "type": "github"
  2834 + },
  2835 + {
  2836 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2837 + "type": "tidelift"
  2838 + }
  2839 + ],
2028 "install-path": "../symfony/polyfill-php73" 2840 "install-path": "../symfony/polyfill-php73"
2029 }, 2841 },
2030 { 2842 {
2031 "name": "symfony/polyfill-php80", 2843 "name": "symfony/polyfill-php80",
2032 "version": "v1.27.0", 2844 "version": "v1.27.0",
2033 "version_normalized": "1.27.0.0", 2845 "version_normalized": "1.27.0.0",
  2846 + "source": {
  2847 + "type": "git",
  2848 + "url": "https://github.com/symfony/polyfill-php80.git",
  2849 + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
  2850 + },
2034 "dist": { 2851 "dist": {
2035 "type": "zip", 2852 "type": "zip",
2036 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php80/v1.27.0/symfony-polyfill-php80-v1.27.0.zip", 2853 + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
2037 "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", 2854 "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
2038 - "shasum": "" 2855 + "shasum": "",
  2856 + "mirrors": [
  2857 + {
  2858 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2859 + "preferred": true
  2860 + }
  2861 + ]
2039 }, 2862 },
2040 "require": { 2863 "require": {
2041 "php": ">=7.1" 2864 "php": ">=7.1"
@@ -2063,6 +2886,7 @@ @@ -2063,6 +2886,7 @@
2063 "Resources/stubs" 2886 "Resources/stubs"
2064 ] 2887 ]
2065 }, 2888 },
  2889 + "notification-url": "https://packagist.org/downloads/",
2066 "license": [ 2890 "license": [
2067 "MIT" 2891 "MIT"
2068 ], 2892 ],
@@ -2088,41 +2912,69 @@ @@ -2088,41 +2912,69 @@
2088 "portable", 2912 "portable",
2089 "shim" 2913 "shim"
2090 ], 2914 ],
  2915 + "support": {
  2916 + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
  2917 + },
  2918 + "funding": [
  2919 + {
  2920 + "url": "https://symfony.com/sponsor",
  2921 + "type": "custom"
  2922 + },
  2923 + {
  2924 + "url": "https://github.com/fabpot",
  2925 + "type": "github"
  2926 + },
  2927 + {
  2928 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  2929 + "type": "tidelift"
  2930 + }
  2931 + ],
2091 "install-path": "../symfony/polyfill-php80" 2932 "install-path": "../symfony/polyfill-php80"
2092 }, 2933 },
2093 { 2934 {
2094 "name": "symfony/psr-http-message-bridge", 2935 "name": "symfony/psr-http-message-bridge",
2095 - "version": "v2.1.4",  
2096 - "version_normalized": "2.1.4.0", 2936 + "version": "v2.2.0",
  2937 + "version_normalized": "2.2.0.0",
  2938 + "source": {
  2939 + "type": "git",
  2940 + "url": "https://github.com/symfony/psr-http-message-bridge.git",
  2941 + "reference": "28a732c05bbad801304ad5a5c674cf2970508993"
  2942 + },
2097 "dist": { 2943 "dist": {
2098 "type": "zip", 2944 "type": "zip",
2099 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/psr-http-message-bridge/v2.1.4/symfony-psr-http-message-bridge-v2.1.4.zip",  
2100 - "reference": "a125b93ef378c492e274f217874906fb9babdebb",  
2101 - "shasum": "" 2945 + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/28a732c05bbad801304ad5a5c674cf2970508993",
  2946 + "reference": "28a732c05bbad801304ad5a5c674cf2970508993",
  2947 + "shasum": "",
  2948 + "mirrors": [
  2949 + {
  2950 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  2951 + "preferred": true
  2952 + }
  2953 + ]
2102 }, 2954 },
2103 "require": { 2955 "require": {
2104 - "php": ">=7.1",  
2105 - "psr/http-message": "^1.0",  
2106 - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" 2956 + "php": ">=7.2.5",
  2957 + "psr/http-message": "^1.0 || ^2.0",
  2958 + "symfony/http-foundation": "^5.4 || ^6.0"
2107 }, 2959 },
2108 "require-dev": { 2960 "require-dev": {
2109 "nyholm/psr7": "^1.1", 2961 "nyholm/psr7": "^1.1",
2110 "psr/log": "^1.1 || ^2 || ^3", 2962 "psr/log": "^1.1 || ^2 || ^3",
2111 - "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0",  
2112 - "symfony/config": "^4.4 || ^5.0 || ^6.0",  
2113 - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0",  
2114 - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0",  
2115 - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0",  
2116 - "symfony/phpunit-bridge": "^5.4@dev || ^6.0" 2963 + "symfony/browser-kit": "^5.4 || ^6.0",
  2964 + "symfony/config": "^5.4 || ^6.0",
  2965 + "symfony/event-dispatcher": "^5.4 || ^6.0",
  2966 + "symfony/framework-bundle": "^5.4 || ^6.0",
  2967 + "symfony/http-kernel": "^5.4 || ^6.0",
  2968 + "symfony/phpunit-bridge": "^6.2"
2117 }, 2969 },
2118 "suggest": { 2970 "suggest": {
2119 "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" 2971 "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
2120 }, 2972 },
2121 - "time": "2022-11-28T22:46:34+00:00", 2973 + "time": "2023-04-21T08:40:19+00:00",
2122 "type": "symfony-bridge", 2974 "type": "symfony-bridge",
2123 "extra": { 2975 "extra": {
2124 "branch-alias": { 2976 "branch-alias": {
2125 - "dev-main": "2.1-dev" 2977 + "dev-main": "2.2-dev"
2126 } 2978 }
2127 }, 2979 },
2128 "installation-source": "dist", 2980 "installation-source": "dist",
@@ -2134,6 +2986,7 @@ @@ -2134,6 +2986,7 @@
2134 "/Tests/" 2986 "/Tests/"
2135 ] 2987 ]
2136 }, 2988 },
  2989 + "notification-url": "https://packagist.org/downloads/",
2137 "license": [ 2990 "license": [
2138 "MIT" 2991 "MIT"
2139 ], 2992 ],
@@ -2155,17 +3008,46 @@ @@ -2155,17 +3008,46 @@
2155 "psr-17", 3008 "psr-17",
2156 "psr-7" 3009 "psr-7"
2157 ], 3010 ],
  3011 + "support": {
  3012 + "issues": "https://github.com/symfony/psr-http-message-bridge/issues",
  3013 + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.2.0"
  3014 + },
  3015 + "funding": [
  3016 + {
  3017 + "url": "https://symfony.com/sponsor",
  3018 + "type": "custom"
  3019 + },
  3020 + {
  3021 + "url": "https://github.com/fabpot",
  3022 + "type": "github"
  3023 + },
  3024 + {
  3025 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  3026 + "type": "tidelift"
  3027 + }
  3028 + ],
2158 "install-path": "../symfony/psr-http-message-bridge" 3029 "install-path": "../symfony/psr-http-message-bridge"
2159 }, 3030 },
2160 { 3031 {
2161 "name": "symfony/service-contracts", 3032 "name": "symfony/service-contracts",
2162 "version": "v1.1.2", 3033 "version": "v1.1.2",
2163 "version_normalized": "1.1.2.0", 3034 "version_normalized": "1.1.2.0",
  3035 + "source": {
  3036 + "type": "git",
  3037 + "url": "https://github.com/symfony/service-contracts.git",
  3038 + "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0"
  3039 + },
2164 "dist": { 3040 "dist": {
2165 "type": "zip", 3041 "type": "zip",
2166 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/service-contracts/v1.1.2/symfony-service-contracts-v1.1.2.zip", 3042 + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/191afdcb5804db960d26d8566b7e9a2843cab3a0",
2167 "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0", 3043 "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0",
2168 - "shasum": "" 3044 + "shasum": "",
  3045 + "mirrors": [
  3046 + {
  3047 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3048 + "preferred": true
  3049 + }
  3050 + ]
2169 }, 3051 },
2170 "require": { 3052 "require": {
2171 "php": "^7.1.3" 3053 "php": "^7.1.3"
@@ -2187,6 +3069,7 @@ @@ -2187,6 +3069,7 @@
2187 "Symfony\\Contracts\\Service\\": "" 3069 "Symfony\\Contracts\\Service\\": ""
2188 } 3070 }
2189 }, 3071 },
  3072 + "notification-url": "https://packagist.org/downloads/",
2190 "license": [ 3073 "license": [
2191 "MIT" 3074 "MIT"
2192 ], 3075 ],
@@ -2210,17 +3093,31 @@ @@ -2210,17 +3093,31 @@
2210 "interoperability", 3093 "interoperability",
2211 "standards" 3094 "standards"
2212 ], 3095 ],
  3096 + "support": {
  3097 + "source": "https://github.com/symfony/service-contracts/tree/v1.1.2"
  3098 + },
2213 "install-path": "../symfony/service-contracts" 3099 "install-path": "../symfony/service-contracts"
2214 }, 3100 },
2215 { 3101 {
2216 "name": "symfony/var-exporter", 3102 "name": "symfony/var-exporter",
2217 "version": "v4.4.43", 3103 "version": "v4.4.43",
2218 "version_normalized": "4.4.43.0", 3104 "version_normalized": "4.4.43.0",
  3105 + "source": {
  3106 + "type": "git",
  3107 + "url": "https://github.com/symfony/var-exporter.git",
  3108 + "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b"
  3109 + },
2219 "dist": { 3110 "dist": {
2220 "type": "zip", 3111 "type": "zip",
2221 - "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/var-exporter/v4.4.43/symfony-var-exporter-v4.4.43.zip", 3112 + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4a7a3a3d55c471d396e6d28011368b7b83cb518b",
2222 "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b", 3113 "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b",
2223 - "shasum": "" 3114 + "shasum": "",
  3115 + "mirrors": [
  3116 + {
  3117 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3118 + "preferred": true
  3119 + }
  3120 + ]
2224 }, 3121 },
2225 "require": { 3122 "require": {
2226 "php": ">=7.1.3", 3123 "php": ">=7.1.3",
@@ -2240,6 +3137,7 @@ @@ -2240,6 +3137,7 @@
2240 "/Tests/" 3137 "/Tests/"
2241 ] 3138 ]
2242 }, 3139 },
  3140 + "notification-url": "https://packagist.org/downloads/",
2243 "license": [ 3141 "license": [
2244 "MIT" 3142 "MIT"
2245 ], 3143 ],
@@ -2263,6 +3161,23 @@ @@ -2263,6 +3161,23 @@
2263 "instantiate", 3161 "instantiate",
2264 "serialize" 3162 "serialize"
2265 ], 3163 ],
  3164 + "support": {
  3165 + "source": "https://github.com/symfony/var-exporter/tree/v4.4.43"
  3166 + },
  3167 + "funding": [
  3168 + {
  3169 + "url": "https://symfony.com/sponsor",
  3170 + "type": "custom"
  3171 + },
  3172 + {
  3173 + "url": "https://github.com/fabpot",
  3174 + "type": "github"
  3175 + },
  3176 + {
  3177 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
  3178 + "type": "tidelift"
  3179 + }
  3180 + ],
2266 "install-path": "../symfony/var-exporter" 3181 "install-path": "../symfony/var-exporter"
2267 }, 3182 },
2268 { 3183 {
@@ -2272,7 +3187,7 @@ @@ -2272,7 +3187,7 @@
2272 "source": { 3187 "source": {
2273 "type": "git", 3188 "type": "git",
2274 "url": "https://gitee.com/fastadminnet/framework.git", 3189 "url": "https://gitee.com/fastadminnet/framework.git",
2275 - "reference": "a5f1cedf07bb3489f7e3b5254496afbf600d4e65" 3190 + "reference": "096811899433eb0eb0988f1fe1db56ebb521bf34"
2276 }, 3191 },
2277 "require": { 3192 "require": {
2278 "php": ">=7.1.0", 3193 "php": ">=7.1.0",
@@ -2286,7 +3201,7 @@ @@ -2286,7 +3201,7 @@
2286 "phpunit/phpunit": "4.8.*", 3201 "phpunit/phpunit": "4.8.*",
2287 "sebastian/phpcpd": "2.*" 3202 "sebastian/phpcpd": "2.*"
2288 }, 3203 },
2289 - "time": "2022-12-05T14:00:16+00:00", 3204 + "time": "2022-12-19T02:13:42+00:00",
2290 "default-branch": true, 3205 "default-branch": true,
2291 "type": "think-framework", 3206 "type": "think-framework",
2292 "installation-source": "source", 3207 "installation-source": "source",
@@ -2317,11 +3232,22 @@ @@ -2317,11 +3232,22 @@
2317 "name": "topthink/think-captcha", 3232 "name": "topthink/think-captcha",
2318 "version": "v1.0.7", 3233 "version": "v1.0.7",
2319 "version_normalized": "1.0.7.0", 3234 "version_normalized": "1.0.7.0",
  3235 + "source": {
  3236 + "type": "git",
  3237 + "url": "https://github.com/top-think/think-captcha.git",
  3238 + "reference": "0c55455df26a1626a60d0dc35d2d89002b741d44"
  3239 + },
2320 "dist": { 3240 "dist": {
2321 "type": "zip", 3241 "type": "zip",
2322 - "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-captcha/v1.0.7/topthink-think-captcha-v1.0.7.zip", 3242 + "url": "https://api.github.com/repos/top-think/think-captcha/zipball/0c55455df26a1626a60d0dc35d2d89002b741d44",
2323 "reference": "0c55455df26a1626a60d0dc35d2d89002b741d44", 3243 "reference": "0c55455df26a1626a60d0dc35d2d89002b741d44",
2324 - "shasum": "" 3244 + "shasum": "",
  3245 + "mirrors": [
  3246 + {
  3247 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3248 + "preferred": true
  3249 + }
  3250 + ]
2325 }, 3251 },
2326 "time": "2016-07-06T01:47:11+00:00", 3252 "time": "2016-07-06T01:47:11+00:00",
2327 "type": "library", 3253 "type": "library",
@@ -2334,6 +3260,7 @@ @@ -2334,6 +3260,7 @@
2334 "think\\captcha\\": "src/" 3260 "think\\captcha\\": "src/"
2335 } 3261 }
2336 }, 3262 },
  3263 + "notification-url": "https://packagist.org/downloads/",
2337 "license": [ 3264 "license": [
2338 "Apache-2.0" 3265 "Apache-2.0"
2339 ], 3266 ],
@@ -2344,17 +3271,32 @@ @@ -2344,17 +3271,32 @@
2344 } 3271 }
2345 ], 3272 ],
2346 "description": "captcha package for thinkphp5", 3273 "description": "captcha package for thinkphp5",
  3274 + "support": {
  3275 + "issues": "https://github.com/top-think/think-captcha/issues",
  3276 + "source": "https://github.com/top-think/think-captcha/tree/master"
  3277 + },
2347 "install-path": "../topthink/think-captcha" 3278 "install-path": "../topthink/think-captcha"
2348 }, 3279 },
2349 { 3280 {
2350 "name": "topthink/think-helper", 3281 "name": "topthink/think-helper",
2351 "version": "v1.0.7", 3282 "version": "v1.0.7",
2352 "version_normalized": "1.0.7.0", 3283 "version_normalized": "1.0.7.0",
  3284 + "source": {
  3285 + "type": "git",
  3286 + "url": "https://github.com/top-think/think-helper.git",
  3287 + "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019"
  3288 + },
2353 "dist": { 3289 "dist": {
2354 "type": "zip", 3290 "type": "zip",
2355 - "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-helper/v1.0.7/topthink-think-helper-v1.0.7.zip", 3291 + "url": "https://api.github.com/repos/top-think/think-helper/zipball/5f92178606c8ce131d36b37a57c58eb71e55f019",
2356 "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019", 3292 "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019",
2357 - "shasum": "" 3293 + "shasum": "",
  3294 + "mirrors": [
  3295 + {
  3296 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3297 + "preferred": true
  3298 + }
  3299 + ]
2358 }, 3300 },
2359 "time": "2018-10-05T00:43:21+00:00", 3301 "time": "2018-10-05T00:43:21+00:00",
2360 "type": "library", 3302 "type": "library",
@@ -2367,6 +3309,7 @@ @@ -2367,6 +3309,7 @@
2367 "think\\helper\\": "src" 3309 "think\\helper\\": "src"
2368 } 3310 }
2369 }, 3311 },
  3312 + "notification-url": "https://packagist.org/downloads/",
2370 "license": [ 3313 "license": [
2371 "Apache-2.0" 3314 "Apache-2.0"
2372 ], 3315 ],
@@ -2377,17 +3320,32 @@ @@ -2377,17 +3320,32 @@
2377 } 3320 }
2378 ], 3321 ],
2379 "description": "The ThinkPHP5 Helper Package", 3322 "description": "The ThinkPHP5 Helper Package",
  3323 + "support": {
  3324 + "issues": "https://github.com/top-think/think-helper/issues",
  3325 + "source": "https://github.com/top-think/think-helper/tree/master"
  3326 + },
2380 "install-path": "../topthink/think-helper" 3327 "install-path": "../topthink/think-helper"
2381 }, 3328 },
2382 { 3329 {
2383 "name": "topthink/think-installer", 3330 "name": "topthink/think-installer",
2384 "version": "v1.0.14", 3331 "version": "v1.0.14",
2385 "version_normalized": "1.0.14.0", 3332 "version_normalized": "1.0.14.0",
  3333 + "source": {
  3334 + "type": "git",
  3335 + "url": "https://github.com/top-think/think-installer.git",
  3336 + "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1"
  3337 + },
2386 "dist": { 3338 "dist": {
2387 "type": "zip", 3339 "type": "zip",
2388 - "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-installer/v1.0.14/topthink-think-installer-v1.0.14.zip", 3340 + "url": "https://api.github.com/repos/top-think/think-installer/zipball/eae1740ac264a55c06134b6685dfb9f837d004d1",
2389 "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1", 3341 "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1",
2390 - "shasum": "" 3342 + "shasum": "",
  3343 + "mirrors": [
  3344 + {
  3345 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3346 + "preferred": true
  3347 + }
  3348 + ]
2391 }, 3349 },
2392 "require": { 3350 "require": {
2393 "composer-plugin-api": "^1.0||^2.0" 3351 "composer-plugin-api": "^1.0||^2.0"
@@ -2406,6 +3364,7 @@ @@ -2406,6 +3364,7 @@
2406 "think\\composer\\": "src" 3364 "think\\composer\\": "src"
2407 } 3365 }
2408 }, 3366 },
  3367 + "notification-url": "https://packagist.org/downloads/",
2409 "license": [ 3368 "license": [
2410 "Apache-2.0" 3369 "Apache-2.0"
2411 ], 3370 ],
@@ -2415,17 +3374,32 @@ @@ -2415,17 +3374,32 @@
2415 "email": "448901948@qq.com" 3374 "email": "448901948@qq.com"
2416 } 3375 }
2417 ], 3376 ],
  3377 + "support": {
  3378 + "issues": "https://github.com/top-think/think-installer/issues",
  3379 + "source": "https://github.com/top-think/think-installer/tree/v1.0.14"
  3380 + },
2418 "install-path": "../topthink/think-installer" 3381 "install-path": "../topthink/think-installer"
2419 }, 3382 },
2420 { 3383 {
2421 "name": "topthink/think-queue", 3384 "name": "topthink/think-queue",
2422 "version": "v1.1.6", 3385 "version": "v1.1.6",
2423 "version_normalized": "1.1.6.0", 3386 "version_normalized": "1.1.6.0",
  3387 + "source": {
  3388 + "type": "git",
  3389 + "url": "https://github.com/top-think/think-queue.git",
  3390 + "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245"
  3391 + },
2424 "dist": { 3392 "dist": {
2425 "type": "zip", 3393 "type": "zip",
2426 - "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-queue/v1.1.6/topthink-think-queue-v1.1.6.zip", 3394 + "url": "https://api.github.com/repos/top-think/think-queue/zipball/250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245",
2427 "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245", 3395 "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245",
2428 - "shasum": "" 3396 + "shasum": "",
  3397 + "mirrors": [
  3398 + {
  3399 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3400 + "preferred": true
  3401 + }
  3402 + ]
2429 }, 3403 },
2430 "require": { 3404 "require": {
2431 "topthink/think-helper": ">=1.0.4", 3405 "topthink/think-helper": ">=1.0.4",
@@ -2450,6 +3424,7 @@ @@ -2450,6 +3424,7 @@
2450 "think\\": "src" 3424 "think\\": "src"
2451 } 3425 }
2452 }, 3426 },
  3427 + "notification-url": "https://packagist.org/downloads/",
2453 "license": [ 3428 "license": [
2454 "Apache-2.0" 3429 "Apache-2.0"
2455 ], 3430 ],
@@ -2460,17 +3435,32 @@ @@ -2460,17 +3435,32 @@
2460 } 3435 }
2461 ], 3436 ],
2462 "description": "The ThinkPHP5 Queue Package", 3437 "description": "The ThinkPHP5 Queue Package",
  3438 + "support": {
  3439 + "issues": "https://github.com/top-think/think-queue/issues",
  3440 + "source": "https://github.com/top-think/think-queue/tree/master"
  3441 + },
2463 "install-path": "../topthink/think-queue" 3442 "install-path": "../topthink/think-queue"
2464 }, 3443 },
2465 { 3444 {
2466 "name": "txthinking/mailer", 3445 "name": "txthinking/mailer",
2467 "version": "v2.0.1", 3446 "version": "v2.0.1",
2468 "version_normalized": "2.0.1.0", 3447 "version_normalized": "2.0.1.0",
  3448 + "source": {
  3449 + "type": "git",
  3450 + "url": "https://github.com/txthinking/Mailer.git",
  3451 + "reference": "09013cf9dad3aac195f66ae5309e8c3343c018e9"
  3452 + },
2469 "dist": { 3453 "dist": {
2470 "type": "zip", 3454 "type": "zip",
2471 - "url": "https://mirrors.cloud.tencent.com/repository/composer/txthinking/mailer/v2.0.1/txthinking-mailer-v2.0.1.zip", 3455 + "url": "https://api.github.com/repos/txthinking/Mailer/zipball/09013cf9dad3aac195f66ae5309e8c3343c018e9",
2472 "reference": "09013cf9dad3aac195f66ae5309e8c3343c018e9", 3456 "reference": "09013cf9dad3aac195f66ae5309e8c3343c018e9",
2473 - "shasum": "" 3457 + "shasum": "",
  3458 + "mirrors": [
  3459 + {
  3460 + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
  3461 + "preferred": true
  3462 + }
  3463 + ]
2474 }, 3464 },
2475 "require": { 3465 "require": {
2476 "php": ">=5.3.2", 3466 "php": ">=5.3.2",
@@ -2488,6 +3478,7 @@ @@ -2488,6 +3478,7 @@
2488 "Tx\\": "src/" 3478 "Tx\\": "src/"
2489 } 3479 }
2490 }, 3480 },
  3481 + "notification-url": "https://packagist.org/downloads/",
2491 "license": [ 3482 "license": [
2492 "MIT" 3483 "MIT"
2493 ], 3484 ],
@@ -2509,6 +3500,10 @@ @@ -2509,6 +3500,10 @@
2509 "mail", 3500 "mail",
2510 "smtp" 3501 "smtp"
2511 ], 3502 ],
  3503 + "support": {
  3504 + "issues": "https://github.com/txthinking/Mailer/issues",
  3505 + "source": "https://github.com/txthinking/Mailer/tree/master"
  3506 + },
2512 "install-path": "../txthinking/mailer" 3507 "install-path": "../txthinking/mailer"
2513 } 3508 }
2514 ], 3509 ],
1 <?php return array( 1 <?php return array(
2 'root' => array( 2 'root' => array(
3 'name' => 'karsonzhang/fastadmin', 3 'name' => 'karsonzhang/fastadmin',
4 - 'pretty_version' => '1.3.5.x-dev',  
5 - 'version' => '1.3.5.9999999-dev',  
6 - 'reference' => 'f8292a8813201872005173b7d2ec3ca556a25cfd', 4 + 'pretty_version' => 'dev-master',
  5 + 'version' => 'dev-master',
  6 + 'reference' => 'fe2e4869d9e522858b92133ebd57217ba709c0fc',
7 'type' => 'project', 7 'type' => 'project',
8 'install_path' => __DIR__ . '/../../', 8 'install_path' => __DIR__ . '/../../',
9 'aliases' => array(), 9 'aliases' => array(),
@@ -29,36 +29,36 @@ @@ -29,36 +29,36 @@
29 'dev_requirement' => false, 29 'dev_requirement' => false,
30 ), 30 ),
31 'guzzlehttp/guzzle' => array( 31 'guzzlehttp/guzzle' => array(
32 - 'pretty_version' => '7.5.0',  
33 - 'version' => '7.5.0.0',  
34 - 'reference' => 'b50a2a1251152e43f6a37f0fa053e730a67d25ba', 32 + 'pretty_version' => '7.7.0',
  33 + 'version' => '7.7.0.0',
  34 + 'reference' => 'fb7566caccf22d74d1ab270de3551f72a58399f5',
35 'type' => 'library', 35 'type' => 'library',
36 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 36 'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
37 'aliases' => array(), 37 'aliases' => array(),
38 'dev_requirement' => false, 38 'dev_requirement' => false,
39 ), 39 ),
40 'guzzlehttp/promises' => array( 40 'guzzlehttp/promises' => array(
41 - 'pretty_version' => '1.5.2',  
42 - 'version' => '1.5.2.0',  
43 - 'reference' => 'b94b2807d85443f9719887892882d0329d1e2598', 41 + 'pretty_version' => '1.5.3',
  42 + 'version' => '1.5.3.0',
  43 + 'reference' => '67ab6e18aaa14d753cc148911d273f6e6cb6721e',
44 'type' => 'library', 44 'type' => 'library',
45 'install_path' => __DIR__ . '/../guzzlehttp/promises', 45 'install_path' => __DIR__ . '/../guzzlehttp/promises',
46 'aliases' => array(), 46 'aliases' => array(),
47 'dev_requirement' => false, 47 'dev_requirement' => false,
48 ), 48 ),
49 'guzzlehttp/psr7' => array( 49 'guzzlehttp/psr7' => array(
50 - 'pretty_version' => '2.4.3',  
51 - 'version' => '2.4.3.0',  
52 - 'reference' => '67c26b443f348a51926030c83481b85718457d3d', 50 + 'pretty_version' => '2.5.0',
  51 + 'version' => '2.5.0.0',
  52 + 'reference' => 'b635f279edd83fc275f822a1188157ffea568ff6',
53 'type' => 'library', 53 'type' => 'library',
54 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 54 'install_path' => __DIR__ . '/../guzzlehttp/psr7',
55 'aliases' => array(), 55 'aliases' => array(),
56 'dev_requirement' => false, 56 'dev_requirement' => false,
57 ), 57 ),
58 'karsonzhang/fastadmin' => array( 58 'karsonzhang/fastadmin' => array(
59 - 'pretty_version' => '1.3.5.x-dev',  
60 - 'version' => '1.3.5.9999999-dev',  
61 - 'reference' => 'f8292a8813201872005173b7d2ec3ca556a25cfd', 59 + 'pretty_version' => 'dev-master',
  60 + 'version' => 'dev-master',
  61 + 'reference' => 'fe2e4869d9e522858b92133ebd57217ba709c0fc',
62 'type' => 'project', 62 'type' => 'project',
63 'install_path' => __DIR__ . '/../../', 63 'install_path' => __DIR__ . '/../../',
64 'aliases' => array(), 64 'aliases' => array(),
@@ -73,6 +73,15 @@ @@ -73,6 +73,15 @@
73 'aliases' => array(), 73 'aliases' => array(),
74 'dev_requirement' => false, 74 'dev_requirement' => false,
75 ), 75 ),
  76 + 'kkokk/poster' => array(
  77 + 'pretty_version' => 'v2.0.6',
  78 + 'version' => '2.0.6.0',
  79 + 'reference' => 'a657ab240330b2d667416431fd7454dff73bebdf',
  80 + 'type' => 'project',
  81 + 'install_path' => __DIR__ . '/../kkokk/poster',
  82 + 'aliases' => array(),
  83 + 'dev_requirement' => false,
  84 + ),
76 'maennchen/zipstream-php' => array( 85 'maennchen/zipstream-php' => array(
77 'pretty_version' => '2.2.6', 86 'pretty_version' => '2.2.6',
78 'version' => '2.2.6.0', 87 'version' => '2.2.6.0',
@@ -101,18 +110,18 @@ @@ -101,18 +110,18 @@
101 'dev_requirement' => false, 110 'dev_requirement' => false,
102 ), 111 ),
103 'monolog/monolog' => array( 112 'monolog/monolog' => array(
104 - 'pretty_version' => '2.8.0',  
105 - 'version' => '2.8.0.0',  
106 - 'reference' => '720488632c590286b88b80e62aa3d3d551ad4a50', 113 + 'pretty_version' => '2.9.0',
  114 + 'version' => '2.9.0.0',
  115 + 'reference' => 'e1c0ae1528ce313a450e5e1ad782765c4a8dd3cb',
107 'type' => 'library', 116 'type' => 'library',
108 'install_path' => __DIR__ . '/../monolog/monolog', 117 'install_path' => __DIR__ . '/../monolog/monolog',
109 'aliases' => array(), 118 'aliases' => array(),
110 'dev_requirement' => false, 119 'dev_requirement' => false,
111 ), 120 ),
112 'myclabs/php-enum' => array( 121 'myclabs/php-enum' => array(
113 - 'pretty_version' => '1.8.4',  
114 - 'version' => '1.8.4.0',  
115 - 'reference' => 'a867478eae49c9f59ece437ae7f9506bfaa27483', 122 + 'pretty_version' => '1.8.3',
  123 + 'version' => '1.8.3.0',
  124 + 'reference' => 'b942d263c641ddb5190929ff840c68f78713e937',
116 'type' => 'library', 125 'type' => 'library',
117 'install_path' => __DIR__ . '/../myclabs/php-enum', 126 'install_path' => __DIR__ . '/../myclabs/php-enum',
118 'aliases' => array(), 127 'aliases' => array(),
@@ -146,9 +155,9 @@ @@ -146,9 +155,9 @@
146 'dev_requirement' => false, 155 'dev_requirement' => false,
147 ), 156 ),
148 'overtrue/wechat' => array( 157 'overtrue/wechat' => array(
149 - 'pretty_version' => '4.7.0',  
150 - 'version' => '4.7.0.0',  
151 - 'reference' => '4accb0627803ffb6e45d2988898a0293d2a48e68', 158 + 'pretty_version' => '4.6.0',
  159 + 'version' => '4.6.0.0',
  160 + 'reference' => '52af4cbe777cd4aea307beafa0a4518c347467b1',
152 'type' => 'library', 161 'type' => 'library',
153 'install_path' => __DIR__ . '/../overtrue/wechat', 162 'install_path' => __DIR__ . '/../overtrue/wechat',
154 'aliases' => array(), 163 'aliases' => array(),
@@ -236,9 +245,9 @@ @@ -236,9 +245,9 @@
236 ), 245 ),
237 ), 246 ),
238 'psr/http-factory' => array( 247 'psr/http-factory' => array(
239 - 'pretty_version' => '1.0.1',  
240 - 'version' => '1.0.1.0',  
241 - 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', 248 + 'pretty_version' => '1.0.2',
  249 + 'version' => '1.0.2.0',
  250 + 'reference' => 'e616d01114759c4c489f93b099585439f795fe35',
242 'type' => 'library', 251 'type' => 'library',
243 'install_path' => __DIR__ . '/../psr/http-factory', 252 'install_path' => __DIR__ . '/../psr/http-factory',
244 'aliases' => array(), 253 'aliases' => array(),
@@ -251,9 +260,9 @@ @@ -251,9 +260,9 @@
251 ), 260 ),
252 ), 261 ),
253 'psr/http-message' => array( 262 'psr/http-message' => array(
254 - 'pretty_version' => '1.0.1',  
255 - 'version' => '1.0.1.0',  
256 - 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', 263 + 'pretty_version' => '1.1',
  264 + 'version' => '1.1.0.0',
  265 + 'reference' => 'cb6ce4845ce34a8ad9e68117c10ee90a29919eba',
257 'type' => 'library', 266 'type' => 'library',
258 'install_path' => __DIR__ . '/../psr/http-message', 267 'install_path' => __DIR__ . '/../psr/http-message',
259 'aliases' => array(), 268 'aliases' => array(),
@@ -305,9 +314,9 @@ @@ -305,9 +314,9 @@
305 'dev_requirement' => false, 314 'dev_requirement' => false,
306 ), 315 ),
307 'symfony/cache' => array( 316 'symfony/cache' => array(
308 - 'pretty_version' => 'v5.4.15',  
309 - 'version' => '5.4.15.0',  
310 - 'reference' => '60e87188abbacd29ccde44d69c5392a33e888e98', 317 + 'pretty_version' => 'v5.4.23',
  318 + 'version' => '5.4.23.0',
  319 + 'reference' => '983c79ff28612cdfd66d8e44e1a06e5afc87e107',
311 'type' => 'library', 320 'type' => 'library',
312 'install_path' => __DIR__ . '/../symfony/cache', 321 'install_path' => __DIR__ . '/../symfony/cache',
313 'aliases' => array(), 322 'aliases' => array(),
@@ -338,9 +347,9 @@ @@ -338,9 +347,9 @@
338 'dev_requirement' => false, 347 'dev_requirement' => false,
339 ), 348 ),
340 'symfony/event-dispatcher' => array( 349 'symfony/event-dispatcher' => array(
341 - 'pretty_version' => 'v5.4.9',  
342 - 'version' => '5.4.9.0',  
343 - 'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc', 350 + 'pretty_version' => 'v5.4.22',
  351 + 'version' => '5.4.22.0',
  352 + 'reference' => '1df20e45d56da29a4b1d8259dd6e950acbf1b13f',
344 'type' => 'library', 353 'type' => 'library',
345 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 354 'install_path' => __DIR__ . '/../symfony/event-dispatcher',
346 'aliases' => array(), 355 'aliases' => array(),
@@ -362,18 +371,18 @@ @@ -362,18 +371,18 @@
362 ), 371 ),
363 ), 372 ),
364 'symfony/finder' => array( 373 'symfony/finder' => array(
365 - 'pretty_version' => 'v5.4.11',  
366 - 'version' => '5.4.11.0',  
367 - 'reference' => '7872a66f57caffa2916a584db1aa7f12adc76f8c', 374 + 'pretty_version' => 'v5.4.21',
  375 + 'version' => '5.4.21.0',
  376 + 'reference' => '078e9a5e1871fcfe6a5ce421b539344c21afef19',
368 'type' => 'library', 377 'type' => 'library',
369 'install_path' => __DIR__ . '/../symfony/finder', 378 'install_path' => __DIR__ . '/../symfony/finder',
370 'aliases' => array(), 379 'aliases' => array(),
371 'dev_requirement' => false, 380 'dev_requirement' => false,
372 ), 381 ),
373 'symfony/http-foundation' => array( 382 'symfony/http-foundation' => array(
374 - 'pretty_version' => 'v5.4.16',  
375 - 'version' => '5.4.16.0',  
376 - 'reference' => '5032c5849aef24741e1970cb03511b0dd131d838', 383 + 'pretty_version' => 'v5.4.24',
  384 + 'version' => '5.4.24.0',
  385 + 'reference' => '3c59f97f6249ce552a44f01b93bfcbd786a954f5',
377 'type' => 'library', 386 'type' => 'library',
378 'install_path' => __DIR__ . '/../symfony/http-foundation', 387 'install_path' => __DIR__ . '/../symfony/http-foundation',
379 'aliases' => array(), 388 'aliases' => array(),
@@ -407,9 +416,9 @@ @@ -407,9 +416,9 @@
407 'dev_requirement' => false, 416 'dev_requirement' => false,
408 ), 417 ),
409 'symfony/psr-http-message-bridge' => array( 418 'symfony/psr-http-message-bridge' => array(
410 - 'pretty_version' => 'v2.1.4',  
411 - 'version' => '2.1.4.0',  
412 - 'reference' => 'a125b93ef378c492e274f217874906fb9babdebb', 419 + 'pretty_version' => 'v2.2.0',
  420 + 'version' => '2.2.0.0',
  421 + 'reference' => '28a732c05bbad801304ad5a5c674cf2970508993',
413 'type' => 'symfony-bridge', 422 'type' => 'symfony-bridge',
414 'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge', 423 'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
415 'aliases' => array(), 424 'aliases' => array(),
@@ -436,7 +445,7 @@ @@ -436,7 +445,7 @@
436 'topthink/framework' => array( 445 'topthink/framework' => array(
437 'pretty_version' => 'dev-master', 446 'pretty_version' => 'dev-master',
438 'version' => 'dev-master', 447 'version' => 'dev-master',
439 - 'reference' => 'a5f1cedf07bb3489f7e3b5254496afbf600d4e65', 448 + 'reference' => '096811899433eb0eb0988f1fe1db56ebb521bf34',
440 'type' => 'think-framework', 449 'type' => 'think-framework',
441 'install_path' => __DIR__ . '/../../thinkphp', 450 'install_path' => __DIR__ . '/../../thinkphp',
442 'aliases' => array( 451 'aliases' => array(
@@ -2,6 +2,52 @@ @@ -2,6 +2,52 @@
2 2
3 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. 3 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
4 4
  5 +
  6 +## 7.7.0 - 2023-05-21
  7 +
  8 +### Added
  9 +
  10 +- Support `guzzlehttp/promises` v2
  11 +
  12 +
  13 +## 7.6.1 - 2023-05-15
  14 +
  15 +### Fixed
  16 +
  17 +- Fix `SetCookie::fromString` MaxAge deprecation warning and skip invalid MaxAge values
  18 +
  19 +
  20 +## 7.6.0 - 2023-05-14
  21 +
  22 +### Added
  23 +
  24 +- Support for setting the minimum TLS version in a unified way
  25 +- Apply on request the version set in options parameters
  26 +
  27 +
  28 +## 7.5.2 - 2023-05-14
  29 +
  30 +### Fixed
  31 +
  32 +- Fixed set cookie constructor validation
  33 +- Fixed handling of files with `'0'` body
  34 +
  35 +### Changed
  36 +
  37 +- Corrected docs and default connect timeout value to 300 seconds
  38 +
  39 +
  40 +## 7.5.1 - 2023-04-17
  41 +
  42 +### Fixed
  43 +
  44 +- Fixed `NO_PROXY` settings so that setting the `proxy` option to `no` overrides the env variable
  45 +
  46 +### Changed
  47 +
  48 +- Adjusted `guzzlehttp/psr7` version constraint to `^1.9.1 || ^2.4.5`
  49 +
  50 +
5 ## 7.5.0 - 2022-08-28 51 ## 7.5.0 - 2022-08-28
6 52
7 ### Added 53 ### Added
@@ -9,20 +55,30 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -9,20 +55,30 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
9 - Support PHP 8.2 55 - Support PHP 8.2
10 - Add request to delay closure params 56 - Add request to delay closure params
11 57
  58 +
12 ## 7.4.5 - 2022-06-20 59 ## 7.4.5 - 2022-06-20
13 60
  61 +### Fixed
  62 +
14 * Fix change in port should be considered a change in origin 63 * Fix change in port should be considered a change in origin
15 * Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin 64 * Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
16 65
  66 +
17 ## 7.4.4 - 2022-06-09 67 ## 7.4.4 - 2022-06-09
18 68
  69 +### Fixed
  70 +
19 * Fix failure to strip Authorization header on HTTP downgrade 71 * Fix failure to strip Authorization header on HTTP downgrade
20 * Fix failure to strip the Cookie header on change in host or HTTP downgrade 72 * Fix failure to strip the Cookie header on change in host or HTTP downgrade
21 73
  74 +
22 ## 7.4.3 - 2022-05-25 75 ## 7.4.3 - 2022-05-25
23 76
  77 +### Fixed
  78 +
24 * Fix cross-domain cookie leakage 79 * Fix cross-domain cookie leakage
25 80
  81 +
26 ## 7.4.2 - 2022-03-20 82 ## 7.4.2 - 2022-03-20
27 83
28 ### Fixed 84 ### Fixed
@@ -31,6 +87,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -31,6 +87,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
31 - Reject non-HTTP schemes in StreamHandler 87 - Reject non-HTTP schemes in StreamHandler
32 - Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve` 88 - Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`
33 89
  90 +
34 ## 7.4.1 - 2021-12-06 91 ## 7.4.1 - 2021-12-06
35 92
36 ### Changed 93 ### Changed
@@ -42,6 +99,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -42,6 +99,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
42 99
43 - Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950) 100 - Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950)
44 101
  102 +
45 ## 7.4.0 - 2021-10-18 103 ## 7.4.0 - 2021-10-18
46 104
47 ### Added 105 ### Added
@@ -59,6 +117,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -59,6 +117,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
59 117
60 - Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945) 118 - Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945)
61 119
  120 +
62 ## 7.3.0 - 2021-03-23 121 ## 7.3.0 - 2021-03-23
63 122
64 ### Added 123 ### Added
@@ -71,6 +130,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -71,6 +130,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
71 130
72 - Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872) 131 - Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872)
73 132
  133 +
74 ## 7.2.0 - 2020-10-10 134 ## 7.2.0 - 2020-10-10
75 135
76 ### Added 136 ### Added
@@ -93,6 +153,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -93,6 +153,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
93 153
94 - Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786) 154 - Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786)
95 155
  156 +
96 ## 7.1.1 - 2020-09-30 157 ## 7.1.1 - 2020-09-30
97 158
98 ### Fixed 159 ### Fixed
@@ -104,6 +165,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -104,6 +165,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
104 - We dont connect curl `sink` on HEAD requests. 165 - We dont connect curl `sink` on HEAD requests.
105 - Removed some PHP 5 workarounds 166 - Removed some PHP 5 workarounds
106 167
  168 +
107 ## 7.1.0 - 2020-09-22 169 ## 7.1.0 - 2020-09-22
108 170
109 ### Added 171 ### Added
@@ -126,14 +188,17 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version @@ -126,14 +188,17 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
126 - `Utils::defaultCaBundle()` 188 - `Utils::defaultCaBundle()`
127 - `CurlFactory::LOW_CURL_VERSION_NUMBER` 189 - `CurlFactory::LOW_CURL_VERSION_NUMBER`
128 190
  191 +
129 ## 7.0.1 - 2020-06-27 192 ## 7.0.1 - 2020-06-27
130 193
131 * Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699) 194 * Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699)
132 195
  196 +
133 ## 7.0.0 - 2020-06-27 197 ## 7.0.0 - 2020-06-27
134 198
135 No changes since 7.0.0-rc1. 199 No changes since 7.0.0-rc1.
136 200
  201 +
137 ## 7.0.0-rc1 - 2020-06-15 202 ## 7.0.0-rc1 - 2020-06-15
138 203
139 ### Changed 204 ### Changed
@@ -141,6 +206,7 @@ No changes since 7.0.0-rc1. @@ -141,6 +206,7 @@ No changes since 7.0.0-rc1.
141 * Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629) 206 * Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629)
142 * Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675) 207 * Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675)
143 208
  209 +
144 ## 7.0.0-beta2 - 2020-05-25 210 ## 7.0.0-beta2 - 2020-05-25
145 211
146 ### Added 212 ### Added
@@ -166,6 +232,7 @@ No changes since 7.0.0-rc1. @@ -166,6 +232,7 @@ No changes since 7.0.0-rc1.
166 232
167 * Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528) 233 * Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528)
168 234
  235 +
169 ## 7.0.0-beta1 - 2019-12-30 236 ## 7.0.0-beta1 - 2019-12-30
170 237
171 The diff might look very big but 95% of Guzzle users will be able to upgrade without modification. 238 The diff might look very big but 95% of Guzzle users will be able to upgrade without modification.
@@ -199,15 +266,18 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -199,15 +266,18 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
199 * `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440) 266 * `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440)
200 * Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464) 267 * Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464)
201 268
  269 +
202 ## 6.5.2 - 2019-12-23 270 ## 6.5.2 - 2019-12-23
203 271
204 * idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) 272 * idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)
205 273
  274 +
206 ## 6.5.1 - 2019-12-21 275 ## 6.5.1 - 2019-12-21
207 276
208 * Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) 277 * Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)
209 * IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) 278 * IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)
210 279
  280 +
211 ## 6.5.0 - 2019-12-07 281 ## 6.5.0 - 2019-12-07
212 282
213 * Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) 283 * Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)
@@ -217,11 +287,13 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -217,11 +287,13 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
217 * Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) 287 * Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)
218 * Deprecated `ClientInterface::VERSION` 288 * Deprecated `ClientInterface::VERSION`
219 289
  290 +
220 ## 6.4.1 - 2019-10-23 291 ## 6.4.1 - 2019-10-23
221 292
222 * No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that 293 * No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that
223 * Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` 294 * Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`
224 295
  296 +
225 ## 6.4.0 - 2019-10-23 297 ## 6.4.0 - 2019-10-23
226 298
227 * Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) 299 * Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)
@@ -234,6 +306,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -234,6 +306,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
234 * Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) 306 * Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)
235 * Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) 307 * Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)
236 308
  309 +
237 ## 6.3.3 - 2018-04-22 310 ## 6.3.3 - 2018-04-22
238 311
239 * Fix: Default headers when decode_content is specified 312 * Fix: Default headers when decode_content is specified
@@ -275,13 +348,14 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -275,13 +348,14 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
275 * Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) 348 * Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)
276 * Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) 349 * Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)
277 350
278 -  
279 + Minor code cleanups, documentation fixes and clarifications. 351 + Minor code cleanups, documentation fixes and clarifications.
280 352
  353 +
281 ## 6.2.3 - 2017-02-28 354 ## 6.2.3 - 2017-02-28
282 355
283 * Fix deprecations with guzzle/psr7 version 1.4 356 * Fix deprecations with guzzle/psr7 version 1.4
284 357
  358 +
285 ## 6.2.2 - 2016-10-08 359 ## 6.2.2 - 2016-10-08
286 360
287 * Allow to pass nullable Response to delay callable 361 * Allow to pass nullable Response to delay callable
@@ -289,6 +363,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -289,6 +363,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
289 * Fix drain case where content-length is the literal string zero 363 * Fix drain case where content-length is the literal string zero
290 * Obfuscate in-URL credentials in exceptions 364 * Obfuscate in-URL credentials in exceptions
291 365
  366 +
292 ## 6.2.1 - 2016-07-18 367 ## 6.2.1 - 2016-07-18
293 368
294 * Address HTTP_PROXY security vulnerability, CVE-2016-5385: 369 * Address HTTP_PROXY security vulnerability, CVE-2016-5385:
@@ -299,6 +374,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -299,6 +374,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
299 a server does not honor `Connection: close`. 374 a server does not honor `Connection: close`.
300 * Ignore URI fragment when sending requests. 375 * Ignore URI fragment when sending requests.
301 376
  377 +
302 ## 6.2.0 - 2016-03-21 378 ## 6.2.0 - 2016-03-21
303 379
304 * Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. 380 * Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`.
@@ -318,6 +394,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -318,6 +394,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
318 * Bug fix: provide an empty string to `http_build_query` for HHVM workaround. 394 * Bug fix: provide an empty string to `http_build_query` for HHVM workaround.
319 https://github.com/guzzle/guzzle/pull/1367 395 https://github.com/guzzle/guzzle/pull/1367
320 396
  397 +
321 ## 6.1.1 - 2015-11-22 398 ## 6.1.1 - 2015-11-22
322 399
323 * Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler 400 * Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler
@@ -333,6 +410,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -333,6 +410,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
333 * Bug fix: fixed regression where MockHandler was not using `sink`. 410 * Bug fix: fixed regression where MockHandler was not using `sink`.
334 https://github.com/guzzle/guzzle/pull/1292 411 https://github.com/guzzle/guzzle/pull/1292
335 412
  413 +
336 ## 6.1.0 - 2015-09-08 414 ## 6.1.0 - 2015-09-08
337 415
338 * Feature: Added the `on_stats` request option to provide access to transfer 416 * Feature: Added the `on_stats` request option to provide access to transfer
@@ -367,6 +445,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -367,6 +445,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
367 * Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. 445 * Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.
368 https://github.com/guzzle/guzzle/pull/1189 446 https://github.com/guzzle/guzzle/pull/1189
369 447
  448 +
370 ## 6.0.2 - 2015-07-04 449 ## 6.0.2 - 2015-07-04
371 450
372 * Fixed a memory leak in the curl handlers in which references to callbacks 451 * Fixed a memory leak in the curl handlers in which references to callbacks
@@ -384,6 +463,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -384,6 +463,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
384 * Functions are now conditionally required using an additional level of 463 * Functions are now conditionally required using an additional level of
385 indirection to help with global Composer installations. 464 indirection to help with global Composer installations.
386 465
  466 +
387 ## 6.0.1 - 2015-05-27 467 ## 6.0.1 - 2015-05-27
388 468
389 * Fixed a bug with serializing the `query` request option where the `&` 469 * Fixed a bug with serializing the `query` request option where the `&`
@@ -392,6 +472,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -392,6 +472,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
392 use `form_params` or `multipart` instead. 472 use `form_params` or `multipart` instead.
393 * Various doc fixes. 473 * Various doc fixes.
394 474
  475 +
395 ## 6.0.0 - 2015-05-26 476 ## 6.0.0 - 2015-05-26
396 477
397 * See the UPGRADING.md document for more information. 478 * See the UPGRADING.md document for more information.
@@ -416,6 +497,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -416,6 +497,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
416 * `$maxHandles` has been removed from CurlMultiHandler. 497 * `$maxHandles` has been removed from CurlMultiHandler.
417 * `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. 498 * `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.
418 499
  500 +
419 ## 5.3.0 - 2015-05-19 501 ## 5.3.0 - 2015-05-19
420 502
421 * Mock now supports `save_to` 503 * Mock now supports `save_to`
@@ -426,6 +508,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -426,6 +508,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
426 * Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. 508 * Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated.
427 * URL scheme is now always lowercased. 509 * URL scheme is now always lowercased.
428 510
  511 +
429 ## 6.0.0-beta.1 512 ## 6.0.0-beta.1
430 513
431 * Requires PHP >= 5.5 514 * Requires PHP >= 5.5
@@ -478,6 +561,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -478,6 +561,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
478 * `GuzzleHttp\QueryParser` has been replaced with the 561 * `GuzzleHttp\QueryParser` has been replaced with the
479 `GuzzleHttp\Psr7\parse_query`. 562 `GuzzleHttp\Psr7\parse_query`.
480 563
  564 +
481 ## 5.2.0 - 2015-01-27 565 ## 5.2.0 - 2015-01-27
482 566
483 * Added `AppliesHeadersInterface` to make applying headers to a request based 567 * Added `AppliesHeadersInterface` to make applying headers to a request based
@@ -488,6 +572,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -488,6 +572,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
488 RingBridge. 572 RingBridge.
489 * Added a guard in the Pool class to not use recursion for request retries. 573 * Added a guard in the Pool class to not use recursion for request retries.
490 574
  575 +
491 ## 5.1.0 - 2014-12-19 576 ## 5.1.0 - 2014-12-19
492 577
493 * Pool class no longer uses recursion when a request is intercepted. 578 * Pool class no longer uses recursion when a request is intercepted.
@@ -508,6 +593,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c @@ -508,6 +593,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
508 * Exceptions thrown in the `end` event are now correctly wrapped with Guzzle 593 * Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
509 specific exceptions if necessary. 594 specific exceptions if necessary.
510 595
  596 +
511 ## 5.0.3 - 2014-11-03 597 ## 5.0.3 - 2014-11-03
512 598
513 This change updates query strings so that they are treated as un-encoded values 599 This change updates query strings so that they are treated as un-encoded values
@@ -522,6 +608,7 @@ string that should not be parsed or encoded (unless a call to getQuery() is @@ -522,6 +608,7 @@ string that should not be parsed or encoded (unless a call to getQuery() is
522 subsequently made, forcing the query-string to be converted into a Query 608 subsequently made, forcing the query-string to be converted into a Query
523 object). 609 object).
524 610
  611 +
525 ## 5.0.2 - 2014-10-30 612 ## 5.0.2 - 2014-10-30
526 613
527 * Added a trailing `\r\n` to multipart/form-data payloads. See 614 * Added a trailing `\r\n` to multipart/form-data payloads. See
@@ -543,6 +630,7 @@ object). @@ -543,6 +630,7 @@ object).
543 string on a URL: Now allowing many more characters to be present in the 630 string on a URL: Now allowing many more characters to be present in the
544 query string without being percent encoded. See https://tools.ietf.org/html/rfc3986#appendix-A 631 query string without being percent encoded. See https://tools.ietf.org/html/rfc3986#appendix-A
545 632
  633 +
546 ## 5.0.1 - 2014-10-16 634 ## 5.0.1 - 2014-10-16
547 635
548 Bugfix release. 636 Bugfix release.
@@ -554,6 +642,7 @@ Bugfix release. @@ -554,6 +642,7 @@ Bugfix release.
554 * Fixed an issue where transfer statistics were not being populated in the 642 * Fixed an issue where transfer statistics were not being populated in the
555 RingBridge. https://github.com/guzzle/guzzle/issues/866 643 RingBridge. https://github.com/guzzle/guzzle/issues/866
556 644
  645 +
557 ## 5.0.0 - 2014-10-12 646 ## 5.0.0 - 2014-10-12
558 647
559 Adding support for non-blocking responses and some minor API cleanup. 648 Adding support for non-blocking responses and some minor API cleanup.
@@ -635,6 +724,7 @@ interfaces. @@ -635,6 +724,7 @@ interfaces.
635 argument. They now accept an associative array of options, including the 724 argument. They now accept an associative array of options, including the
636 "size" key and "metadata" key which can be used to provide custom metadata. 725 "size" key and "metadata" key which can be used to provide custom metadata.
637 726
  727 +
638 ## 4.2.2 - 2014-09-08 728 ## 4.2.2 - 2014-09-08
639 729
640 * Fixed a memory leak in the CurlAdapter when reusing cURL handles. 730 * Fixed a memory leak in the CurlAdapter when reusing cURL handles.
@@ -60,13 +60,13 @@ composer require guzzlehttp/guzzle @@ -60,13 +60,13 @@ composer require guzzlehttp/guzzle
60 60
61 ## Version Guidance 61 ## Version Guidance
62 62
63 -| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |  
64 -|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------|  
65 -| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 |  
66 -| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 |  
67 -| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |  
68 -| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |  
69 -| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.2 | 63 +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |
  64 +|---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------|
  65 +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 |
  66 +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 |
  67 +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |
  68 +| 6.x | Security fixes only | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |
  69 +| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.3 |
70 70
71 [guzzle-3-repo]: https://github.com/guzzle/guzzle3 71 [guzzle-3-repo]: https://github.com/guzzle/guzzle3
72 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x 72 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
@@ -53,8 +53,8 @@ @@ -53,8 +53,8 @@
53 "require": { 53 "require": {
54 "php": "^7.2.5 || ^8.0", 54 "php": "^7.2.5 || ^8.0",
55 "ext-json": "*", 55 "ext-json": "*",
56 - "guzzlehttp/promises": "^1.5",  
57 - "guzzlehttp/psr7": "^1.9 || ^2.4", 56 + "guzzlehttp/promises": "^1.5.3 || ^2.0",
  57 + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
58 "psr/http-client": "^1.0", 58 "psr/http-client": "^1.0",
59 "symfony/deprecation-contracts": "^2.2 || ^3.0" 59 "symfony/deprecation-contracts": "^2.2 || ^3.0"
60 }, 60 },
@@ -64,7 +64,8 @@ @@ -64,7 +64,8 @@
64 "require-dev": { 64 "require-dev": {
65 "ext-curl": "*", 65 "ext-curl": "*",
66 "bamarni/composer-bin-plugin": "^1.8.1", 66 "bamarni/composer-bin-plugin": "^1.8.1",
67 - "php-http/client-integration-tests": "^3.0", 67 + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
  68 + "php-http/message-factory": "^1.1",
68 "phpunit/phpunit": "^8.5.29 || ^9.5.23", 69 "phpunit/phpunit": "^8.5.29 || ^9.5.23",
69 "psr/log": "^1.1 || ^2.0 || ^3.0" 70 "psr/log": "^1.1 || ^2.0 || ^3.0"
70 }, 71 },
@@ -84,9 +85,6 @@ @@ -84,9 +85,6 @@
84 "bamarni-bin": { 85 "bamarni-bin": {
85 "bin-links": true, 86 "bin-links": true,
86 "forward-command": false 87 "forward-command": false
87 - },  
88 - "branch-alias": {  
89 - "dev-master": "7.5-dev"  
90 } 88 }
91 }, 89 },
92 "autoload": { 90 "autoload": {
@@ -120,13 +120,14 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -120,13 +120,14 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
120 public function send(RequestInterface $request, array $options = []): ResponseInterface 120 public function send(RequestInterface $request, array $options = []): ResponseInterface
121 { 121 {
122 $options[RequestOptions::SYNCHRONOUS] = true; 122 $options[RequestOptions::SYNCHRONOUS] = true;
  123 +
123 return $this->sendAsync($request, $options)->wait(); 124 return $this->sendAsync($request, $options)->wait();
124 } 125 }
125 126
126 /** 127 /**
127 * The HttpClient PSR (PSR-18) specify this method. 128 * The HttpClient PSR (PSR-18) specify this method.
128 * 129 *
129 - * @inheritDoc 130 + * {@inheritDoc}
130 */ 131 */
131 public function sendRequest(RequestInterface $request): ResponseInterface 132 public function sendRequest(RequestInterface $request): ResponseInterface
132 { 133 {
@@ -184,6 +185,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -184,6 +185,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
184 public function request(string $method, $uri = '', array $options = []): ResponseInterface 185 public function request(string $method, $uri = '', array $options = []): ResponseInterface
185 { 186 {
186 $options[RequestOptions::SYNCHRONOUS] = true; 187 $options[RequestOptions::SYNCHRONOUS] = true;
  188 +
187 return $this->requestAsync($method, $uri, $options)->wait(); 189 return $this->requestAsync($method, $uri, $options)->wait();
188 } 190 }
189 191
@@ -228,11 +230,11 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -228,11 +230,11 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
228 { 230 {
229 $defaults = [ 231 $defaults = [
230 'allow_redirects' => RedirectMiddleware::$defaultSettings, 232 'allow_redirects' => RedirectMiddleware::$defaultSettings,
231 - 'http_errors' => true,  
232 - 'decode_content' => true,  
233 - 'verify' => true,  
234 - 'cookies' => false,  
235 - 'idn_conversion' => false, 233 + 'http_errors' => true,
  234 + 'decode_content' => true,
  235 + 'verify' => true,
  236 + 'cookies' => false,
  237 + 'idn_conversion' => false,
236 ]; 238 ];
237 239
238 // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. 240 // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
@@ -354,10 +356,10 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -354,10 +356,10 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
354 if (isset($options['form_params'])) { 356 if (isset($options['form_params'])) {
355 if (isset($options['multipart'])) { 357 if (isset($options['multipart'])) {
356 throw new InvalidArgumentException('You cannot use ' 358 throw new InvalidArgumentException('You cannot use '
357 - . 'form_params and multipart at the same time. Use the '  
358 - . 'form_params option if you want to send application/'  
359 - . 'x-www-form-urlencoded requests, and the multipart '  
360 - . 'option to send multipart/form-data requests.'); 359 + .'form_params and multipart at the same time. Use the '
  360 + .'form_params option if you want to send application/'
  361 + .'x-www-form-urlencoded requests, and the multipart '
  362 + .'option to send multipart/form-data requests.');
361 } 363 }
362 $options['body'] = \http_build_query($options['form_params'], '', '&'); 364 $options['body'] = \http_build_query($options['form_params'], '', '&');
363 unset($options['form_params']); 365 unset($options['form_params']);
@@ -403,7 +405,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -403,7 +405,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
403 // Ensure that we don't have the header in different case and set the new value. 405 // Ensure that we don't have the header in different case and set the new value.
404 $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']); 406 $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']);
405 $modify['set_headers']['Authorization'] = 'Basic ' 407 $modify['set_headers']['Authorization'] = 'Basic '
406 - . \base64_encode("$value[0]:$value[1]"); 408 + .\base64_encode("$value[0]:$value[1]");
407 break; 409 break;
408 case 'digest': 410 case 'digest':
409 // @todo: Do not rely on curl 411 // @todo: Do not rely on curl
@@ -437,13 +439,17 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -437,13 +439,17 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
437 } 439 }
438 } 440 }
439 441
  442 + if (isset($options['version'])) {
  443 + $modify['version'] = $options['version'];
  444 + }
  445 +
440 $request = Psr7\Utils::modifyRequest($request, $modify); 446 $request = Psr7\Utils::modifyRequest($request, $modify);
441 if ($request->getBody() instanceof Psr7\MultipartStream) { 447 if ($request->getBody() instanceof Psr7\MultipartStream) {
442 // Use a multipart/form-data POST if a Content-Type is not set. 448 // Use a multipart/form-data POST if a Content-Type is not set.
443 // Ensure that we don't have the header in different case and set the new value. 449 // Ensure that we don't have the header in different case and set the new value.
444 $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); 450 $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
445 $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' 451 $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
446 - . $request->getBody()->getBoundary(); 452 + .$request->getBody()->getBoundary();
447 } 453 }
448 454
449 // Merge in conditional headers if they are not present. 455 // Merge in conditional headers if they are not present.
@@ -469,9 +475,9 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface @@ -469,9 +475,9 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
469 private function invalidBody(): InvalidArgumentException 475 private function invalidBody(): InvalidArgumentException
470 { 476 {
471 return new InvalidArgumentException('Passing in the "body" request ' 477 return new InvalidArgumentException('Passing in the "body" request '
472 - . 'option as an array to send a request is not supported. '  
473 - . 'Please use the "form_params" request option to send a '  
474 - . 'application/x-www-form-urlencoded request, or the "multipart" '  
475 - . 'request option to send a multipart/form-data request.'); 478 + .'option as an array to send a request is not supported. '
  479 + .'Please use the "form_params" request option to send a '
  480 + .'application/x-www-form-urlencoded request, or the "multipart" '
  481 + .'request option to send a multipart/form-data request.');
476 } 482 }
477 } 483 }
@@ -50,10 +50,10 @@ class CookieJar implements CookieJarInterface @@ -50,10 +50,10 @@ class CookieJar implements CookieJarInterface
50 $cookieJar = new self(); 50 $cookieJar = new self();
51 foreach ($cookies as $name => $value) { 51 foreach ($cookies as $name => $value) {
52 $cookieJar->setCookie(new SetCookie([ 52 $cookieJar->setCookie(new SetCookie([
53 - 'Domain' => $domain,  
54 - 'Name' => $name,  
55 - 'Value' => $value,  
56 - 'Discard' => true 53 + 'Domain' => $domain,
  54 + 'Name' => $name,
  55 + 'Value' => $value,
  56 + 'Discard' => true,
57 ])); 57 ]));
58 } 58 }
59 59
@@ -97,7 +97,7 @@ class CookieJar implements CookieJarInterface @@ -97,7 +97,7 @@ class CookieJar implements CookieJarInterface
97 } 97 }
98 98
99 /** 99 /**
100 - * @inheritDoc 100 + * {@inheritDoc}
101 */ 101 */
102 public function toArray(): array 102 public function toArray(): array
103 { 103 {
@@ -107,12 +107,13 @@ class CookieJar implements CookieJarInterface @@ -107,12 +107,13 @@ class CookieJar implements CookieJarInterface
107 } 107 }
108 108
109 /** 109 /**
110 - * @inheritDoc 110 + * {@inheritDoc}
111 */ 111 */
112 public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void 112 public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
113 { 113 {
114 if (!$domain) { 114 if (!$domain) {
115 $this->cookies = []; 115 $this->cookies = [];
  116 +
116 return; 117 return;
117 } elseif (!$path) { 118 } elseif (!$path) {
118 $this->cookies = \array_filter( 119 $this->cookies = \array_filter(
@@ -142,7 +143,7 @@ class CookieJar implements CookieJarInterface @@ -142,7 +143,7 @@ class CookieJar implements CookieJarInterface
142 } 143 }
143 144
144 /** 145 /**
145 - * @inheritDoc 146 + * {@inheritDoc}
146 */ 147 */
147 public function clearSessionCookies(): void 148 public function clearSessionCookies(): void
148 { 149 {
@@ -155,7 +156,7 @@ class CookieJar implements CookieJarInterface @@ -155,7 +156,7 @@ class CookieJar implements CookieJarInterface
155 } 156 }
156 157
157 /** 158 /**
158 - * @inheritDoc 159 + * {@inheritDoc}
159 */ 160 */
160 public function setCookie(SetCookie $cookie): bool 161 public function setCookie(SetCookie $cookie): bool
161 { 162 {
@@ -170,9 +171,10 @@ class CookieJar implements CookieJarInterface @@ -170,9 +171,10 @@ class CookieJar implements CookieJarInterface
170 $result = $cookie->validate(); 171 $result = $cookie->validate();
171 if ($result !== true) { 172 if ($result !== true) {
172 if ($this->strictMode) { 173 if ($this->strictMode) {
173 - throw new \RuntimeException('Invalid cookie: ' . $result); 174 + throw new \RuntimeException('Invalid cookie: '.$result);
174 } 175 }
175 $this->removeCookieIfEmpty($cookie); 176 $this->removeCookieIfEmpty($cookie);
  177 +
176 return false; 178 return false;
177 } 179 }
178 180
@@ -253,7 +255,7 @@ class CookieJar implements CookieJarInterface @@ -253,7 +255,7 @@ class CookieJar implements CookieJarInterface
253 /** 255 /**
254 * Computes cookie path following RFC 6265 section 5.1.4 256 * Computes cookie path following RFC 6265 section 5.1.4
255 * 257 *
256 - * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 258 + * @see https://tools.ietf.org/html/rfc6265#section-5.1.4
257 */ 259 */
258 private function getCookiePathFromRequest(RequestInterface $request): string 260 private function getCookiePathFromRequest(RequestInterface $request): string
259 { 261 {
@@ -289,8 +291,8 @@ class CookieJar implements CookieJarInterface @@ -289,8 +291,8 @@ class CookieJar implements CookieJarInterface
289 !$cookie->isExpired() && 291 !$cookie->isExpired() &&
290 (!$cookie->getSecure() || $scheme === 'https') 292 (!$cookie->getSecure() || $scheme === 'https')
291 ) { 293 ) {
292 - $values[] = $cookie->getName() . '='  
293 - . $cookie->getValue(); 294 + $values[] = $cookie->getName().'='
  295 + .$cookie->getValue();
294 } 296 }
295 } 297 }
296 298
@@ -13,7 +13,7 @@ use Psr\Http\Message\ResponseInterface; @@ -13,7 +13,7 @@ use Psr\Http\Message\ResponseInterface;
13 * necessary. Subclasses are also responsible for storing and retrieving 13 * necessary. Subclasses are also responsible for storing and retrieving
14 * cookies from a file, database, etc. 14 * cookies from a file, database, etc.
15 * 15 *
16 - * @link https://docs.python.org/2/library/cookielib.html Inspiration 16 + * @see https://docs.python.org/2/library/cookielib.html Inspiration
17 * @extends \IteratorAggregate<SetCookie> 17 * @extends \IteratorAggregate<SetCookie>
18 */ 18 */
19 interface CookieJarInterface extends \Countable, \IteratorAggregate 19 interface CookieJarInterface extends \Countable, \IteratorAggregate
@@ -71,7 +71,7 @@ class SessionCookieJar extends CookieJar @@ -71,7 +71,7 @@ class SessionCookieJar extends CookieJar
71 $this->setCookie(new SetCookie($cookie)); 71 $this->setCookie(new SetCookie($cookie));
72 } 72 }
73 } elseif (\strlen($data)) { 73 } elseif (\strlen($data)) {
74 - throw new \RuntimeException("Invalid cookie data"); 74 + throw new \RuntimeException('Invalid cookie data');
75 } 75 }
76 } 76 }
77 } 77 }
@@ -11,15 +11,15 @@ class SetCookie @@ -11,15 +11,15 @@ class SetCookie
11 * @var array 11 * @var array
12 */ 12 */
13 private static $defaults = [ 13 private static $defaults = [
14 - 'Name' => null,  
15 - 'Value' => null,  
16 - 'Domain' => null,  
17 - 'Path' => '/',  
18 - 'Max-Age' => null,  
19 - 'Expires' => null,  
20 - 'Secure' => false,  
21 - 'Discard' => false,  
22 - 'HttpOnly' => false 14 + 'Name' => null,
  15 + 'Value' => null,
  16 + 'Domain' => null,
  17 + 'Path' => '/',
  18 + 'Max-Age' => null,
  19 + 'Expires' => null,
  20 + 'Secure' => false,
  21 + 'Discard' => false,
  22 + 'HttpOnly' => false,
23 ]; 23 ];
24 24
25 /** 25 /**
@@ -58,7 +58,13 @@ class SetCookie @@ -58,7 +58,13 @@ class SetCookie
58 } else { 58 } else {
59 foreach (\array_keys(self::$defaults) as $search) { 59 foreach (\array_keys(self::$defaults) as $search) {
60 if (!\strcasecmp($search, $key)) { 60 if (!\strcasecmp($search, $key)) {
61 - $data[$search] = $value; 61 + if ($search === 'Max-Age') {
  62 + if (is_numeric($value)) {
  63 + $data[$search] = (int) $value;
  64 + }
  65 + } else {
  66 + $data[$search] = $value;
  67 + }
62 continue 2; 68 continue 2;
63 } 69 }
64 } 70 }
@@ -74,13 +80,49 @@ class SetCookie @@ -74,13 +80,49 @@ class SetCookie
74 */ 80 */
75 public function __construct(array $data = []) 81 public function __construct(array $data = [])
76 { 82 {
77 - /** @var array|null $replaced will be null in case of replace error */  
78 - $replaced = \array_replace(self::$defaults, $data);  
79 - if ($replaced === null) {  
80 - throw new \InvalidArgumentException('Unable to replace the default values for the Cookie.'); 83 + $this->data = self::$defaults;
  84 +
  85 + if (isset($data['Name'])) {
  86 + $this->setName($data['Name']);
  87 + }
  88 +
  89 + if (isset($data['Value'])) {
  90 + $this->setValue($data['Value']);
  91 + }
  92 +
  93 + if (isset($data['Domain'])) {
  94 + $this->setDomain($data['Domain']);
  95 + }
  96 +
  97 + if (isset($data['Path'])) {
  98 + $this->setPath($data['Path']);
  99 + }
  100 +
  101 + if (isset($data['Max-Age'])) {
  102 + $this->setMaxAge($data['Max-Age']);
  103 + }
  104 +
  105 + if (isset($data['Expires'])) {
  106 + $this->setExpires($data['Expires']);
  107 + }
  108 +
  109 + if (isset($data['Secure'])) {
  110 + $this->setSecure($data['Secure']);
  111 + }
  112 +
  113 + if (isset($data['Discard'])) {
  114 + $this->setDiscard($data['Discard']);
  115 + }
  116 +
  117 + if (isset($data['HttpOnly'])) {
  118 + $this->setHttpOnly($data['HttpOnly']);
  119 + }
  120 +
  121 + // Set the remaining values that don't have extra validation logic
  122 + foreach (array_diff(array_keys($data), array_keys(self::$defaults)) as $key) {
  123 + $this->data[$key] = $data[$key];
81 } 124 }
82 125
83 - $this->data = $replaced;  
84 // Extract the Expires value and turn it into a UNIX timestamp if needed 126 // Extract the Expires value and turn it into a UNIX timestamp if needed
85 if (!$this->getExpires() && $this->getMaxAge()) { 127 if (!$this->getExpires() && $this->getMaxAge()) {
86 // Calculate the Expires date 128 // Calculate the Expires date
@@ -92,13 +134,13 @@ class SetCookie @@ -92,13 +134,13 @@ class SetCookie
92 134
93 public function __toString() 135 public function __toString()
94 { 136 {
95 - $str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; '; 137 + $str = $this->data['Name'].'='.($this->data['Value'] ?? '').'; ';
96 foreach ($this->data as $k => $v) { 138 foreach ($this->data as $k => $v) {
97 if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { 139 if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
98 if ($k === 'Expires') { 140 if ($k === 'Expires') {
99 - $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; 141 + $str .= 'Expires='.\gmdate('D, d M Y H:i:s \G\M\T', $v).'; ';
100 } else { 142 } else {
101 - $str .= ($v === true ? $k : "{$k}={$v}") . '; '; 143 + $str .= ($v === true ? $k : "{$k}={$v}").'; ';
102 } 144 }
103 } 145 }
104 } 146 }
@@ -394,7 +436,7 @@ class SetCookie @@ -394,7 +436,7 @@ class SetCookie
394 return false; 436 return false;
395 } 437 }
396 438
397 - return (bool) \preg_match('/\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); 439 + return (bool) \preg_match('/\.'.\preg_quote($cookieDomain, '/').'$/', $domain);
398 } 440 }
399 441
400 /** 442 /**
@@ -423,8 +465,8 @@ class SetCookie @@ -423,8 +465,8 @@ class SetCookie
423 $name 465 $name
424 )) { 466 )) {
425 return 'Cookie name must not contain invalid characters: ASCII ' 467 return 'Cookie name must not contain invalid characters: ASCII '
426 - . 'Control characters (0-31;127), space, tab and the '  
427 - . 'following characters: ()<>@,;:\"/?={}'; 468 + .'Control characters (0-31;127), space, tab and the '
  469 + .'following characters: ()<>@,;:\"/?={}';
428 } 470 }
429 471
430 // Value must not be null. 0 and empty string are valid. Empty strings 472 // Value must not be null. 0 and empty string are valid. Empty strings
@@ -51,7 +51,7 @@ class CurlFactory implements CurlFactoryInterface @@ -51,7 +51,7 @@ class CurlFactory implements CurlFactoryInterface
51 unset($options['curl']['body_as_string']); 51 unset($options['curl']['body_as_string']);
52 } 52 }
53 53
54 - $easy = new EasyHandle; 54 + $easy = new EasyHandle();
55 $easy->request = $request; 55 $easy->request = $request;
56 $easy->options = $options; 56 $easy->options = $options;
57 $conf = $this->getDefaultConf($easy); 57 $conf = $this->getDefaultConf($easy);
@@ -161,11 +161,11 @@ class CurlFactory implements CurlFactoryInterface @@ -161,11 +161,11 @@ class CurlFactory implements CurlFactoryInterface
161 private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface 161 private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface
162 { 162 {
163 static $connectionErrors = [ 163 static $connectionErrors = [
164 - \CURLE_OPERATION_TIMEOUTED => true, 164 + \CURLE_OPERATION_TIMEOUTED => true,
165 \CURLE_COULDNT_RESOLVE_HOST => true, 165 \CURLE_COULDNT_RESOLVE_HOST => true,
166 - \CURLE_COULDNT_CONNECT => true,  
167 - \CURLE_SSL_CONNECT_ERROR => true,  
168 - \CURLE_GOT_NOTHING => true, 166 + \CURLE_COULDNT_CONNECT => true,
  167 + \CURLE_SSL_CONNECT_ERROR => true,
  168 + \CURLE_GOT_NOTHING => true,
169 ]; 169 ];
170 170
171 if ($easy->createResponseException) { 171 if ($easy->createResponseException) {
@@ -219,12 +219,12 @@ class CurlFactory implements CurlFactoryInterface @@ -219,12 +219,12 @@ class CurlFactory implements CurlFactoryInterface
219 private function getDefaultConf(EasyHandle $easy): array 219 private function getDefaultConf(EasyHandle $easy): array
220 { 220 {
221 $conf = [ 221 $conf = [
222 - '_headers' => $easy->request->getHeaders(),  
223 - \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),  
224 - \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), 222 + '_headers' => $easy->request->getHeaders(),
  223 + \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
  224 + \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
225 \CURLOPT_RETURNTRANSFER => false, 225 \CURLOPT_RETURNTRANSFER => false,
226 - \CURLOPT_HEADER => false,  
227 - \CURLOPT_CONNECTTIMEOUT => 150, 226 + \CURLOPT_HEADER => false,
  227 + \CURLOPT_CONNECTTIMEOUT => 300,
228 ]; 228 ];
229 229
230 if (\defined('CURLOPT_PROTOCOLS')) { 230 if (\defined('CURLOPT_PROTOCOLS')) {
@@ -250,6 +250,7 @@ class CurlFactory implements CurlFactoryInterface @@ -250,6 +250,7 @@ class CurlFactory implements CurlFactoryInterface
250 250
251 if ($size === null || $size > 0) { 251 if ($size === null || $size > 0) {
252 $this->applyBody($easy->request, $easy->options, $conf); 252 $this->applyBody($easy->request, $easy->options, $conf);
  253 +
253 return; 254 return;
254 } 255 }
255 256
@@ -341,6 +342,7 @@ class CurlFactory implements CurlFactoryInterface @@ -341,6 +342,7 @@ class CurlFactory implements CurlFactoryInterface
341 foreach (\array_keys($options['_headers']) as $key) { 342 foreach (\array_keys($options['_headers']) as $key) {
342 if (!\strcasecmp($key, $name)) { 343 if (!\strcasecmp($key, $name)) {
343 unset($options['_headers'][$key]); 344 unset($options['_headers'][$key]);
  345 +
344 return; 346 return;
345 } 347 }
346 } 348 }
@@ -443,13 +445,41 @@ class CurlFactory implements CurlFactoryInterface @@ -443,13 +445,41 @@ class CurlFactory implements CurlFactoryInterface
443 $scheme = $easy->request->getUri()->getScheme(); 445 $scheme = $easy->request->getUri()->getScheme();
444 if (isset($options['proxy'][$scheme])) { 446 if (isset($options['proxy'][$scheme])) {
445 $host = $easy->request->getUri()->getHost(); 447 $host = $easy->request->getUri()->getHost();
446 - if (!isset($options['proxy']['no']) || !Utils::isHostInNoProxy($host, $options['proxy']['no'])) { 448 + if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) {
  449 + unset($conf[\CURLOPT_PROXY]);
  450 + } else {
447 $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; 451 $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme];
448 } 452 }
449 } 453 }
450 } 454 }
451 } 455 }
452 456
  457 + if (isset($options['crypto_method'])) {
  458 + if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
  459 + if (!defined('CURL_SSLVERSION_TLSv1_0')) {
  460 + throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL');
  461 + }
  462 + $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
  463 + } elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {
  464 + if (!defined('CURL_SSLVERSION_TLSv1_1')) {
  465 + throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.1 not supported by your version of cURL');
  466 + }
  467 + $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1;
  468 + } elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
  469 + if (!defined('CURL_SSLVERSION_TLSv1_2')) {
  470 + throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');
  471 + }
  472 + $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
  473 + } elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
  474 + if (!defined('CURL_SSLVERSION_TLSv1_3')) {
  475 + throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
  476 + }
  477 + $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
  478 + } else {
  479 + throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
  480 + }
  481 + }
  482 +
453 if (isset($options['cert'])) { 483 if (isset($options['cert'])) {
454 $cert = $options['cert']; 484 $cert = $options['cert'];
455 if (\is_array($cert)) { 485 if (\is_array($cert)) {
@@ -459,8 +489,8 @@ class CurlFactory implements CurlFactoryInterface @@ -459,8 +489,8 @@ class CurlFactory implements CurlFactoryInterface
459 if (!\file_exists($cert)) { 489 if (!\file_exists($cert)) {
460 throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); 490 throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
461 } 491 }
462 - # OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.  
463 - # see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html 492 + // OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.
  493 + // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
464 $ext = pathinfo($cert, \PATHINFO_EXTENSION); 494 $ext = pathinfo($cert, \PATHINFO_EXTENSION);
465 if (preg_match('#^(der|p12)$#i', $ext)) { 495 if (preg_match('#^(der|p12)$#i', $ext)) {
466 $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext); 496 $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
@@ -523,9 +553,10 @@ class CurlFactory implements CurlFactoryInterface @@ -523,9 +553,10 @@ class CurlFactory implements CurlFactoryInterface
523 } 553 }
524 } catch (\RuntimeException $e) { 554 } catch (\RuntimeException $e) {
525 $ctx['error'] = 'The connection unexpectedly failed without ' 555 $ctx['error'] = 'The connection unexpectedly failed without '
526 - . 'providing an error. The request would have been retried, '  
527 - . 'but attempting to rewind the request body failed. '  
528 - . 'Exception: ' . $e; 556 + .'providing an error. The request would have been retried, '
  557 + .'but attempting to rewind the request body failed. '
  558 + .'Exception: '.$e;
  559 +
529 return self::createRejection($easy, $ctx); 560 return self::createRejection($easy, $ctx);
530 } 561 }
531 562
@@ -534,14 +565,15 @@ class CurlFactory implements CurlFactoryInterface @@ -534,14 +565,15 @@ class CurlFactory implements CurlFactoryInterface
534 $easy->options['_curl_retries'] = 1; 565 $easy->options['_curl_retries'] = 1;
535 } elseif ($easy->options['_curl_retries'] == 2) { 566 } elseif ($easy->options['_curl_retries'] == 2) {
536 $ctx['error'] = 'The cURL request was retried 3 times ' 567 $ctx['error'] = 'The cURL request was retried 3 times '
537 - . 'and did not succeed. The most likely reason for the failure '  
538 - . 'is that cURL was unable to rewind the body of the request '  
539 - . 'and subsequent retries resulted in the same error. Turn on '  
540 - . 'the debug option to see what went wrong. See '  
541 - . 'https://bugs.php.net/bug.php?id=47204 for more information.'; 568 + .'and did not succeed. The most likely reason for the failure '
  569 + .'is that cURL was unable to rewind the body of the request '
  570 + .'and subsequent retries resulted in the same error. Turn on '
  571 + .'the debug option to see what went wrong. See '
  572 + .'https://bugs.php.net/bug.php?id=47204 for more information.';
  573 +
542 return self::createRejection($easy, $ctx); 574 return self::createRejection($easy, $ctx);
543 } else { 575 } else {
544 - $easy->options['_curl_retries']++; 576 + ++$easy->options['_curl_retries'];
545 } 577 }
546 578
547 return $handler($easy->request, $easy->options); 579 return $handler($easy->request, $easy->options);
@@ -571,6 +603,7 @@ class CurlFactory implements CurlFactoryInterface @@ -571,6 +603,7 @@ class CurlFactory implements CurlFactoryInterface
571 $easy->createResponse(); 603 $easy->createResponse();
572 } catch (\Exception $e) { 604 } catch (\Exception $e) {
573 $easy->createResponseException = $e; 605 $easy->createResponseException = $e;
  606 +
574 return -1; 607 return -1;
575 } 608 }
576 if ($onHeaders !== null) { 609 if ($onHeaders !== null) {
@@ -580,6 +613,7 @@ class CurlFactory implements CurlFactoryInterface @@ -580,6 +613,7 @@ class CurlFactory implements CurlFactoryInterface
580 // Associate the exception with the handle and trigger 613 // Associate the exception with the handle and trigger
581 // a curl header write error by returning 0. 614 // a curl header write error by returning 0.
582 $easy->onHeadersException = $e; 615 $easy->onHeadersException = $e;
  616 +
583 return -1; 617 return -1;
584 } 618 }
585 } 619 }
@@ -589,6 +623,7 @@ class CurlFactory implements CurlFactoryInterface @@ -589,6 +623,7 @@ class CurlFactory implements CurlFactoryInterface
589 } else { 623 } else {
590 $easy->headers[] = $value; 624 $easy->headers[] = $value;
591 } 625 }
  626 +
592 return \strlen($h); 627 return \strlen($h);
593 }; 628 };
594 } 629 }
@@ -164,7 +164,8 @@ class CurlMultiHandler @@ -164,7 +164,8 @@ class CurlMultiHandler
164 \usleep(250); 164 \usleep(250);
165 } 165 }
166 166
167 - while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM); 167 + while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
  168 + }
168 169
169 $this->processMessages(); 170 $this->processMessages();
170 } 171 }
@@ -106,7 +106,7 @@ final class EasyHandle @@ -106,7 +106,7 @@ final class EasyHandle
106 */ 106 */
107 public function __get($name) 107 public function __get($name)
108 { 108 {
109 - $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; 109 + $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: '.$name;
110 throw new \BadMethodCallException($msg); 110 throw new \BadMethodCallException($msg);
111 } 111 }
112 } 112 }
@@ -14,9 +14,9 @@ final class HeaderProcessor @@ -14,9 +14,9 @@ final class HeaderProcessor
14 * 14 *
15 * @param string[] $headers 15 * @param string[] $headers
16 * 16 *
17 - * @throws \RuntimeException  
18 - *  
19 * @return array{0:string, 1:int, 2:?string, 3:array} 17 * @return array{0:string, 1:int, 2:?string, 3:array}
  18 + *
  19 + * @throws \RuntimeException
20 */ 20 */
21 public static function parseHeaders(array $headers): array 21 public static function parseHeaders(array $headers): array
22 { 22 {
@@ -138,6 +138,7 @@ class MockHandler implements \Countable @@ -138,6 +138,7 @@ class MockHandler implements \Countable
138 if ($this->onRejected) { 138 if ($this->onRejected) {
139 ($this->onRejected)($reason); 139 ($this->onRejected)($reason);
140 } 140 }
  141 +
141 return P\Create::rejectionFor($reason); 142 return P\Create::rejectionFor($reason);
142 } 143 }
143 ); 144 );
@@ -159,7 +160,7 @@ class MockHandler implements \Countable @@ -159,7 +160,7 @@ class MockHandler implements \Countable
159 ) { 160 ) {
160 $this->queue[] = $value; 161 $this->queue[] = $value;
161 } else { 162 } else {
162 - throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . Utils::describeType($value)); 163 + throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found '.Utils::describeType($value));
163 } 164 }
164 } 165 }
165 } 166 }
@@ -67,7 +67,7 @@ class StreamHandler @@ -67,7 +67,7 @@ class StreamHandler
67 if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed 67 if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed
68 || false !== \strpos($message, 'Connection refused') 68 || false !== \strpos($message, 'Connection refused')
69 || false !== \strpos($message, "couldn't connect to host") // error on HHVM 69 || false !== \strpos($message, "couldn't connect to host") // error on HHVM
70 - || false !== \strpos($message, "connection attempt failed") 70 + || false !== \strpos($message, 'connection attempt failed')
71 ) { 71 ) {
72 $e = new ConnectException($e->getMessage(), $request, $e); 72 $e = new ConnectException($e->getMessage(), $request, $e);
73 } else { 73 } else {
@@ -231,9 +231,10 @@ class StreamHandler @@ -231,9 +231,10 @@ class StreamHandler
231 \set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool { 231 \set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool {
232 $errors[] = [ 232 $errors[] = [
233 'message' => $msg, 233 'message' => $msg,
234 - 'file' => $file,  
235 - 'line' => $line 234 + 'file' => $file,
  235 + 'line' => $line,
236 ]; 236 ];
  237 +
237 return true; 238 return true;
238 }); 239 });
239 240
@@ -247,7 +248,7 @@ class StreamHandler @@ -247,7 +248,7 @@ class StreamHandler
247 $message = 'Error creating resource: '; 248 $message = 'Error creating resource: ';
248 foreach ($errors as $err) { 249 foreach ($errors as $err) {
249 foreach ($err as $key => $value) { 250 foreach ($err as $key => $value) {
250 - $message .= "[$key] $value" . \PHP_EOL; 251 + $message .= "[$key] $value".\PHP_EOL;
251 } 252 }
252 } 253 }
253 throw new \RuntimeException(\trim($message)); 254 throw new \RuntimeException(\trim($message));
@@ -350,6 +351,7 @@ class StreamHandler @@ -350,6 +351,7 @@ class StreamHandler
350 if (false === $records || !isset($records[0]['ip'])) { 351 if (false === $records || !isset($records[0]['ip'])) {
351 throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); 352 throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
352 } 353 }
  354 +
353 return $uri->withHost($records[0]['ip']); 355 return $uri->withHost($records[0]['ip']);
354 } 356 }
355 if ('v6' === $options['force_ip_resolve']) { 357 if ('v6' === $options['force_ip_resolve']) {
@@ -357,7 +359,8 @@ class StreamHandler @@ -357,7 +359,8 @@ class StreamHandler
357 if (false === $records || !isset($records[0]['ipv6'])) { 359 if (false === $records || !isset($records[0]['ipv6'])) {
358 throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); 360 throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
359 } 361 }
360 - return $uri->withHost('[' . $records[0]['ipv6'] . ']'); 362 +
  363 + return $uri->withHost('['.$records[0]['ipv6'].']');
361 } 364 }
362 } 365 }
363 366
@@ -375,11 +378,11 @@ class StreamHandler @@ -375,11 +378,11 @@ class StreamHandler
375 378
376 $context = [ 379 $context = [
377 'http' => [ 380 'http' => [
378 - 'method' => $request->getMethod(),  
379 - 'header' => $headers, 381 + 'method' => $request->getMethod(),
  382 + 'header' => $headers,
380 'protocol_version' => $request->getProtocolVersion(), 383 'protocol_version' => $request->getProtocolVersion(),
381 - 'ignore_errors' => true,  
382 - 'follow_location' => 0, 384 + 'ignore_errors' => true,
  385 + 'follow_location' => 0,
383 ], 386 ],
384 'ssl' => [ 387 'ssl' => [
385 'peer_name' => $request->getUri()->getHost(), 388 'peer_name' => $request->getUri()->getHost(),
@@ -388,7 +391,7 @@ class StreamHandler @@ -388,7 +391,7 @@ class StreamHandler
388 391
389 $body = (string) $request->getBody(); 392 $body = (string) $request->getBody();
390 393
391 - if (!empty($body)) { 394 + if ('' !== $body) {
392 $context['http']['content'] = $body; 395 $context['http']['content'] = $body;
393 // Prevent the HTTP handler from adding a Content-Type header. 396 // Prevent the HTTP handler from adding a Content-Type header.
394 if (!$request->hasHeader('Content-Type')) { 397 if (!$request->hasHeader('Content-Type')) {
@@ -475,6 +478,25 @@ class StreamHandler @@ -475,6 +478,25 @@ class StreamHandler
475 /** 478 /**
476 * @param mixed $value as passed via Request transfer options. 479 * @param mixed $value as passed via Request transfer options.
477 */ 480 */
  481 + private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params): void
  482 + {
  483 + if (
  484 + $value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
  485 + || $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
  486 + || $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
  487 + || (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT)
  488 + ) {
  489 + $options['http']['crypto_method'] = $value;
  490 +
  491 + return;
  492 + }
  493 +
  494 + throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
  495 + }
  496 +
  497 + /**
  498 + * @param mixed $value as passed via Request transfer options.
  499 + */
478 private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void 500 private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void
479 { 501 {
480 if ($value === false) { 502 if ($value === false) {
@@ -542,27 +564,27 @@ class StreamHandler @@ -542,27 +564,27 @@ class StreamHandler
542 } 564 }
543 565
544 static $map = [ 566 static $map = [
545 - \STREAM_NOTIFY_CONNECT => 'CONNECT', 567 + \STREAM_NOTIFY_CONNECT => 'CONNECT',
546 \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', 568 \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
547 - \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',  
548 - \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',  
549 - \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',  
550 - \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',  
551 - \STREAM_NOTIFY_PROGRESS => 'PROGRESS',  
552 - \STREAM_NOTIFY_FAILURE => 'FAILURE',  
553 - \STREAM_NOTIFY_COMPLETED => 'COMPLETED',  
554 - \STREAM_NOTIFY_RESOLVE => 'RESOLVE', 569 + \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
  570 + \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
  571 + \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
  572 + \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
  573 + \STREAM_NOTIFY_PROGRESS => 'PROGRESS',
  574 + \STREAM_NOTIFY_FAILURE => 'FAILURE',
  575 + \STREAM_NOTIFY_COMPLETED => 'COMPLETED',
  576 + \STREAM_NOTIFY_RESOLVE => 'RESOLVE',
555 ]; 577 ];
556 static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; 578 static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];
557 579
558 $value = Utils::debugResource($value); 580 $value = Utils::debugResource($value);
559 - $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); 581 + $ident = $request->getMethod().' '.$request->getUri()->withFragment('');
560 self::addNotification( 582 self::addNotification(
561 $params, 583 $params,
562 static function (int $code, ...$passed) use ($ident, $value, $map, $args): void { 584 static function (int $code, ...$passed) use ($ident, $value, $map, $args): void {
563 \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); 585 \fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
564 foreach (\array_filter($passed) as $i => $v) { 586 foreach (\array_filter($passed) as $i => $v) {
565 - \fwrite($value, $args[$i] . ': "' . $v . '" '); 587 + \fwrite($value, $args[$i].': "'.$v.'" ');
566 } 588 }
567 \fwrite($value, "\n"); 589 \fwrite($value, "\n");
568 } 590 }
@@ -577,7 +599,7 @@ class StreamHandler @@ -577,7 +599,7 @@ class StreamHandler
577 } else { 599 } else {
578 $params['notification'] = self::callArray([ 600 $params['notification'] = self::callArray([
579 $params['notification'], 601 $params['notification'],
580 - $notify 602 + $notify,
581 ]); 603 ]);
582 } 604 }
583 } 605 }
@@ -86,14 +86,14 @@ class HandlerStack @@ -86,14 +86,14 @@ class HandlerStack
86 $stack = []; 86 $stack = [];
87 87
88 if ($this->handler !== null) { 88 if ($this->handler !== null) {
89 - $stack[] = "0) Handler: " . $this->debugCallable($this->handler); 89 + $stack[] = '0) Handler: '.$this->debugCallable($this->handler);
90 } 90 }
91 91
92 $result = ''; 92 $result = '';
93 foreach (\array_reverse($this->stack) as $tuple) { 93 foreach (\array_reverse($this->stack) as $tuple) {
94 - $depth++; 94 + ++$depth;
95 $str = "{$depth}) Name: '{$tuple[1]}', "; 95 $str = "{$depth}) Name: '{$tuple[1]}', ";
96 - $str .= "Function: " . $this->debugCallable($tuple[0]); 96 + $str .= 'Function: '.$this->debugCallable($tuple[0]);
97 $result = "> {$str}\n{$result}"; 97 $result = "> {$str}\n{$result}";
98 $stack[] = $str; 98 $stack[] = $str;
99 } 99 }
@@ -122,7 +122,7 @@ class HandlerStack @@ -122,7 +122,7 @@ class HandlerStack
122 */ 122 */
123 public function hasHandler(): bool 123 public function hasHandler(): bool
124 { 124 {
125 - return $this->handler !== null ; 125 + return $this->handler !== null;
126 } 126 }
127 127
128 /** 128 /**
@@ -266,10 +266,10 @@ class HandlerStack @@ -266,10 +266,10 @@ class HandlerStack
266 if (\is_array($fn)) { 266 if (\is_array($fn)) {
267 return \is_string($fn[0]) 267 return \is_string($fn[0])
268 ? "callable({$fn[0]}::{$fn[1]})" 268 ? "callable({$fn[0]}::{$fn[1]})"
269 - : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; 269 + : "callable(['".\get_class($fn[0])."', '{$fn[1]}'])";
270 } 270 }
271 271
272 /** @var object $fn */ 272 /** @var object $fn */
273 - return 'callable(' . \spl_object_hash($fn) . ')'; 273 + return 'callable('.\spl_object_hash($fn).')';
274 } 274 }
275 } 275 }
@@ -40,11 +40,11 @@ class MessageFormatter implements MessageFormatterInterface @@ -40,11 +40,11 @@ class MessageFormatter implements MessageFormatterInterface
40 /** 40 /**
41 * Apache Common Log Format. 41 * Apache Common Log Format.
42 * 42 *
43 - * @link https://httpd.apache.org/docs/2.4/logs.html#common 43 + * @see https://httpd.apache.org/docs/2.4/logs.html#common
44 * 44 *
45 * @var string 45 * @var string
46 */ 46 */
47 - public const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}"; 47 + public const CLF = '{hostname} {req_header_User-Agent} - [{date_common_log}] "{method} {target} HTTP/{version}" {code} {res_header_Content-Length}';
48 public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; 48 public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
49 public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; 49 public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
50 50
@@ -90,9 +90,9 @@ class MessageFormatter implements MessageFormatterInterface @@ -90,9 +90,9 @@ class MessageFormatter implements MessageFormatterInterface
90 break; 90 break;
91 case 'req_headers': 91 case 'req_headers':
92 $result = \trim($request->getMethod() 92 $result = \trim($request->getMethod()
93 - . ' ' . $request->getRequestTarget())  
94 - . ' HTTP/' . $request->getProtocolVersion() . "\r\n"  
95 - . $this->headers($request); 93 + .' '.$request->getRequestTarget())
  94 + .' HTTP/'.$request->getProtocolVersion()."\r\n"
  95 + .$this->headers($request);
96 break; 96 break;
97 case 'res_headers': 97 case 'res_headers':
98 $result = $response ? 98 $result = $response ?
@@ -101,7 +101,7 @@ class MessageFormatter implements MessageFormatterInterface @@ -101,7 +101,7 @@ class MessageFormatter implements MessageFormatterInterface
101 $response->getProtocolVersion(), 101 $response->getProtocolVersion(),
102 $response->getStatusCode(), 102 $response->getStatusCode(),
103 $response->getReasonPhrase() 103 $response->getReasonPhrase()
104 - ) . "\r\n" . $this->headers($response) 104 + )."\r\n".$this->headers($response)
105 : 'NULL'; 105 : 'NULL';
106 break; 106 break;
107 case 'req_body': 107 case 'req_body':
@@ -177,6 +177,7 @@ class MessageFormatter implements MessageFormatterInterface @@ -177,6 +177,7 @@ class MessageFormatter implements MessageFormatterInterface
177 } 177 }
178 178
179 $cache[$matches[1]] = $result; 179 $cache[$matches[1]] = $result;
  180 +
180 return $result; 181 return $result;
181 }, 182 },
182 $this->template 183 $this->template
@@ -190,7 +191,7 @@ class MessageFormatter implements MessageFormatterInterface @@ -190,7 +191,7 @@ class MessageFormatter implements MessageFormatterInterface
190 { 191 {
191 $result = ''; 192 $result = '';
192 foreach ($message->getHeaders() as $name => $values) { 193 foreach ($message->getHeaders() as $name => $values) {
193 - $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; 194 + $result .= $name.': '.\implode(', ', $values)."\r\n";
194 } 195 }
195 196
196 return \trim($result); 197 return \trim($result);
@@ -34,10 +34,12 @@ final class Middleware @@ -34,10 +34,12 @@ final class Middleware
34 } 34 }
35 $cookieJar = $options['cookies']; 35 $cookieJar = $options['cookies'];
36 $request = $cookieJar->withCookieHeader($request); 36 $request = $cookieJar->withCookieHeader($request);
  37 +
37 return $handler($request, $options) 38 return $handler($request, $options)
38 ->then( 39 ->then(
39 static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface { 40 static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface {
40 $cookieJar->extractCookies($request, $response); 41 $cookieJar->extractCookies($request, $response);
  42 +
41 return $response; 43 return $response;
42 } 44 }
43 ); 45 );
@@ -60,6 +62,7 @@ final class Middleware @@ -60,6 +62,7 @@ final class Middleware
60 if (empty($options['http_errors'])) { 62 if (empty($options['http_errors'])) {
61 return $handler($request, $options); 63 return $handler($request, $options);
62 } 64 }
  65 +
63 return $handler($request, $options)->then( 66 return $handler($request, $options)->then(
64 static function (ResponseInterface $response) use ($request, $bodySummarizer) { 67 static function (ResponseInterface $response) use ($request, $bodySummarizer) {
65 $code = $response->getStatusCode(); 68 $code = $response->getStatusCode();
@@ -93,20 +96,22 @@ final class Middleware @@ -93,20 +96,22 @@ final class Middleware
93 return $handler($request, $options)->then( 96 return $handler($request, $options)->then(
94 static function ($value) use ($request, &$container, $options) { 97 static function ($value) use ($request, &$container, $options) {
95 $container[] = [ 98 $container[] = [
96 - 'request' => $request, 99 + 'request' => $request,
97 'response' => $value, 100 'response' => $value,
98 - 'error' => null,  
99 - 'options' => $options 101 + 'error' => null,
  102 + 'options' => $options,
100 ]; 103 ];
  104 +
101 return $value; 105 return $value;
102 }, 106 },
103 static function ($reason) use ($request, &$container, $options) { 107 static function ($reason) use ($request, &$container, $options) {
104 $container[] = [ 108 $container[] = [
105 - 'request' => $request, 109 + 'request' => $request,
106 'response' => null, 110 'response' => null,
107 - 'error' => $reason,  
108 - 'options' => $options 111 + 'error' => $reason,
  112 + 'options' => $options,
109 ]; 113 ];
  114 +
110 return P\Create::rejectionFor($reason); 115 return P\Create::rejectionFor($reason);
111 } 116 }
112 ); 117 );
@@ -138,6 +143,7 @@ final class Middleware @@ -138,6 +143,7 @@ final class Middleware
138 if ($after) { 143 if ($after) {
139 $after($request, $options, $response); 144 $after($request, $options, $response);
140 } 145 }
  146 +
141 return $response; 147 return $response;
142 }; 148 };
143 }; 149 };
@@ -202,12 +208,14 @@ final class Middleware @@ -202,12 +208,14 @@ final class Middleware
202 static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface { 208 static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface {
203 $message = $formatter->format($request, $response); 209 $message = $formatter->format($request, $response);
204 $logger->log($logLevel, $message); 210 $logger->log($logLevel, $message);
  211 +
205 return $response; 212 return $response;
206 }, 213 },
207 static function ($reason) use ($logger, $request, $formatter): PromiseInterface { 214 static function ($reason) use ($logger, $request, $formatter): PromiseInterface {
208 $response = $reason instanceof RequestException ? $reason->getResponse() : null; 215 $response = $reason instanceof RequestException ? $reason->getResponse() : null;
209 $message = $formatter->format($request, $response, P\Create::exceptionFor($reason)); 216 $message = $formatter->format($request, $response, P\Create::exceptionFor($reason));
210 $logger->error($message); 217 $logger->error($message);
  218 +
211 return P\Create::rejectionFor($reason); 219 return P\Create::rejectionFor($reason);
212 } 220 }
213 ); 221 );
@@ -84,6 +84,7 @@ class PrepareBodyMiddleware @@ -84,6 +84,7 @@ class PrepareBodyMiddleware
84 // The expect header is unconditionally enabled 84 // The expect header is unconditionally enabled
85 if ($expect === true) { 85 if ($expect === true) {
86 $modify['set_headers']['Expect'] = '100-Continue'; 86 $modify['set_headers']['Expect'] = '100-Continue';
  87 +
87 return; 88 return;
88 } 89 }
89 90
@@ -27,10 +27,10 @@ class RedirectMiddleware @@ -27,10 +27,10 @@ class RedirectMiddleware
27 * @var array 27 * @var array
28 */ 28 */
29 public static $defaultSettings = [ 29 public static $defaultSettings = [
30 - 'max' => 5,  
31 - 'protocols' => ['http', 'https'],  
32 - 'strict' => false,  
33 - 'referer' => false, 30 + 'max' => 5,
  31 + 'protocols' => ['http', 'https'],
  32 + 'strict' => false,
  33 + 'referer' => false,
34 'track_redirects' => false, 34 'track_redirects' => false,
35 ]; 35 ];
36 36
@@ -7,7 +7,7 @@ namespace GuzzleHttp; @@ -7,7 +7,7 @@ namespace GuzzleHttp;
7 * 7 *
8 * More documentation for each option can be found at http://guzzlephp.org/. 8 * More documentation for each option can be found at http://guzzlephp.org/.
9 * 9 *
10 - * @link http://docs.guzzlephp.org/en/v6/request-options.html 10 + * @see http://docs.guzzlephp.org/en/v6/request-options.html
11 */ 11 */
12 final class RequestOptions 12 final class RequestOptions
13 { 13 {
@@ -70,11 +70,23 @@ final class RequestOptions @@ -70,11 +70,23 @@ final class RequestOptions
70 /** 70 /**
71 * connect_timeout: (float, default=0) Float describing the number of 71 * connect_timeout: (float, default=0) Float describing the number of
72 * seconds to wait while trying to connect to a server. Use 0 to wait 72 * seconds to wait while trying to connect to a server. Use 0 to wait
73 - * indefinitely (the default behavior). 73 + * 300 seconds (the default behavior).
74 */ 74 */
75 public const CONNECT_TIMEOUT = 'connect_timeout'; 75 public const CONNECT_TIMEOUT = 'connect_timeout';
76 76
77 /** 77 /**
  78 + * crypto_method: (int) A value describing the minimum TLS protocol
  79 + * version to use.
  80 + *
  81 + * This setting must be set to one of the
  82 + * ``STREAM_CRYPTO_METHOD_TLS*_CLIENT`` constants. PHP 7.4 or higher is
  83 + * required in order to use TLS 1.3, and cURL 7.34.0 or higher is required
  84 + * in order to specify a crypto method, with cURL 7.52.0 or higher being
  85 + * required to use TLS 1.3.
  86 + */
  87 + public const CRYPTO_METHOD = 'crypto_method';
  88 +
  89 + /**
78 * debug: (bool|resource) Set to true or set to a PHP stream returned by 90 * debug: (bool|resource) Set to true or set to a PHP stream returned by
79 * fopen() enable debug output with the HTTP handler used to send a 91 * fopen() enable debug output with the HTTP handler used to send a
80 * request. 92 * request.
@@ -44,7 +44,7 @@ class RetryMiddleware @@ -44,7 +44,7 @@ class RetryMiddleware
44 { 44 {
45 $this->decider = $decider; 45 $this->decider = $decider;
46 $this->nextHandler = $nextHandler; 46 $this->nextHandler = $nextHandler;
47 - $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; 47 + $this->delay = $delay ?: __CLASS__.'::exponentialDelay';
48 } 48 }
49 49
50 /** 50 /**
@@ -54,7 +54,7 @@ class RetryMiddleware @@ -54,7 +54,7 @@ class RetryMiddleware
54 */ 54 */
55 public static function exponentialDelay(int $retries): int 55 public static function exponentialDelay(int $retries): int
56 { 56 {
57 - return (int) \pow(2, $retries - 1) * 1000; 57 + return (int) 2 ** ($retries - 1) * 1000;
58 } 58 }
59 59
60 public function __invoke(RequestInterface $request, array $options): PromiseInterface 60 public function __invoke(RequestInterface $request, array $options): PromiseInterface
@@ -64,6 +64,7 @@ class RetryMiddleware @@ -64,6 +64,7 @@ class RetryMiddleware
64 } 64 }
65 65
66 $fn = $this->nextHandler; 66 $fn = $this->nextHandler;
  67 +
67 return $fn($request, $options) 68 return $fn($request, $options)
68 ->then( 69 ->then(
69 $this->onFulfilled($request, $options), 70 $this->onFulfilled($request, $options),
@@ -85,6 +86,7 @@ class RetryMiddleware @@ -85,6 +86,7 @@ class RetryMiddleware
85 )) { 86 )) {
86 return $value; 87 return $value;
87 } 88 }
  89 +
88 return $this->doRetry($request, $options, $value); 90 return $this->doRetry($request, $options, $value);
89 }; 91 };
90 } 92 }
@@ -103,6 +105,7 @@ class RetryMiddleware @@ -103,6 +105,7 @@ class RetryMiddleware
103 )) { 105 )) {
104 return P\Create::rejectionFor($reason); 106 return P\Create::rejectionFor($reason);
105 } 107 }
  108 +
106 return $this->doRetry($req, $options); 109 return $this->doRetry($req, $options);
107 }; 110 };
108 } 111 }
@@ -23,9 +23,9 @@ final class Utils @@ -23,9 +23,9 @@ final class Utils
23 { 23 {
24 switch (\gettype($input)) { 24 switch (\gettype($input)) {
25 case 'object': 25 case 'object':
26 - return 'object(' . \get_class($input) . ')'; 26 + return 'object('.\get_class($input).')';
27 case 'array': 27 case 'array':
28 - return 'array(' . \count($input) . ')'; 28 + return 'array('.\count($input).')';
29 default: 29 default:
30 \ob_start(); 30 \ob_start();
31 \var_dump($input); 31 \var_dump($input);
@@ -79,9 +79,9 @@ final class Utils @@ -79,9 +79,9 @@ final class Utils
79 * 79 *
80 * The returned handler is not wrapped by any default middlewares. 80 * The returned handler is not wrapped by any default middlewares.
81 * 81 *
82 - * @throws \RuntimeException if no viable Handler is available.  
83 - *  
84 * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. 82 * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system.
  83 + *
  84 + * @throws \RuntimeException if no viable Handler is available.
85 */ 85 */
86 public static function chooseHandler(): callable 86 public static function chooseHandler(): callable
87 { 87 {
@@ -247,8 +247,8 @@ EOT @@ -247,8 +247,8 @@ EOT
247 } 247 }
248 // Special match if the area when prefixed with ".". Remove any 248 // Special match if the area when prefixed with ".". Remove any
249 // existing leading "." and add a new leading ".". 249 // existing leading "." and add a new leading ".".
250 - $area = '.' . \ltrim($area, '.');  
251 - if (\substr($host, -(\strlen($area))) === $area) { 250 + $area = '.'.\ltrim($area, '.');
  251 + if (\substr($host, -\strlen($area)) === $area) {
252 return true; 252 return true;
253 } 253 }
254 } 254 }
@@ -269,13 +269,13 @@ EOT @@ -269,13 +269,13 @@ EOT
269 * 269 *
270 * @throws InvalidArgumentException if the JSON cannot be decoded. 270 * @throws InvalidArgumentException if the JSON cannot be decoded.
271 * 271 *
272 - * @link https://www.php.net/manual/en/function.json-decode.php 272 + * @see https://www.php.net/manual/en/function.json-decode.php
273 */ 273 */
274 public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) 274 public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
275 { 275 {
276 $data = \json_decode($json, $assoc, $depth, $options); 276 $data = \json_decode($json, $assoc, $depth, $options);
277 if (\JSON_ERROR_NONE !== \json_last_error()) { 277 if (\JSON_ERROR_NONE !== \json_last_error()) {
278 - throw new InvalidArgumentException('json_decode error: ' . \json_last_error_msg()); 278 + throw new InvalidArgumentException('json_decode error: '.\json_last_error_msg());
279 } 279 }
280 280
281 return $data; 281 return $data;
@@ -290,13 +290,13 @@ EOT @@ -290,13 +290,13 @@ EOT
290 * 290 *
291 * @throws InvalidArgumentException if the JSON cannot be encoded. 291 * @throws InvalidArgumentException if the JSON cannot be encoded.
292 * 292 *
293 - * @link https://www.php.net/manual/en/function.json-encode.php 293 + * @see https://www.php.net/manual/en/function.json-encode.php
294 */ 294 */
295 public static function jsonEncode($value, int $options = 0, int $depth = 512): string 295 public static function jsonEncode($value, int $options = 0, int $depth = 512): string
296 { 296 {
297 $json = \json_encode($value, $options, $depth); 297 $json = \json_encode($value, $options, $depth);
298 if (\JSON_ERROR_NONE !== \json_last_error()) { 298 if (\JSON_ERROR_NONE !== \json_last_error()) {
299 - throw new InvalidArgumentException('json_encode error: ' . \json_last_error_msg()); 299 + throw new InvalidArgumentException('json_encode error: '.\json_last_error_msg());
300 } 300 }
301 301
302 /** @var string */ 302 /** @var string */
@@ -341,7 +341,7 @@ EOT @@ -341,7 +341,7 @@ EOT
341 341
342 $errorMessage = 'IDN conversion failed'; 342 $errorMessage = 'IDN conversion failed';
343 if ($errors) { 343 if ($errors) {
344 - $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')'; 344 + $errorMessage .= ' (errors: '.implode(', ', $errors).')';
345 } 345 }
346 346
347 throw new InvalidArgumentException($errorMessage); 347 throw new InvalidArgumentException($errorMessage);
@@ -50,10 +50,10 @@ function debug_resource($value = null) @@ -50,10 +50,10 @@ function debug_resource($value = null)
50 * 50 *
51 * The returned handler is not wrapped by any default middlewares. 51 * The returned handler is not wrapped by any default middlewares.
52 * 52 *
53 - * @throws \RuntimeException if no viable Handler is available.  
54 - *  
55 * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. 53 * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system.
56 * 54 *
  55 + * @throws \RuntimeException if no viable Handler is available.
  56 + *
57 * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead. 57 * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead.
58 */ 58 */
59 function choose_handler(): callable 59 function choose_handler(): callable
@@ -141,7 +141,7 @@ function is_host_in_noproxy(string $host, array $noProxyArray): bool @@ -141,7 +141,7 @@ function is_host_in_noproxy(string $host, array $noProxyArray): bool
141 * 141 *
142 * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. 142 * @throws Exception\InvalidArgumentException if the JSON cannot be decoded.
143 * 143 *
144 - * @link https://www.php.net/manual/en/function.json-decode.php 144 + * @see https://www.php.net/manual/en/function.json-decode.php
145 * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead. 145 * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead.
146 */ 146 */
147 function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) 147 function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
@@ -158,7 +158,7 @@ function json_decode(string $json, bool $assoc = false, int $depth = 512, int $o @@ -158,7 +158,7 @@ function json_decode(string $json, bool $assoc = false, int $depth = 512, int $o
158 * 158 *
159 * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. 159 * @throws Exception\InvalidArgumentException if the JSON cannot be encoded.
160 * 160 *
161 - * @link https://www.php.net/manual/en/function.json-encode.php 161 + * @see https://www.php.net/manual/en/function.json-encode.php
162 * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead. 162 * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead.
163 */ 163 */
164 function json_encode($value, int $options = 0, int $depth = 512): string 164 function json_encode($value, int $options = 0, int $depth = 512): string
@@ -2,5 +2,5 @@ @@ -2,5 +2,5 @@
2 2
3 // Don't redefine the functions if included multiple times. 3 // Don't redefine the functions if included multiple times.
4 if (!\function_exists('GuzzleHttp\describe_type')) { 4 if (!\function_exists('GuzzleHttp\describe_type')) {
5 - require __DIR__ . '/functions.php'; 5 + require __DIR__.'/functions.php';
6 } 6 }
1 # CHANGELOG 1 # CHANGELOG
2 2
  3 +## 1.5.3 - 2023-05-21
  4 +
  5 +### Changed
  6 +
  7 +- Removed remaining usage of deprecated functions
  8 +
3 ## 1.5.2 - 2022-08-07 9 ## 1.5.2 - 2022-08-07
4 10
5 ### Changed 11 ### Changed
@@ -46,11 +46,6 @@ @@ -46,11 +46,6 @@
46 "test": "vendor/bin/simple-phpunit", 46 "test": "vendor/bin/simple-phpunit",
47 "test-ci": "vendor/bin/simple-phpunit --coverage-text" 47 "test-ci": "vendor/bin/simple-phpunit --coverage-text"
48 }, 48 },
49 - "extra": {  
50 - "branch-alias": {  
51 - "dev-master": "1.5-dev"  
52 - }  
53 - },  
54 "config": { 49 "config": {
55 "preferred-install": "dist", 50 "preferred-install": "dist",
56 "sort-packages": true 51 "sort-packages": true
@@ -78,7 +78,7 @@ final class Each @@ -78,7 +78,7 @@ final class Each
78 $concurrency, 78 $concurrency,
79 callable $onFulfilled = null 79 callable $onFulfilled = null
80 ) { 80 ) {
81 - return each_limit( 81 + return self::ofLimit(
82 $iterable, 82 $iterable,
83 $concurrency, 83 $concurrency,
84 $onFulfilled, 84 $onFulfilled,
@@ -107,7 +107,7 @@ final class Utils @@ -107,7 +107,7 @@ final class Utils
107 { 107 {
108 $results = []; 108 $results = [];
109 foreach ($promises as $key => $promise) { 109 foreach ($promises as $key => $promise) {
110 - $results[$key] = inspect($promise); 110 + $results[$key] = self::inspect($promise);
111 } 111 }
112 112
113 return $results; 113 return $results;
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7 7
8 ## Unreleased 8 ## Unreleased
9 9
  10 +## 2.5.0 - 2023-04-17
  11 +
  12 +### Changed
  13 +
  14 +- Adjusted `psr/http-message` version constraint to `^1.1 || ^2.0`
  15 +
  16 +## 2.4.5 - 2023-04-17
  17 +
  18 +### Fixed
  19 +
  20 +- Prevent possible warnings on unset variables in `ServerRequest::normalizeNestedFileSpec`
  21 +- Fixed `Message::bodySummary` when `preg_match` fails
  22 +- Fixed header validation issue
  23 +
  24 +## 2.4.4 - 2023-03-09
  25 +
  26 +### Changed
  27 +
  28 +- Removed the need for `AllowDynamicProperties` in `LazyOpenStream`
  29 +
10 ## 2.4.3 - 2022-10-26 30 ## 2.4.3 - 2022-10-26
11 31
12 ### Changed 32 ### Changed
@@ -8,6 +8,12 @@ functionality like query string parsing. @@ -8,6 +8,12 @@ functionality like query string parsing.
8 ![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg) 8 ![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg)
9 9
10 10
  11 +# Installation
  12 +
  13 +```shell
  14 +composer require guzzlehttp/psr7
  15 +```
  16 +
11 # Stream implementation 17 # Stream implementation
12 18
13 This package comes with a number of stream implementations and stream 19 This package comes with a number of stream implementations and stream
@@ -245,6 +251,8 @@ class EofCallbackStream implements StreamInterface @@ -245,6 +251,8 @@ class EofCallbackStream implements StreamInterface
245 251
246 private $callback; 252 private $callback;
247 253
  254 + private $stream;
  255 +
248 public function __construct(StreamInterface $stream, callable $cb) 256 public function __construct(StreamInterface $stream, callable $cb)
249 { 257 {
250 $this->stream = $stream; 258 $this->stream = $stream;
@@ -52,7 +52,7 @@ @@ -52,7 +52,7 @@
52 "require": { 52 "require": {
53 "php": "^7.2.5 || ^8.0", 53 "php": "^7.2.5 || ^8.0",
54 "psr/http-factory": "^1.0", 54 "psr/http-factory": "^1.0",
55 - "psr/http-message": "^1.0", 55 + "psr/http-message": "^1.1 || ^2.0",
56 "ralouphie/getallheaders": "^3.0" 56 "ralouphie/getallheaders": "^3.0"
57 }, 57 },
58 "provide": { 58 "provide": {
@@ -81,9 +81,6 @@ @@ -81,9 +81,6 @@
81 "bamarni-bin": { 81 "bamarni-bin": {
82 "bin-links": true, 82 "bin-links": true,
83 "forward-command": false 83 "forward-command": false
84 - },  
85 - "branch-alias": {  
86 - "dev-master": "2.4-dev"  
87 } 84 }
88 }, 85 },
89 "config": { 86 "config": {
@@ -10,7 +10,6 @@ use Psr\Http\Message\StreamInterface; @@ -10,7 +10,6 @@ use Psr\Http\Message\StreamInterface;
10 * Lazily reads or writes to a file that is opened only after an IO operation 10 * Lazily reads or writes to a file that is opened only after an IO operation
11 * take place on the stream. 11 * take place on the stream.
12 */ 12 */
13 -#[\AllowDynamicProperties]  
14 final class LazyOpenStream implements StreamInterface 13 final class LazyOpenStream implements StreamInterface
15 { 14 {
16 use StreamDecoratorTrait; 15 use StreamDecoratorTrait;
@@ -22,6 +21,11 @@ final class LazyOpenStream implements StreamInterface @@ -22,6 +21,11 @@ final class LazyOpenStream implements StreamInterface
22 private $mode; 21 private $mode;
23 22
24 /** 23 /**
  24 + * @var StreamInterface
  25 + */
  26 + private $stream;
  27 +
  28 + /**
25 * @param string $filename File to lazily open 29 * @param string $filename File to lazily open
26 * @param string $mode fopen mode to use when opening the stream 30 * @param string $mode fopen mode to use when opening the stream
27 */ 31 */
@@ -29,6 +33,10 @@ final class LazyOpenStream implements StreamInterface @@ -29,6 +33,10 @@ final class LazyOpenStream implements StreamInterface
29 { 33 {
30 $this->filename = $filename; 34 $this->filename = $filename;
31 $this->mode = $mode; 35 $this->mode = $mode;
  36 +
  37 + // unsetting the property forces the first access to go through
  38 + // __get().
  39 + unset($this->stream);
32 } 40 }
33 41
34 /** 42 /**
@@ -77,7 +77,7 @@ final class Message @@ -77,7 +77,7 @@ final class Message
77 77
78 // Matches any printable character, including unicode characters: 78 // Matches any printable character, including unicode characters:
79 // letters, marks, numbers, punctuation, spacing, and separators. 79 // letters, marks, numbers, punctuation, spacing, and separators.
80 - if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary)) { 80 + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary) !== 0) {
81 return null; 81 return null;
82 } 82 }
83 83
@@ -224,12 +224,9 @@ trait MessageTrait @@ -224,12 +224,9 @@ trait MessageTrait
224 )); 224 ));
225 } 225 }
226 226
227 - if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/', $header)) { 227 + if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
228 throw new \InvalidArgumentException( 228 throw new \InvalidArgumentException(
229 - sprintf(  
230 - '"%s" is not valid header name',  
231 - $header  
232 - ) 229 + sprintf('"%s" is not valid header name.', $header)
233 ); 230 );
234 } 231 }
235 } 232 }
@@ -257,8 +254,10 @@ trait MessageTrait @@ -257,8 +254,10 @@ trait MessageTrait
257 // Clients must not send a request with line folding and a server sending folded headers is 254 // Clients must not send a request with line folding and a server sending folded headers is
258 // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting 255 // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
259 // folding is not likely to break any legitimate use case. 256 // folding is not likely to break any legitimate use case.
260 - if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/', $value)) {  
261 - throw new \InvalidArgumentException(sprintf('"%s" is not valid header value', $value)); 257 + if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
  258 + throw new \InvalidArgumentException(
  259 + sprintf('"%s" is not valid header value.', $value)
  260 + );
262 } 261 }
263 } 262 }
264 } 263 }
@@ -144,10 +144,10 @@ class ServerRequest extends Request implements ServerRequestInterface @@ -144,10 +144,10 @@ class ServerRequest extends Request implements ServerRequestInterface
144 foreach (array_keys($files['tmp_name']) as $key) { 144 foreach (array_keys($files['tmp_name']) as $key) {
145 $spec = [ 145 $spec = [
146 'tmp_name' => $files['tmp_name'][$key], 146 'tmp_name' => $files['tmp_name'][$key],
147 - 'size' => $files['size'][$key],  
148 - 'error' => $files['error'][$key],  
149 - 'name' => $files['name'][$key],  
150 - 'type' => $files['type'][$key], 147 + 'size' => $files['size'][$key] ?? null,
  148 + 'error' => $files['error'][$key] ?? null,
  149 + 'name' => $files['name'][$key] ?? null,
  150 + 'type' => $files['type'][$key] ?? null,
151 ]; 151 ];
152 $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); 152 $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
153 } 153 }
1 -composer.lock 1 +tests/poster/
  2 +tests/server/static/
2 vendor/ 3 vendor/
  4 +composer.lock
  5 +.idea