更新vendor

This commit is contained in:
mkm 2024-05-07 18:19:31 +08:00
parent 8283873ee4
commit 7463187f19
309 changed files with 5570 additions and 3930 deletions

View File

@ -48,7 +48,7 @@
"next/var-dumper": "^0.1.0", "next/var-dumper": "^0.1.0",
"w7corp/easywechat": "^6.8", "w7corp/easywechat": "^6.8",
"hyperf/pimple": "~2.2.0", "hyperf/pimple": "~2.2.0",
"yansongda/pay": "^3.6" "yansongda/pay": "~3.7.2"
}, },
"suggest": { "suggest": {
"ext-event": "For better performance. " "ext-event": "For better performance. "

1278
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +0,0 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/var-dump-server
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*

View File

@ -7,7 +7,7 @@ $baseDir = dirname($vendorDir);
return array( return array(
'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'), 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'),
'think\\' => array($vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-orm/src'), 'think\\' => array($vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src'),
'taoser\\' => array($vendorDir . '/taoser/webman-validate/src'), 'taoser\\' => array($vendorDir . '/taoser/webman-validate/src'),
'support\\' => array($vendorDir . '/workerman/webman-framework/src/support'), 'support\\' => array($vendorDir . '/workerman/webman-framework/src/support'),
'app\\View\\Components\\' => array($baseDir . '/app/view/components'), 'app\\View\\Components\\' => array($baseDir . '/app/view/components'),
@ -56,7 +56,7 @@ return array(
'Qcloud\\Cos\\' => array($vendorDir . '/qcloud/cos-sdk-v5/src'), 'Qcloud\\Cos\\' => array($vendorDir . '/qcloud/cos-sdk-v5/src'),
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),

View File

@ -219,8 +219,8 @@ class ComposerStaticInit738295d764b0a7e25449d6502fca73ac
), ),
'think\\' => 'think\\' =>
array ( array (
0 => __DIR__ . '/..' . '/topthink/think-helper/src', 0 => __DIR__ . '/..' . '/topthink/think-container/src',
1 => __DIR__ . '/..' . '/topthink/think-container/src', 1 => __DIR__ . '/..' . '/topthink/think-helper/src',
2 => __DIR__ . '/..' . '/topthink/think-orm/src', 2 => __DIR__ . '/..' . '/topthink/think-orm/src',
), ),
'taoser\\' => 'taoser\\' =>
@ -417,8 +417,8 @@ class ComposerStaticInit738295d764b0a7e25449d6502fca73ac
), ),
'Psr\\Http\\Message\\' => 'Psr\\Http\\Message\\' =>
array ( array (
0 => __DIR__ . '/..' . '/psr/http-message/src', 0 => __DIR__ . '/..' . '/psr/http-factory/src',
1 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src',
), ),
'Psr\\Http\\Client\\' => 'Psr\\Http\\Client\\' =>
array ( array (

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
'name' => 'workerman/webman', 'name' => 'workerman/webman',
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'reference' => '461809eb7949c53a25f00030d053f5ab5cf18e47', 'reference' => '9a0e3b05783f87ac3e9cf894b2c73fad7bb282bc',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
@ -74,9 +74,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'ezyang/htmlpurifier' => array( 'ezyang/htmlpurifier' => array(
'pretty_version' => 'v4.16.0', 'pretty_version' => 'v4.17.0',
'version' => '4.16.0.0', 'version' => '4.17.0.0',
'reference' => '523407fb06eb9e5f3d59889b3978d5bfe94299c8', 'reference' => 'bbc513d79acf6691fa9cf10f192c90dd2957f18c',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../ezyang/htmlpurifier', 'install_path' => __DIR__ . '/../ezyang/htmlpurifier',
'aliases' => array(), 'aliases' => array(),
@ -164,27 +164,27 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'hyperf/contract' => array( 'hyperf/contract' => array(
'pretty_version' => 'v3.1.2', 'pretty_version' => 'v3.1.15',
'version' => '3.1.2.0', 'version' => '3.1.15.0',
'reference' => 'f5379df6df65363d645506f373888372135ac0c6', 'reference' => '9950abe963cc6b30c6d3506fa5b3adbd58cb1945',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../hyperf/contract', 'install_path' => __DIR__ . '/../hyperf/contract',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'hyperf/engine' => array( 'hyperf/engine' => array(
'pretty_version' => 'v2.10.5', 'pretty_version' => 'v2.11.0',
'version' => '2.10.5.0', 'version' => '2.11.0.0',
'reference' => 'b3e1a025e388815612815a0b08fc4f2439140676', 'reference' => '26e0b65fc2a63a00266e7124e221c6f3fb2c8e95',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../hyperf/engine', 'install_path' => __DIR__ . '/../hyperf/engine',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'hyperf/engine-contract' => array( 'hyperf/engine-contract' => array(
'pretty_version' => 'v1.9.1', 'pretty_version' => 'v1.10.1',
'version' => '1.9.1.0', 'version' => '1.10.1.0',
'reference' => 'fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb', 'reference' => '2714a8ba6d6b916e5bd373ff680df9569a4c9eef',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../hyperf/engine-contract', 'install_path' => __DIR__ . '/../hyperf/engine-contract',
'aliases' => array(), 'aliases' => array(),
@ -200,8 +200,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/collections' => array( 'illuminate/collections' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => 'f9589f1063a449111dcaa1d68285b507d9483a95', 'reference' => 'f9589f1063a449111dcaa1d68285b507d9483a95',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/collections', 'install_path' => __DIR__ . '/../illuminate/collections',
@ -209,8 +209,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/conditionable' => array( 'illuminate/conditionable' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => 'd0958e4741fc9d6f516a552060fd1b829a85e009', 'reference' => 'd0958e4741fc9d6f516a552060fd1b829a85e009',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/conditionable', 'install_path' => __DIR__ . '/../illuminate/conditionable',
@ -218,8 +218,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/contracts' => array( 'illuminate/contracts' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => '8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac', 'reference' => '8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/contracts', 'install_path' => __DIR__ . '/../illuminate/contracts',
@ -227,8 +227,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/macroable' => array( 'illuminate/macroable' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => 'dff667a46ac37b634dcf68909d9d41e94dc97c27', 'reference' => 'dff667a46ac37b634dcf68909d9d41e94dc97c27',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/macroable', 'install_path' => __DIR__ . '/../illuminate/macroable',
@ -236,8 +236,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/redis' => array( 'illuminate/redis' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => '8a438aa70f4bf48973dfe8de9af3ad91cc5361a7', 'reference' => '8a438aa70f4bf48973dfe8de9af3ad91cc5361a7',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/redis', 'install_path' => __DIR__ . '/../illuminate/redis',
@ -245,9 +245,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'illuminate/support' => array( 'illuminate/support' => array(
'pretty_version' => 'v10.48.4', 'pretty_version' => 'v10.48.10',
'version' => '10.48.4.0', 'version' => '10.48.10.0',
'reference' => '980d80017e859c8b1720892d952516e8c0b6708f', 'reference' => 'ee3a1aaed36d916654ce0ae09dfbd38644a4f582',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/support', 'install_path' => __DIR__ . '/../illuminate/support',
'aliases' => array(), 'aliases' => array(),
@ -290,9 +290,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'monolog/monolog' => array( 'monolog/monolog' => array(
'pretty_version' => '2.9.2', 'pretty_version' => '2.9.3',
'version' => '2.9.2.0', 'version' => '2.9.3.0',
'reference' => '437cb3628f4cf6042cc10ae97fc2b8472e48ca1f', 'reference' => 'a30bfe2e142720dfa990d0a7e573997f5d884215',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../monolog/monolog', 'install_path' => __DIR__ . '/../monolog/monolog',
'aliases' => array(), 'aliases' => array(),
@ -588,18 +588,18 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/cache' => array( 'symfony/cache' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => '0ef36534694c572ff526d91c7181f3edede176e7', 'reference' => 'b9e9b93c9817ec6c789c7943f5e54b57a041c16a',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache', 'install_path' => __DIR__ . '/../symfony/cache',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/cache-contracts' => array( 'symfony/cache-contracts' => array(
'pretty_version' => 'v3.4.0', 'pretty_version' => 'v3.5.0',
'version' => '3.4.0.0', 'version' => '3.5.0.0',
'reference' => '1d74b127da04ffa87aa940abe15446fa89653778', 'reference' => 'df6a1a44c890faded49a5fca33c2d5c5fd3c2197',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache-contracts', 'install_path' => __DIR__ . '/../symfony/cache-contracts',
'aliases' => array(), 'aliases' => array(),
@ -612,36 +612,36 @@
), ),
), ),
'symfony/console' => array( 'symfony/console' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => '0d9e4eb5ad413075624378f474c4167ea202de78', 'reference' => 'a170e64ae10d00ba89e2acbb590dc2e54da8ad8f',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/console', 'install_path' => __DIR__ . '/../symfony/console',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/deprecation-contracts' => array( 'symfony/deprecation-contracts' => array(
'pretty_version' => 'v3.3.0', 'pretty_version' => 'v3.5.0',
'version' => '3.3.0.0', 'version' => '3.5.0.0',
'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/http-client' => array( 'symfony/http-client' => array(
'pretty_version' => 'v6.4.5', 'pretty_version' => 'v6.4.7',
'version' => '6.4.5.0', 'version' => '6.4.7.0',
'reference' => 'f3c86a60a3615f466333a11fd42010d4382a82c7', 'reference' => '3683d8107cf1efdd24795cc5f7482be1eded34ac',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-client', 'install_path' => __DIR__ . '/../symfony/http-client',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/http-client-contracts' => array( 'symfony/http-client-contracts' => array(
'pretty_version' => 'v3.4.0', 'pretty_version' => 'v3.5.0',
'version' => '3.4.0.0', 'version' => '3.5.0.0',
'reference' => '1ee70e699b41909c209a0c930f11034b93578654', 'reference' => '20414d96f391677bf80078aa55baece78b82647d',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-client-contracts', 'install_path' => __DIR__ . '/../symfony/http-client-contracts',
'aliases' => array(), 'aliases' => array(),
@ -654,27 +654,27 @@
), ),
), ),
'symfony/http-foundation' => array( 'symfony/http-foundation' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => 'ebc713bc6e6f4b53f46539fc158be85dfcd77304', 'reference' => 'b4db6b833035477cb70e18d0ae33cb7c2b521759',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-foundation', 'install_path' => __DIR__ . '/../symfony/http-foundation',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/mime' => array( 'symfony/mime' => array(
'pretty_version' => 'v6.4.3', 'pretty_version' => 'v6.4.7',
'version' => '6.4.3.0', 'version' => '6.4.7.0',
'reference' => '5017e0a9398c77090b7694be46f20eb796262a34', 'reference' => 'decadcf3865918ecfcbfa90968553994ce935a5e',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/mime', 'install_path' => __DIR__ . '/../symfony/mime',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-ctype' => array( 'symfony/polyfill-ctype' => array(
'pretty_version' => 'v1.28.0', 'pretty_version' => 'v1.29.0',
'version' => '1.28.0.0', 'version' => '1.29.0.0',
'reference' => 'ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb', 'reference' => 'ef4d7e442ca910c4764bce785146269b30cb5fc4',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(), 'aliases' => array(),
@ -699,18 +699,18 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-normalizer' => array( 'symfony/polyfill-intl-normalizer' => array(
'pretty_version' => 'v1.28.0', 'pretty_version' => 'v1.29.0',
'version' => '1.28.0.0', 'version' => '1.29.0.0',
'reference' => '8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92', 'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-mbstring' => array( 'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.28.0', 'pretty_version' => 'v1.29.0',
'version' => '1.28.0.0', 'version' => '1.29.0.0',
'reference' => '42292d99c55abe617799667f454222c54c60e229', 'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(), 'aliases' => array(),
@ -735,9 +735,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-php81' => array( 'symfony/polyfill-php81' => array(
'pretty_version' => 'v1.28.0', 'pretty_version' => 'v1.29.0',
'version' => '1.28.0.0', 'version' => '1.29.0.0',
'reference' => '7581cd600fa9fd681b797d00b02f068e2f13263b', 'reference' => 'c565ad1e63f30e7477fc40738343c62b40bc672d',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'install_path' => __DIR__ . '/../symfony/polyfill-php81',
'aliases' => array(), 'aliases' => array(),
@ -753,45 +753,45 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/psr-http-message-bridge' => array( 'symfony/psr-http-message-bridge' => array(
'pretty_version' => 'v2.3.1', 'pretty_version' => 'v6.4.7',
'version' => '2.3.1.0', 'version' => '6.4.7.0',
'reference' => '581ca6067eb62640de5ff08ee1ba6850a0ee472e', 'reference' => 'e8adf6b1b46d9115f5d9247fa74bbefc459680c0',
'type' => 'symfony-bridge', 'type' => 'symfony-bridge',
'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge', 'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/service-contracts' => array( 'symfony/service-contracts' => array(
'pretty_version' => 'v2.5.2', 'pretty_version' => 'v3.5.0',
'version' => '2.5.2.0', 'version' => '3.5.0.0',
'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/service-contracts', 'install_path' => __DIR__ . '/../symfony/service-contracts',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/string' => array( 'symfony/string' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => '4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9', 'reference' => 'ffeb9591c61f65a68d47f77d12b83fa530227a69',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/string', 'install_path' => __DIR__ . '/../symfony/string',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/translation' => array( 'symfony/translation' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => 'bce6a5a78e94566641b2594d17e48b0da3184a8e', 'reference' => '7495687c58bfd88b7883823747b0656d90679123',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/translation', 'install_path' => __DIR__ . '/../symfony/translation',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/translation-contracts' => array( 'symfony/translation-contracts' => array(
'pretty_version' => 'v3.4.1', 'pretty_version' => 'v3.5.0',
'version' => '3.4.1.0', 'version' => '3.5.0.0',
'reference' => '06450585bf65e978026bda220cdebca3f867fde7', 'reference' => 'b9d2189887bb6b2e0367a9fc7136c5239ab9b05a',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/translation-contracts', 'install_path' => __DIR__ . '/../symfony/translation-contracts',
'aliases' => array(), 'aliases' => array(),
@ -804,18 +804,18 @@
), ),
), ),
'symfony/var-dumper' => array( 'symfony/var-dumper' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => 'b439823f04c98b84d4366c79507e9da6230944b1', 'reference' => '7a9cd977cd1c5fed3694bee52990866432af07d7',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-dumper', 'install_path' => __DIR__ . '/../symfony/var-dumper',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/var-exporter' => array( 'symfony/var-exporter' => array(
'pretty_version' => 'v6.4.4', 'pretty_version' => 'v6.4.7',
'version' => '6.4.4.0', 'version' => '6.4.7.0',
'reference' => '0bd342e24aef49fc82a21bd4eedd3e665d177e5b', 'reference' => '825f9b00c37bbe1c1691cc1aff9b5451fc9b4405',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-exporter', 'install_path' => __DIR__ . '/../symfony/var-exporter',
'aliases' => array(), 'aliases' => array(),
@ -885,9 +885,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'vlucas/phpdotenv' => array( 'vlucas/phpdotenv' => array(
'pretty_version' => 'v5.5.0', 'pretty_version' => 'v5.6.0',
'version' => '5.5.0.0', 'version' => '5.6.0.0',
'reference' => '1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7', 'reference' => '2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../vlucas/phpdotenv', 'install_path' => __DIR__ . '/../vlucas/phpdotenv',
'aliases' => array(), 'aliases' => array(),
@ -903,18 +903,18 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'w7corp/easywechat' => array( 'w7corp/easywechat' => array(
'pretty_version' => '6.8.0', 'pretty_version' => '6.15.1',
'version' => '6.8.0.0', 'version' => '6.15.1.0',
'reference' => '60f0b4ba2ac3144df1a2291193daa34beb949d26', 'reference' => '8902917ceeaa20354301e533ff3725f0044c04ca',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../w7corp/easywechat', 'install_path' => __DIR__ . '/../w7corp/easywechat',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'webman/console' => array( 'webman/console' => array(
'pretty_version' => 'v1.3.4', 'pretty_version' => 'v1.3.7',
'version' => '1.3.4.0', 'version' => '1.3.7.0',
'reference' => 'ee50a1eca292eea5bf70661aa2ef722e1294814c', 'reference' => '598dce52e54839e3ea6f483ef97b10c96bbec341',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../webman/console', 'install_path' => __DIR__ . '/../webman/console',
'aliases' => array(), 'aliases' => array(),
@ -950,7 +950,7 @@
'workerman/webman' => array( 'workerman/webman' => array(
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'reference' => '461809eb7949c53a25f00030d053f5ab5cf18e47', 'reference' => '9a0e3b05783f87ac3e9cf894b2c73fad7bb282bc',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
@ -975,18 +975,18 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'yansongda/artful' => array( 'yansongda/artful' => array(
'pretty_version' => 'v1.0.9', 'pretty_version' => 'v1.1.0',
'version' => '1.0.9.0', 'version' => '1.1.0.0',
'reference' => '1fbf987c0deb95a9b67eb343f2b96c8489635e6f', 'reference' => '9e852f589728b4908c3ae0f0dd0a5bd11cd42a3f',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../yansongda/artful', 'install_path' => __DIR__ . '/../yansongda/artful',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'yansongda/pay' => array( 'yansongda/pay' => array(
'pretty_version' => 'v3.6.3', 'pretty_version' => 'v3.7.2',
'version' => '3.6.3.0', 'version' => '3.7.2.0',
'reference' => 'fba0bb30636cb936eed9e9078d781e0dc4e4282b', 'reference' => '722ffdcd5c9f6dae81ff12f840651b1e5a5b3028',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../yansongda/pay', 'install_path' => __DIR__ . '/../yansongda/pay',
'aliases' => array(), 'aliases' => array(),

View File

@ -1,6 +0,0 @@
# [4.16.0](https://github.com/ezyang/htmlpurifier/compare/v4.15.0...v4.16.0) (2022-09-18)
### Features
* add semantic release ([#307](https://github.com/ezyang/htmlpurifier/issues/307)) ([db31243](https://github.com/ezyang/htmlpurifier/commit/db312435cb9d8d73395f75f9642a43ba6de5e903)), closes [#322](https://github.com/ezyang/htmlpurifier/issues/322) [#323](https://github.com/ezyang/htmlpurifier/issues/323) [#326](https://github.com/ezyang/htmlpurifier/issues/326) [#327](https://github.com/ezyang/htmlpurifier/issues/327) [#328](https://github.com/ezyang/htmlpurifier/issues/328) [#329](https://github.com/ezyang/htmlpurifier/issues/329) [#330](https://github.com/ezyang/htmlpurifier/issues/330) [#331](https://github.com/ezyang/htmlpurifier/issues/331) [#332](https://github.com/ezyang/htmlpurifier/issues/332) [#333](https://github.com/ezyang/htmlpurifier/issues/333) [#337](https://github.com/ezyang/htmlpurifier/issues/337) [#335](https://github.com/ezyang/htmlpurifier/issues/335) [ezyang/htmlpurifier#334](https://github.com/ezyang/htmlpurifier/issues/334) [#336](https://github.com/ezyang/htmlpurifier/issues/336) [#338](https://github.com/ezyang/htmlpurifier/issues/338)

View File

@ -1 +1 @@
4.15.0 4.17.0

View File

@ -13,7 +13,7 @@
} }
], ],
"require": { "require": {
"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" "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 || ~8.3.0"
}, },
"require-dev": { "require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0", "cerdic/css-tidy": "^1.7 || ^2.0",
@ -38,7 +38,8 @@
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/ezyang/simpletest.git" "url": "https://github.com/ezyang/simpletest.git",
"no-api": true
} }
] ]
} }

View File

@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run. * FILE, changes will be overwritten the next time the script is run.
* *
* @version 4.15.0 * @version 4.17.0
* *
* @warning * @warning
* You must *not* include any other HTML Purifier files before this file, * You must *not* include any other HTML Purifier files before this file,

View File

@ -19,7 +19,7 @@
*/ */
/* /*
HTML Purifier 4.15.0 - Standards Compliant HTML Filtering HTML Purifier 4.17.0 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -58,12 +58,12 @@ class HTMLPurifier
* Version of HTML Purifier. * Version of HTML Purifier.
* @type string * @type string
*/ */
public $version = '4.15.0'; public $version = '4.17.0';
/** /**
* Constant with version of HTML Purifier. * Constant with version of HTML Purifier.
*/ */
const VERSION = '4.15.0'; const VERSION = '4.17.0';
/** /**
* Global configuration object. * Global configuration object.

View File

@ -10,23 +10,21 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef
public function __construct() public function __construct()
{ {
$this->mask = '_- '; // Lowercase letters
for ($c = 'a'; $c <= 'z'; $c++) { $l = range('a', 'z');
$this->mask .= $c; // Uppercase letters
} $u = range('A', 'Z');
for ($c = 'A'; $c <= 'Z'; $c++) { // Digits
$this->mask .= $c; $d = range('0', '9');
} // Special bytes used by UTF-8
for ($c = '0'; $c <= '9'; $c++) { $b = array_map('chr', range(0x80, 0xFF));
$this->mask .= $c; // All valid characters for the mask
} // cast-y, but should be fine $c = array_merge($l, $u, $d, $b);
// special bytes used by UTF-8 // Concatenate all valid characters into a string
for ($i = 0x80; $i <= 0xFF; $i++) { // Use '_- ' as an initial value
// We don't bother excluding invalid bytes in this range, $this->mask = array_reduce($c, function ($carry, $value) {
// because the our restriction of well-formed UTF-8 will return $carry . $value;
// prevent these from ever occurring. }, '_- ');
$this->mask .= chr($i);
}
/* /*
PHP's internal strcspn implementation is PHP's internal strcspn implementation is

View File

@ -106,7 +106,7 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
// If we have Net_IDNA2 support, we can support IRIs by // If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do, // punycoding them. (This is the most portable thing to do,
// since otherwise we have to assume browsers support // since otherwise we have to assume browsers support
} elseif ($config->get('Core.EnableIDNA')) { } elseif ($config->get('Core.EnableIDNA') && class_exists('Net_IDNA2')) {
$idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
// we need to encode each period separately // we need to encode each period separately
$parts = explode('.', $string); $parts = explode('.', $string);

View File

@ -33,7 +33,11 @@ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform
// XXX Kind of inefficient // XXX Kind of inefficient
$url = $this->parser->parse($attr['href']); $url = $this->parser->parse($attr['href']);
$scheme = $url->getSchemeObj($config, $context);
// Ignore invalid schemes (e.g. `javascript:`)
if (!($scheme = $url->getSchemeObj($config, $context))) {
return $attr;
}
if ($scheme->browsable && !$url->isBenign($config, $context)) { if ($scheme->browsable && !$url->isBenign($config, $context)) {
$attr['target'] = '_blank'; $attr['target'] = '_blank';

View File

@ -79,44 +79,11 @@ class HTMLPurifier_Bootstrap
public static function registerAutoload() public static function registerAutoload()
{ {
$autoload = array('HTMLPurifier_Bootstrap', 'autoload'); $autoload = array('HTMLPurifier_Bootstrap', 'autoload');
if (($funcs = spl_autoload_functions()) === false) { if (spl_autoload_functions() === false) {
spl_autoload_register($autoload); spl_autoload_register($autoload);
} elseif (function_exists('spl_autoload_unregister')) { } else {
if (version_compare(PHP_VERSION, '5.3.0', '>=')) { // prepend flag exists, no need for shenanigans
// prepend flag exists, no need for shenanigans spl_autoload_register($autoload, true, true);
spl_autoload_register($autoload, true, true);
} else {
$buggy = version_compare(PHP_VERSION, '5.2.11', '<');
$compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
version_compare(PHP_VERSION, '5.1.0', '>=');
foreach ($funcs as $func) {
if ($buggy && is_array($func)) {
// :TRICKY: There are some compatibility issues and some
// places where we need to error out
$reflector = new ReflectionMethod($func[0], $func[1]);
if (!$reflector->isStatic()) {
throw new Exception(
'HTML Purifier autoloader registrar is not compatible
with non-static object methods due to PHP Bug #44144;
Please do not use HTMLPurifier.autoload.php (or any
file that includes this file); instead, place the code:
spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
after your own autoloaders.'
);
}
// Suprisingly, spl_autoload_register supports the
// Class::staticMethod callback format, although call_user_func doesn't
if ($compat) {
$func = implode('::', $func);
}
}
spl_autoload_unregister($func);
}
spl_autoload_register($autoload);
foreach ($funcs as $func) {
spl_autoload_register($func);
}
}
} }
} }
} }

View File

@ -13,7 +13,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
* Assoc array of attribute name to definition object. * Assoc array of attribute name to definition object.
* @type HTMLPurifier_AttrDef[] * @type HTMLPurifier_AttrDef[]
*/ */
public $info = array(); public $info = [];
/** /**
* Constructs the info array. The meat of this class. * Constructs the info array. The meat of this class.
@ -22,7 +22,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetup($config) protected function doSetup($config)
{ {
$this->info['text-align'] = new HTMLPurifier_AttrDef_Enum( $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
array('left', 'right', 'center', 'justify'), ['left', 'right', 'center', 'justify'],
false false
); );
@ -31,7 +31,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-right-style'] = $this->info['border-right-style'] =
$this->info['border-left-style'] = $this->info['border-left-style'] =
$this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
array( [
'none', 'none',
'hidden', 'hidden',
'dotted', 'dotted',
@ -42,42 +42,42 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'ridge', 'ridge',
'inset', 'inset',
'outset' 'outset'
), ],
false false
); );
$this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
$this->info['clear'] = new HTMLPurifier_AttrDef_Enum( $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
array('none', 'left', 'right', 'both'), ['none', 'left', 'right', 'both'],
false false
); );
$this->info['float'] = new HTMLPurifier_AttrDef_Enum( $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
array('none', 'left', 'right'), ['none', 'left', 'right'],
false false
); );
$this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
array('normal', 'italic', 'oblique'), ['normal', 'italic', 'oblique'],
false false
); );
$this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
array('normal', 'small-caps'), ['normal', 'small-caps'],
false false
); );
$uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('none')), new HTMLPurifier_AttrDef_Enum(['none']),
new HTMLPurifier_AttrDef_CSS_URI() new HTMLPurifier_AttrDef_CSS_URI()
) ]
); );
$this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
array('inside', 'outside'), ['inside', 'outside'],
false false
); );
$this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
array( [
'disc', 'disc',
'circle', 'circle',
'square', 'square',
@ -87,7 +87,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'lower-alpha', 'lower-alpha',
'upper-alpha', 'upper-alpha',
'none' 'none'
), ],
false false
); );
$this->info['list-style-image'] = $uri_or_none; $this->info['list-style-image'] = $uri_or_none;
@ -95,34 +95,34 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
$this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
array('capitalize', 'uppercase', 'lowercase', 'none'), ['capitalize', 'uppercase', 'lowercase', 'none'],
false false
); );
$this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
$this->info['background-image'] = $uri_or_none; $this->info['background-image'] = $uri_or_none;
$this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') ['repeat', 'repeat-x', 'repeat-y', 'no-repeat']
); );
$this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
array('scroll', 'fixed') ['scroll', 'fixed']
); );
$this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
$this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'auto', 'auto',
'cover', 'cover',
'contain', 'contain',
'initial', 'initial',
'inherit', 'inherit',
) ]
), ),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$border_color = $border_color =
@ -131,10 +131,10 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-left-color'] = $this->info['border-left-color'] =
$this->info['border-right-color'] = $this->info['border-right-color'] =
$this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('transparent')), new HTMLPurifier_AttrDef_Enum(['transparent']),
new HTMLPurifier_AttrDef_CSS_Color() new HTMLPurifier_AttrDef_CSS_Color()
) ]
); );
$this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
@ -146,32 +146,32 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-bottom-width'] = $this->info['border-bottom-width'] =
$this->info['border-left-width'] = $this->info['border-left-width'] =
$this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), new HTMLPurifier_AttrDef_Enum(['thin', 'medium', 'thick']),
new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
) ]
); );
$this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
$this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'xx-small', 'xx-small',
'x-small', 'x-small',
'small', 'small',
@ -181,20 +181,20 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'xx-large', 'xx-large',
'larger', 'larger',
'smaller' 'smaller'
) ]
), ),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true) new HTMLPurifier_AttrDef_CSS_Percentage(true)
) ]
); );
$margin = $margin =
@ -202,11 +202,11 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['margin-bottom'] = $this->info['margin-bottom'] =
$this->info['margin-left'] = $this->info['margin-left'] =
$this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto')) new HTMLPurifier_AttrDef_Enum(['auto'])
) ]
); );
$this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
@ -217,41 +217,41 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['padding-bottom'] = $this->info['padding-bottom'] =
$this->info['padding-left'] = $this->info['padding-left'] =
$this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true) new HTMLPurifier_AttrDef_CSS_Percentage(true)
) ]
); );
$this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
$this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage() new HTMLPurifier_AttrDef_CSS_Percentage()
) ]
); );
$trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['auto', 'initial', 'inherit'])
) ]
); );
$trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['initial', 'inherit'])
) ]
); );
$trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['none', 'initial', 'inherit'])
) ]
); );
$max = $config->get('CSS.MaxImgLength'); $max = $config->get('CSS.MaxImgLength');
@ -263,10 +263,10 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0', $max), new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('auto')) new HTMLPurifier_AttrDef_Enum(['auto'])
) ]
), ),
// For everyone else: // For everyone else:
$trusted_wh $trusted_wh
@ -279,10 +279,10 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0', $max), new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['initial', 'inherit'])
) ]
), ),
// For everyone else: // For everyone else:
$trusted_min_wh $trusted_min_wh
@ -295,22 +295,39 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0', $max), new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['none', 'initial', 'inherit'])
) ]
), ),
// For everyone else: // For everyone else:
$trusted_max_wh $trusted_max_wh
); );
// text-decoration and related shorthands
$this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
$this->info['text-decoration-line'] = new HTMLPurifier_AttrDef_Enum(
['none', 'underline', 'overline', 'line-through', 'initial', 'inherit']
);
$this->info['text-decoration-style'] = new HTMLPurifier_AttrDef_Enum(
['solid', 'double', 'dotted', 'dashed', 'wavy', 'initial', 'inherit']
);
$this->info['text-decoration-color'] = new HTMLPurifier_AttrDef_CSS_Color();
$this->info['text-decoration-thickness'] = new HTMLPurifier_AttrDef_CSS_Composite([
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(['auto', 'from-font', 'initial', 'inherit'])
]);
$this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
// this could use specialized code // this could use specialized code
$this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
array( [
'normal', 'normal',
'bold', 'bold',
'bolder', 'bolder',
@ -324,7 +341,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'700', '700',
'800', '800',
'900' '900'
), ],
false false
); );
@ -340,21 +357,21 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
$this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
array('collapse', 'separate') ['collapse', 'separate']
); );
$this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
array('top', 'bottom') ['top', 'bottom']
); );
$this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
array('auto', 'fixed') ['auto', 'fixed']
); );
$this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'baseline', 'baseline',
'sub', 'sub',
'super', 'super',
@ -363,11 +380,11 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'middle', 'middle',
'bottom', 'bottom',
'text-bottom' 'text-bottom'
) ]
), ),
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage() new HTMLPurifier_AttrDef_CSS_Percentage()
) ]
); );
$this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
@ -375,7 +392,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
// These CSS properties don't work on many browsers, but we live // These CSS properties don't work on many browsers, but we live
// in THE FUTURE! // in THE FUTURE!
$this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') ['nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line']
); );
if ($config->get('CSS.Proprietary')) { if ($config->get('CSS.Proprietary')) {
@ -422,21 +439,21 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
// more CSS3 // more CSS3
$this->info['page-break-after'] = $this->info['page-break-after'] =
$this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
array( [
'auto', 'auto',
'always', 'always',
'avoid', 'avoid',
'left', 'left',
'right' 'right'
) ]
); );
$this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(['auto', 'avoid']);
$border_radius = new HTMLPurifier_AttrDef_CSS_Composite( $border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
)); ]);
$this->info['border-top-left-radius'] = $this->info['border-top-left-radius'] =
$this->info['border-top-right-radius'] = $this->info['border-top-right-radius'] =
@ -453,7 +470,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetupTricky($config) protected function doSetupTricky($config)
{ {
$this->info['display'] = new HTMLPurifier_AttrDef_Enum( $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
array( [
'inline', 'inline',
'block', 'block',
'list-item', 'list-item',
@ -472,12 +489,12 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'table-cell', 'table-cell',
'table-caption', 'table-caption',
'none' 'none'
) ]
); );
$this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
array('visible', 'hidden', 'collapse') ['visible', 'hidden', 'collapse']
); );
$this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(['visible', 'hidden', 'auto', 'scroll']);
$this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
} }
@ -487,23 +504,23 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetupTrusted($config) protected function doSetupTrusted($config)
{ {
$this->info['position'] = new HTMLPurifier_AttrDef_Enum( $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
array('static', 'relative', 'absolute', 'fixed') ['static', 'relative', 'absolute', 'fixed']
); );
$this->info['top'] = $this->info['top'] =
$this->info['left'] = $this->info['left'] =
$this->info['right'] = $this->info['right'] =
$this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto')), new HTMLPurifier_AttrDef_Enum(['auto']),
) ]
); );
$this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Integer(), new HTMLPurifier_AttrDef_Integer(),
new HTMLPurifier_AttrDef_Enum(array('auto')), new HTMLPurifier_AttrDef_Enum(['auto']),
) ]
); );
} }

View File

@ -21,7 +21,7 @@ class HTMLPurifier_Config
* HTML Purifier's version * HTML Purifier's version
* @type string * @type string
*/ */
public $version = '4.15.0'; public $version = '4.17.0';
/** /**
* Whether or not to automatically finalize * Whether or not to automatically finalize

View File

@ -287,13 +287,14 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
} elseif (filegroup($dir) === posix_getgid()) { } elseif (filegroup($dir) === posix_getgid()) {
$chmod = $chmod | 0070; $chmod = $chmod | 0070;
} else { } else {
// PHP's probably running as nobody, so we'll // PHP's probably running as nobody, it is
// need to give global permissions // not obvious how to fix this (777 is probably
$chmod = $chmod | 0777; // bad if you are multi-user), let the user figure it out
$chmod = null;
} }
trigger_error( trigger_error(
'Directory ' . $dir . ' not writable, ' . 'Directory ' . $dir . ' not writable. ' .
'please chmod to ' . decoct($chmod), ($chmod === null ? '' : 'Please chmod to ' . decoct($chmod)),
E_USER_WARNING E_USER_WARNING
); );
} else { } else {

View File

@ -71,7 +71,7 @@ class HTMLPurifier_DefinitionCacheFactory
return $this->caches[$method][$type]; return $this->caches[$method][$type];
} }
if (isset($this->implementations[$method]) && if (isset($this->implementations[$method]) &&
class_exists($class = $this->implementations[$method], false)) { class_exists($class = $this->implementations[$method])) {
$cache = new $class($type); $cache = new $class($type);
} else { } else {
if ($method != 'Serializer') { if ($method != 'Serializer') {

View File

@ -146,175 +146,179 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
foreach ($this->_tidy->css as $k => $decls) { foreach ($this->_tidy->css as $k => $decls) {
// $decls are all CSS declarations inside an @ selector // $decls are all CSS declarations inside an @ selector
$new_decls = array(); $new_decls = array();
foreach ($decls as $selector => $style) { if (is_array($decls)) {
$selector = trim($selector); foreach ($decls as $selector => $style) {
if ($selector === '') { $selector = trim($selector);
continue; if ($selector === '') {
} // should not happen continue;
// Parse the selector } // should not happen
// Here is the relevant part of the CSS grammar: // Parse the selector
// // Here is the relevant part of the CSS grammar:
// ruleset //
// : selector [ ',' S* selector ]* '{' ... // ruleset
// selector // : selector [ ',' S* selector ]* '{' ...
// : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]? // selector
// combinator // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
// : '+' S* // combinator
// : '>' S* // : '+' S*
// simple_selector // : '>' S*
// : element_name [ HASH | class | attrib | pseudo ]* // simple_selector
// | [ HASH | class | attrib | pseudo ]+ // : element_name [ HASH | class | attrib | pseudo ]*
// element_name // | [ HASH | class | attrib | pseudo ]+
// : IDENT | '*' // element_name
// ; // : IDENT | '*'
// class // ;
// : '.' IDENT // class
// ; // : '.' IDENT
// attrib // ;
// : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* // attrib
// [ IDENT | STRING ] S* ]? ']' // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
// ; // [ IDENT | STRING ] S* ]? ']'
// pseudo // ;
// : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ] // pseudo
// ; // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
// // ;
// For reference, here are the relevant tokens: //
// // For reference, here are the relevant tokens:
// HASH #{name} //
// IDENT {ident} // HASH #{name}
// INCLUDES == // IDENT {ident}
// DASHMATCH |= // INCLUDES ==
// STRING {string} // DASHMATCH |=
// FUNCTION {ident}\( // STRING {string}
// // FUNCTION {ident}\(
// And the lexical scanner tokens //
// // And the lexical scanner tokens
// name {nmchar}+ //
// nmchar [_a-z0-9-]|{nonascii}|{escape} // name {nmchar}+
// nonascii [\240-\377] // nmchar [_a-z0-9-]|{nonascii}|{escape}
// escape {unicode}|\\[^\r\n\f0-9a-f] // nonascii [\240-\377]
// unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])? // escape {unicode}|\\[^\r\n\f0-9a-f]
// ident -?{nmstart}{nmchar*} // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
// nmstart [_a-z]|{nonascii}|{escape} // ident -?{nmstart}{nmchar*}
// string {string1}|{string2} // nmstart [_a-z]|{nonascii}|{escape}
// string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" // string {string1}|{string2}
// string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\' // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
// // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
// We'll implement a subset (in order to reduce attack //
// surface); in particular: // We'll implement a subset (in order to reduce attack
// // surface); in particular:
// - No Unicode support //
// - No escapes support // - No Unicode support
// - No string support (by proxy no attrib support) // - No escapes support
// - element_name is matched against allowed // - No string support (by proxy no attrib support)
// elements (some people might find this // - element_name is matched against allowed
// annoying...) // elements (some people might find this
// - Pseudo-elements one of :first-child, :link, // annoying...)
// :visited, :active, :hover, :focus // - Pseudo-elements one of :first-child, :link,
// :visited, :active, :hover, :focus
// handle ruleset // handle ruleset
$selectors = array_map('trim', explode(',', $selector)); $selectors = array_map('trim', explode(',', $selector));
$new_selectors = array(); $new_selectors = array();
foreach ($selectors as $sel) { foreach ($selectors as $sel) {
// split on +, > and spaces // split on +, > and spaces
$basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE); $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
// even indices are chunks, odd indices are // even indices are chunks, odd indices are
// delimiters // delimiters
$nsel = null; $nsel = null;
$delim = null; // guaranteed to be non-null after $delim = null; // guaranteed to be non-null after
// two loop iterations // two loop iterations
for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) { for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
$x = $basic_selectors[$i]; $x = $basic_selectors[$i];
if ($i % 2) { if ($i % 2) {
// delimiter // delimiter
if ($x === ' ') { if ($x === ' ') {
$delim = ' '; $delim = ' ';
} else {
$delim = ' ' . $x . ' ';
}
} else {
// simple selector
$components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
$sdelim = null;
$nx = null;
for ($j = 0, $cc = count($components); $j < $cc; $j++) {
$y = $components[$j];
if ($j === 0) {
if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
$nx = $y;
} else {
// $nx stays null; this matters
// if we don't manage to find
// any valid selector content,
// in which case we ignore the
// outer $delim
}
} elseif ($j % 2) {
// set delimiter
$sdelim = $y;
} else { } else {
$attrdef = null; $delim = ' ' . $x . ' ';
if ($sdelim === '#') {
$attrdef = $this->_id_attrdef;
} elseif ($sdelim === '.') {
$attrdef = $this->_class_attrdef;
} elseif ($sdelim === ':') {
$attrdef = $this->_enum_attrdef;
} else {
throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
}
$r = $attrdef->validate($y, $config, $context);
if ($r !== false) {
if ($r !== true) {
$y = $r;
}
if ($nx === null) {
$nx = '';
}
$nx .= $sdelim . $y;
}
}
}
if ($nx !== null) {
if ($nsel === null) {
$nsel = $nx;
} else {
$nsel .= $delim . $nx;
} }
} else { } else {
// delimiters to the left of invalid // simple selector
// basic selector ignored $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
$sdelim = null;
$nx = null;
for ($j = 0, $cc = count($components); $j < $cc; $j++) {
$y = $components[$j];
if ($j === 0) {
if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
$nx = $y;
} else {
// $nx stays null; this matters
// if we don't manage to find
// any valid selector content,
// in which case we ignore the
// outer $delim
}
} elseif ($j % 2) {
// set delimiter
$sdelim = $y;
} else {
$attrdef = null;
if ($sdelim === '#') {
$attrdef = $this->_id_attrdef;
} elseif ($sdelim === '.') {
$attrdef = $this->_class_attrdef;
} elseif ($sdelim === ':') {
$attrdef = $this->_enum_attrdef;
} else {
throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
}
$r = $attrdef->validate($y, $config, $context);
if ($r !== false) {
if ($r !== true) {
$y = $r;
}
if ($nx === null) {
$nx = '';
}
$nx .= $sdelim . $y;
}
}
}
if ($nx !== null) {
if ($nsel === null) {
$nsel = $nx;
} else {
$nsel .= $delim . $nx;
}
} else {
// delimiters to the left of invalid
// basic selector ignored
}
}
}
if ($nsel !== null) {
if (!empty($scopes)) {
foreach ($scopes as $s) {
$new_selectors[] = "$s $nsel";
}
} else {
$new_selectors[] = $nsel;
} }
} }
} }
if ($nsel !== null) { if (empty($new_selectors)) {
if (!empty($scopes)) {
foreach ($scopes as $s) {
$new_selectors[] = "$s $nsel";
}
} else {
$new_selectors[] = $nsel;
}
}
}
if (empty($new_selectors)) {
continue;
}
$selector = implode(', ', $new_selectors);
foreach ($style as $name => $value) {
if (!isset($css_definition->info[$name])) {
unset($style[$name]);
continue; continue;
} }
$def = $css_definition->info[$name]; $selector = implode(', ', $new_selectors);
$ret = $def->validate($value, $config, $context); foreach ($style as $name => $value) {
if ($ret === false) { if (!isset($css_definition->info[$name])) {
unset($style[$name]); unset($style[$name]);
} else { continue;
$style[$name] = $ret; }
$def = $css_definition->info[$name];
$ret = $def->validate($value, $config, $context);
if ($ret === false) {
unset($style[$name]);
} else {
$style[$name] = $ret;
}
} }
$new_decls[$selector] = $style;
} }
$new_decls[$selector] = $style; } else {
continue;
} }
$new_css[$k] = $new_decls; $new_css[$k] = $new_decls;
} }

View File

@ -221,6 +221,7 @@ class HTMLPurifier_HTMLModule_Tidy extends HTMLPurifier_HTMLModule
*/ */
public function makeFixes() public function makeFixes()
{ {
return array();
} }
} }

View File

@ -109,7 +109,7 @@ class HTMLPurifier_LanguageFactory
} else { } else {
$class = 'HTMLPurifier_Language_' . $pcode; $class = 'HTMLPurifier_Language_' . $pcode;
$file = $this->dir . '/Language/classes/' . $code . '.php'; $file = $this->dir . '/Language/classes/' . $code . '.php';
if (file_exists($file) || class_exists($class, false)) { if (file_exists($file) || class_exists($class)) {
$lang = new $class($config, $context); $lang = new $class($config, $context);
} else { } else {
// Go fallback // Go fallback

View File

@ -101,7 +101,7 @@ class HTMLPurifier_Lexer
break; break;
} }
if (class_exists('DOMDocument', false) && if (class_exists('DOMDocument') &&
method_exists('DOMDocument', 'loadHTML') && method_exists('DOMDocument', 'loadHTML') &&
!extension_loaded('domxml') !extension_loaded('domxml')
) { ) {

View File

@ -104,7 +104,6 @@ class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
* To iterate is human, to recurse divine - L. Peter Deutsch * To iterate is human, to recurse divine - L. Peter Deutsch
* @param DOMNode $node DOMNode to be tokenized. * @param DOMNode $node DOMNode to be tokenized.
* @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
* @return HTMLPurifier_Token of node appended to previously passed tokens.
*/ */
protected function tokenizeDOM($node, &$tokens, $config) protected function tokenizeDOM($node, &$tokens, $config)
{ {

View File

@ -32,6 +32,11 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
*/ */
protected $compress = false; protected $compress = false;
/**
* @var HTMLPurifier_Config
*/
protected $genConfig;
/** /**
* @param string $name Form element name for directives to be stuffed into * @param string $name Form element name for directives to be stuffed into
* @param string $doc_url String documentation URL, will have fragment tagged on * @param string $doc_url String documentation URL, will have fragment tagged on

View File

@ -33,11 +33,11 @@ class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
$uri->host = null; $uri->host = null;
$uri->port = null; $uri->port = null;
// Delete all non-numeric characters, non-x characters // Delete all non-numeric characters, commas, and non-x characters
// from phone number, EXCEPT for a leading plus sign. // from phone number, EXCEPT for a leading plus sign.
$uri->path = preg_replace('/(?!^\+)[^\dx]/', '', $uri->path = preg_replace('/(?!^\+)[^\dx,]/', '',
// Normalize e(x)tension to lower-case // Normalize e(x)tension to lower-case
str_replace('X', 'x', $uri->path)); str_replace('X', 'x', rawurldecode($uri->path)));
return true; return true;
} }

View File

@ -261,7 +261,7 @@ class HTMLPurifier_UnitConverter
*/ */
private function round($n, $sigfigs) private function round($n, $sigfigs)
{ {
$new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 $new_log = (int)floor(log(abs((float)$n), 10)); // Number of digits left of decimal - 1
$rp = $sigfigs - $new_log - 1; // Number of decimal places needed $rp = $sigfigs - $new_log - 1; // Number of decimal places needed
$neg = $n < 0 ? '-' : ''; // Negative sign $neg = $n < 0 ? '-' : ''; // Negative sign
if ($this->bcmath) { if ($this->bcmath) {
@ -276,7 +276,7 @@ class HTMLPurifier_UnitConverter
} }
return $n; return $n;
} else { } else {
return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); return $this->scale(round((float)$n, $sigfigs - $new_log - 1), $rp + 1);
} }
} }
@ -300,7 +300,7 @@ class HTMLPurifier_UnitConverter
// Now we return it, truncating the zero that was rounded off. // Now we return it, truncating the zero that was rounded off.
return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); return substr($precise, 0, -1) . str_repeat('0', -$scale + 1);
} }
return sprintf('%.' . $scale . 'f', (float)$r); return number_format((float)$r, $scale, '.', '');
} }
} }

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Hyperf\Framework\ApplicationFactory; use Hyperf\Framework\ApplicationFactory;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
/** /**

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface Castable interface Castable

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface CastsAttributes interface CastsAttributes

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface CastsInboundAttributes interface CastsInboundAttributes

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface CompressInterface interface CompressInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface ConfigInterface interface ConfigInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface ConnectionInterface interface ConnectionInterface

View File

@ -9,9 +9,13 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface as PsrContainerInterface; use Psr\Container\ContainerInterface as PsrContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Throwable;
interface ContainerInterface extends PsrContainerInterface interface ContainerInterface extends PsrContainerInterface
{ {
@ -25,8 +29,8 @@ interface ContainerInterface extends PsrContainerInterface
* @param array $parameters Optional parameters to use to build the entry. Use this to force specific parameters * @param array $parameters Optional parameters to use to build the entry. Use this to force specific parameters
* to specific values. Parameters not defined in this array will be resolved using * to specific values. Parameters not defined in this array will be resolved using
* the container. * the container.
* @throws InvalidArgumentException the name parameter must be of type string * @throws ContainerExceptionInterface&Throwable the name parameter must be of type string
* @throws NotFoundException no entry found for the given name * @throws NotFoundExceptionInterface&Throwable no entry found for the given name
*/ */
public function make(string $name, array $parameters = []); public function make(string $name, array $parameters = []);

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface DispatcherInterface interface DispatcherInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface FrequencyInterface interface FrequencyInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface IPReaderInterface interface IPReaderInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface IdGeneratorInterface interface IdGeneratorInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface JsonDeSerializable interface JsonDeSerializable

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Stringable; use Stringable;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface LengthAwarePaginatorInterface extends PaginatorInterface interface LengthAwarePaginatorInterface extends PaginatorInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface MessageBag interface MessageBag

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface MessageProvider interface MessageProvider

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface MiddlewareInitializerInterface interface MiddlewareInitializerInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use ArrayObject; use ArrayObject;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\Http\Response; use Swoole\Http\Response;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\Http\Request; use Swoole\Http\Request;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\Http\Response; use Swoole\Http\Response;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\Http\Request; use Swoole\Http\Request;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\WebSocket\Server; use Swoole\WebSocket\Server;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Hyperf\Server\Connection as HyperfConnection; use Hyperf\Server\Connection as HyperfConnection;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface OnRequestInterface interface OnRequestInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface PackerInterface interface PackerInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface PaginatorInterface interface PaginatorInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface PoolInterface interface PoolInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface PoolOptionInterface interface PoolOptionInterface
@ -24,4 +25,6 @@ interface PoolOptionInterface
public function getHeartbeat(): float; public function getHeartbeat(): float;
public function getMaxIdleTime(): float; public function getMaxIdleTime(): float;
public function getEvents(): array;
} }

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Swoole\Coroutine\Http\Server as CoHttpServer; use Swoole\Coroutine\Http\Server as CoHttpServer;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use RuntimeException; use RuntimeException;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface Synchronized interface Synchronized

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Countable; use Countable;

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface TranslatorLoaderInterface interface TranslatorLoaderInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface UnCompressInterface interface UnCompressInterface

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
interface ValidatorInterface extends MessageProvider interface ValidatorInterface extends MessageProvider

View File

@ -9,6 +9,7 @@ declare(strict_types=1);
* @contact group@hyperf.io * @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/ */
namespace Hyperf\Contract; namespace Hyperf\Contract;
use Stringable; use Stringable;

View File

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Engine\Contract\Http;
use Stringable;
interface Http
{
public const DEFAULT_PROTOCOL_VERSION = '1.1';
public static function packRequest(string $method, string|Stringable $path, array $headers = [], string|Stringable $body = '', string $protocolVersion = self::DEFAULT_PROTOCOL_VERSION): string;
public static function packResponse(int $statusCode, string $reasonPhrase = '', array $headers = [], string|Stringable $body = '', string $protocolVersion = self::DEFAULT_PROTOCOL_VERSION): string;
}

View File

@ -24,7 +24,7 @@
}, },
"require": { "require": {
"php": ">=8.0", "php": ">=8.0",
"hyperf/engine-contract": "~1.9.0" "hyperf/engine-contract": "~1.10.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.0",
@ -52,7 +52,7 @@
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.10-dev" "dev-master": "2.11-dev"
}, },
"hyperf": { "hyperf": {
"config": "Hyperf\\Engine\\ConfigProvider" "config": "Hyperf\\Engine\\ConfigProvider"

View File

@ -122,7 +122,7 @@ class Coroutine implements CoroutineInterface
return SwooleCo::stats(); return SwooleCo::stats();
} }
public static function exists(int $id = null): bool public static function exists(?int $id = null): bool
{ {
return SwooleCo::exists($id); return SwooleCo::exists($id);
} }

56
vendor/hyperf/engine/src/Http/Http.php vendored Normal file
View File

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Engine\Http;
use Hyperf\Engine\Contract\Http\Http as HttpContract;
use Stringable;
class Http implements HttpContract
{
public static function packRequest(string $method, string|Stringable $path, array $headers = [], string|Stringable $body = '', string $protocolVersion = HttpContract::DEFAULT_PROTOCOL_VERSION): string
{
$headerString = '';
foreach ($headers as $key => $values) {
foreach ((array) $values as $value) {
$headerString .= sprintf("%s: %s\r\n", $key, $value);
}
}
return sprintf(
"%s %s HTTP/%s\r\n%s\r\n%s",
$method,
$path,
$protocolVersion,
$headerString,
$body
);
}
public static function packResponse(int $statusCode, string $reasonPhrase = '', array $headers = [], string|Stringable $body = '', string $protocolVersion = HttpContract::DEFAULT_PROTOCOL_VERSION): string
{
$headerString = '';
foreach ($headers as $key => $values) {
foreach ((array) $values as $value) {
$headerString .= sprintf("%s: %s\r\n", $key, $value);
}
}
return sprintf(
"HTTP/%s %s %s\r\n%s\r\n%s",
$protocolVersion,
$statusCode,
$reasonPhrase,
$headerString,
$body
);
}
}

View File

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Hyperf\Engine\WebSocket; namespace Hyperf\Engine\WebSocket;
use Hyperf\Engine\Contract\WebSocket\WebSocketInterface; use Hyperf\Engine\Contract\WebSocket\WebSocketInterface;
use Psr\Log\LoggerInterface;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\Http\Response; use Swoole\Http\Response;
use Swoole\WebSocket\CloseFrame; use Swoole\WebSocket\CloseFrame;
@ -27,7 +28,7 @@ class WebSocket implements WebSocketInterface
*/ */
protected array $events = []; protected array $events = [];
public function __construct(Response $connection, Request $request) public function __construct(Response $connection, Request $request, protected ?LoggerInterface $logger = null)
{ {
$this->connection = $connection; $this->connection = $connection;
$this->connection->upgrade(); $this->connection->upgrade();
@ -42,7 +43,18 @@ class WebSocket implements WebSocketInterface
{ {
while (true) { while (true) {
/** @var false|string|SwFrame $frame */ /** @var false|string|SwFrame $frame */
$frame = $this->connection->recv(); $frame = $this->connection->recv(-1);
if ($frame === false) {
$this->logger?->warning(
sprintf(
'%s:(%s) %s',
'Websocket recv failed:',
swoole_last_error(),
swoole_strerror(swoole_last_error(), 9)
)
);
}
if ($frame === false || $frame instanceof CloseFrame || $frame === '') { if ($frame === false || $frame instanceof CloseFrame || $frame === '') {
if ($callback = $this->events[static::ON_CLOSE] ?? null) { if ($callback = $this->events[static::ON_CLOSE] ?? null) {
$callback($this->connection, $this->connection->fd); $callback($this->connection, $this->connection->fd);

View File

@ -31,6 +31,7 @@ use Illuminate\Support\Testing\Fakes\NotificationFake;
* @method static void assertCount(int $expectedCount) * @method static void assertCount(int $expectedCount)
* @method static \Illuminate\Support\Collection sent(mixed $notifiable, string $notification, callable|null $callback = null) * @method static \Illuminate\Support\Collection sent(mixed $notifiable, string $notification, callable|null $callback = null)
* @method static bool hasSent(mixed $notifiable, string $notification) * @method static bool hasSent(mixed $notifiable, string $notification)
* @method static \Illuminate\Support\Testing\Fakes\NotificationFake serializeAndRestore(bool $serializeAndRestore = true)
* @method static array sentNotifications() * @method static array sentNotifications()
* @method static void macro(string $name, object|callable $macro) * @method static void macro(string $name, object|callable $macro)
* @method static void mixin(object $mixin, bool $replace = true) * @method static void mixin(object $mixin, bool $replace = true)

View File

@ -6,6 +6,7 @@ use Closure;
use Exception; use Exception;
use Illuminate\Contracts\Notifications\Dispatcher as NotificationDispatcher; use Illuminate\Contracts\Notifications\Dispatcher as NotificationDispatcher;
use Illuminate\Contracts\Notifications\Factory as NotificationFactory; use Illuminate\Contracts\Notifications\Factory as NotificationFactory;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Translation\HasLocalePreference; use Illuminate\Contracts\Translation\HasLocalePreference;
use Illuminate\Notifications\AnonymousNotifiable; use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@ -32,6 +33,13 @@ class NotificationFake implements Fake, NotificationDispatcher, NotificationFact
*/ */
public $locale; public $locale;
/**
* Indicates if notifications should be serialized and restored when pushed to the queue.
*
* @var bool
*/
protected $serializeAndRestore = false;
/** /**
* Assert if a notification was sent on-demand based on a truth-test callback. * Assert if a notification was sent on-demand based on a truth-test callback.
* *
@ -313,7 +321,9 @@ class NotificationFake implements Fake, NotificationDispatcher, NotificationFact
} }
$this->notifications[get_class($notifiable)][$notifiable->getKey()][get_class($notification)][] = [ $this->notifications[get_class($notifiable)][$notifiable->getKey()][get_class($notification)][] = [
'notification' => $notification, 'notification' => $this->serializeAndRestore && $notification instanceof ShouldQueue
? $this->serializeAndRestoreNotification($notification)
: $notification,
'channels' => $notifiableChannels, 'channels' => $notifiableChannels,
'notifiable' => $notifiable, 'notifiable' => $notifiable,
'locale' => $notification->locale ?? $this->locale ?? value(function () use ($notifiable) { 'locale' => $notification->locale ?? $this->locale ?? value(function () use ($notifiable) {
@ -349,6 +359,30 @@ class NotificationFake implements Fake, NotificationDispatcher, NotificationFact
return $this; return $this;
} }
/**
* Specify if notification should be serialized and restored when being "pushed" to the queue.
*
* @param bool $serializeAndRestore
* @return $this
*/
public function serializeAndRestore(bool $serializeAndRestore = true)
{
$this->serializeAndRestore = $serializeAndRestore;
return $this;
}
/**
* Serialize and unserialize the notification to simulate the queueing process.
*
* @param mixed $notification
* @return mixed
*/
protected function serializeAndRestoreNotification($notification)
{
return unserialize(serialize($notification));
}
/** /**
* Get the notifications that have been sent. * Get the notifications that have been sent.
* *

View File

@ -1,3 +1,7 @@
### 2.9.3 (2024-04-12)
* Fixed PHP 8.4 deprecation warnings (#1874)
### 2.9.2 (2023-10-27) ### 2.9.2 (2023-10-27)
* Fixed display_errors parsing in ErrorHandler which did not support string values (#1804) * Fixed display_errors parsing in ErrorHandler which did not support string values (#1804)

View File

@ -27,8 +27,8 @@
"mongodb/mongodb": "^1.8", "mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3", "php-amqplib/php-amqplib": "~2.4 || ^3",
"phpspec/prophecy": "^1.15", "phpspec/prophecy": "^1.15",
"phpstan/phpstan": "^0.12.91", "phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^8.5.14", "phpunit/phpunit": "^8.5.38 || ^9.6.19",
"predis/predis": "^1.1 || ^2.0", "predis/predis": "^1.1 || ^2.0",
"rollbar/rollbar": "^1.3 || ^2 || ^3", "rollbar/rollbar": "^1.3 || ^2 || ^3",
"ruflin/elastica": "^7", "ruflin/elastica": "^7",

View File

@ -30,6 +30,8 @@ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
{ {
$this->useMicroseconds = $useMicroseconds; $this->useMicroseconds = $useMicroseconds;
// if you like to use a custom time to pass to Logger::addRecord directly,
// call modify() or setTimestamp() on this instance to change the date after creating it
parent::__construct('now', $timezone); parent::__construct('now', $timezone);
} }

View File

@ -161,7 +161,7 @@ class FilterHandler extends Handler implements ProcessableHandlerInterface, Rese
* *
* @phpstan-param Record $record * @phpstan-param Record $record
*/ */
public function getHandler(array $record = null) public function getHandler(?array $record = null)
{ {
if (!$this->handler instanceof HandlerInterface) { if (!$this->handler instanceof HandlerInterface) {
$this->handler = ($this->handler)($record, $this); $this->handler = ($this->handler)($record, $this);

View File

@ -210,7 +210,7 @@ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterfa
* *
* @phpstan-param Record $record * @phpstan-param Record $record
*/ */
public function getHandler(array $record = null) public function getHandler(?array $record = null)
{ {
if (!$this->handler instanceof HandlerInterface) { if (!$this->handler instanceof HandlerInterface) {
$this->handler = ($this->handler)($record, $this); $this->handler = ($this->handler)($record, $this);

View File

@ -90,7 +90,7 @@ class SamplingHandler extends AbstractHandler implements ProcessableHandlerInter
* *
* @return HandlerInterface * @return HandlerInterface
*/ */
public function getHandler(array $record = null) public function getHandler(?array $record = null)
{ {
if (!$this->handler instanceof HandlerInterface) { if (!$this->handler instanceof HandlerInterface) {
$this->handler = ($this->handler)($record, $this); $this->handler = ($this->handler)($record, $this);

View File

@ -100,7 +100,7 @@ class SlackRecord
bool $useShortAttachment = false, bool $useShortAttachment = false,
bool $includeContextAndExtra = false, bool $includeContextAndExtra = false,
array $excludeFields = array(), array $excludeFields = array(),
FormatterInterface $formatter = null ?FormatterInterface $formatter = null
) { ) {
$this $this
->setChannel($channel) ->setChannel($channel)

View File

@ -108,9 +108,9 @@ class TelegramBotHandler extends AbstractProcessingHandler
string $channel, string $channel,
$level = Logger::DEBUG, $level = Logger::DEBUG,
bool $bubble = true, bool $bubble = true,
string $parseMode = null, ?string $parseMode = null,
bool $disableWebPagePreview = null, ?bool $disableWebPagePreview = null,
bool $disableNotification = null, ?bool $disableNotification = null,
bool $splitLongMessages = false, bool $splitLongMessages = false,
bool $delayBetweenMessages = false bool $delayBetweenMessages = false
) )
@ -130,7 +130,7 @@ class TelegramBotHandler extends AbstractProcessingHandler
$this->delayBetweenMessages($delayBetweenMessages); $this->delayBetweenMessages($delayBetweenMessages);
} }
public function setParseMode(string $parseMode = null): self public function setParseMode(?string $parseMode = null): self
{ {
if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) { if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) {
throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.'); throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.');
@ -141,14 +141,14 @@ class TelegramBotHandler extends AbstractProcessingHandler
return $this; return $this;
} }
public function disableWebPagePreview(bool $disableWebPagePreview = null): self public function disableWebPagePreview(?bool $disableWebPagePreview = null): self
{ {
$this->disableWebPagePreview = $disableWebPagePreview; $this->disableWebPagePreview = $disableWebPagePreview;
return $this; return $this;
} }
public function disableNotification(bool $disableNotification = null): self public function disableNotification(?bool $disableNotification = null): self
{ {
$this->disableNotification = $disableNotification; $this->disableNotification = $disableNotification;

View File

@ -337,7 +337,7 @@ class Logger implements LoggerInterface, ResettableInterface
* *
* @phpstan-param Level $level * @phpstan-param Level $level
*/ */
public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool public function addRecord(int $level, string $message, array $context = [], ?DateTimeImmutable $datetime = null): bool
{ {
if (isset(self::RFC_5424_LEVELS[$level])) { if (isset(self::RFC_5424_LEVELS[$level])) {
$level = self::RFC_5424_LEVELS[$level]; $level = self::RFC_5424_LEVELS[$level];

View File

@ -43,7 +43,7 @@ class WebProcessor implements ProcessorInterface
* @param array<string, mixed>|\ArrayAccess<string, mixed>|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data * @param array<string, mixed>|\ArrayAccess<string, mixed>|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data
* @param array<string, string>|array<string>|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data * @param array<string, string>|array<string>|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data
*/ */
public function __construct($serverData = null, array $extraFields = null) public function __construct($serverData = null, ?array $extraFields = null)
{ {
if (null === $serverData) { if (null === $serverData) {
$this->serverData = &$_SERVER; $this->serverData = &$_SERVER;

View File

@ -44,7 +44,7 @@ interface CacheInterface
* *
* @throws InvalidArgumentException When $key is not valid or when $beta is negative * @throws InvalidArgumentException When $key is not valid or when $beta is negative
*/ */
public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed; public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed;
/** /**
* Removes an item from the pool. * Removes an item from the pool.

View File

@ -25,7 +25,7 @@ class_exists(InvalidArgumentException::class);
*/ */
trait CacheTrait trait CacheTrait
{ {
public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{ {
return $this->doGet($this, $key, $callback, $beta, $metadata); return $this->doGet($this, $key, $callback, $beta, $metadata);
} }
@ -35,7 +35,7 @@ trait CacheTrait
return $this->deleteItem($key); return $this->deleteItem($key);
} }
private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null): mixed private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed
{ {
if (0 > $beta ??= 1.0) { if (0 > $beta ??= 1.0) {
throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {}; throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {};

View File

@ -25,7 +25,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",

View File

@ -374,10 +374,10 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface
private function isTableMissing(\PDOException $exception): bool private function isTableMissing(\PDOException $exception): bool
{ {
$driver = $this->getDriver(); $driver = $this->getDriver();
$code = $exception->getCode(); [$sqlState, $code] = $exception->errorInfo ?? [null, $exception->getCode()];
return match ($driver) { return match ($driver) {
'pgsql' => '42P01' === $code, 'pgsql' => '42P01' === $sqlState,
'sqlite' => str_contains($exception->getMessage(), 'no such table:'), 'sqlite' => str_contains($exception->getMessage(), 'no such table:'),
'oci' => 942 === $code, 'oci' => 942 === $code,
'sqlsrv' => 208 === $code, 'sqlsrv' => 208 === $code,

View File

@ -81,7 +81,7 @@ class Redis5Proxy extends \Redis implements ResetInterface, LazyObjectInterface
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
} }
public function auth($auth) public function auth(#[\SensitiveParameter] $auth)
{ {
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args());
} }

View File

@ -96,11 +96,6 @@ class Redis6Proxy extends \Redis implements ResetInterface, LazyObjectInterface
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
} }
public function waitaof($numlocal, $numreplicas, $timeout): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->waitaof(...\func_get_args());
}
public function bitcount($key, $start = 0, $end = -1, $bybit = false): \Redis|false|int public function bitcount($key, $start = 0, $end = -1, $bybit = false): \Redis|false|int
{ {
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());

View File

@ -31,7 +31,7 @@ class RedisCluster5Proxy extends \RedisCluster implements ResetInterface, LazyOb
private const LAZY_OBJECT_PROPERTY_SCOPES = []; private const LAZY_OBJECT_PROPERTY_SCOPES = [];
public function __construct($name, $seeds = null, $timeout = null, $read_timeout = null, $persistent = null, $auth = null) public function __construct($name, $seeds = null, $timeout = null, $read_timeout = null, $persistent = null, #[\SensitiveParameter] $auth = null)
{ {
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
} }

View File

@ -96,11 +96,6 @@ class RedisCluster6Proxy extends \RedisCluster implements ResetInterface, LazyOb
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
} }
public function waitaof($key_or_address, $numlocal, $numreplicas, $timeout): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->waitaof(...\func_get_args());
}
public function bgsave($key_or_address): \RedisCluster|bool public function bgsave($key_or_address): \RedisCluster|bool
{ {
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args());

View File

@ -293,7 +293,10 @@ trait RedisTrait
} }
if ((null !== $auth && !$redis->auth($auth)) if ((null !== $auth && !$redis->auth($auth))
|| ($params['dbindex'] && !$redis->select($params['dbindex'])) // Due to a bug in phpredis we must always select the dbindex if persistent pooling is enabled
// @see https://github.com/phpredis/phpredis/issues/1920
// @see https://github.com/symfony/symfony/issues/51578
|| (($params['dbindex'] || ('pconnect' === $connect && '0' !== \ini_get('redis.pconnect.pooling_enabled'))) && !$redis->select($params['dbindex']))
) { ) {
$e = preg_replace('/^ERR /', '', $redis->getLastError()); $e = preg_replace('/^ERR /', '', $redis->getLastError());
throw new InvalidArgumentException('Redis connection failed: '.$e.'.'); throw new InvalidArgumentException('Redis connection failed: '.$e.'.');

View File

@ -183,9 +183,9 @@ final class ProgressBar
$this->messages[$name] = $message; $this->messages[$name] = $message;
} }
public function getMessage(string $name = 'message'): string public function getMessage(string $name = 'message'): ?string
{ {
return $this->messages[$name]; return $this->messages[$name] ?? null;
} }
public function getStartTime(): int public function getStartTime(): int

View File

@ -371,8 +371,9 @@ class Table
if ($headers && !$containsColspan) { if ($headers && !$containsColspan) {
if (0 === $idx) { if (0 === $idx) {
$rows[] = [sprintf( $rows[] = [sprintf(
'<comment>%s</>: %s', '<comment>%s%s</>: %s',
str_pad($headers[$i] ?? '', $maxHeaderLength, ' ', \STR_PAD_LEFT), str_repeat(' ', $maxHeaderLength - Helper::width(Helper::removeDecoration($formatter, $headers[$i] ?? ''))),
$headers[$i] ?? '',
$part $part
)]; )];
} else { } else {

View File

@ -25,7 +25,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",

View File

@ -90,7 +90,7 @@ interface HttpClientInterface
* @param ResponseInterface|iterable<array-key, ResponseInterface> $responses One or more responses created by the current HTTP client * @param ResponseInterface|iterable<array-key, ResponseInterface> $responses One or more responses created by the current HTTP client
* @param float|null $timeout The idle timeout before yielding timeout chunks * @param float|null $timeout The idle timeout before yielding timeout chunks
*/ */
public function stream(ResponseInterface|iterable $responses, float $timeout = null): ResponseStreamInterface; public function stream(ResponseInterface|iterable $responses, ?float $timeout = null): ResponseStreamInterface;
/** /**
* Returns a new instance of the client with new default options. * Returns a new instance of the client with new default options.

View File

@ -105,5 +105,5 @@ interface ResponseInterface
* @return mixed An array of all available info, or one of them when $type is * @return mixed An array of all available info, or one of them when $type is
* provided, or null when an unsupported type is requested * provided, or null when an unsupported type is requested
*/ */
public function getInfo(string $type = null): mixed; public function getInfo(?string $type = null): mixed;
} }

Some files were not shown because too many files have changed in this diff Show More