From bc16757a613f69109d22ac014d7af722e2786590 Mon Sep 17 00:00:00 2001 From: Matt Bonneau Date: Tue, 28 Mar 2017 23:25:19 -0400 Subject: [PATCH] Fixup version check for permessage-deflate --- src/Handshake/ClientNegotiator.php | 14 ++++++++------ src/Handshake/ServerNegotiator.php | 11 ++++++----- src/Messaging/MessageBuffer.php | 18 ++++++------------ tests/ab/fuzzingclient.json | 2 +- tests/ab/fuzzingserver.json | 2 +- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/Handshake/ClientNegotiator.php b/src/Handshake/ClientNegotiator.php index a514eb7..52bcebc 100644 --- a/src/Handshake/ClientNegotiator.php +++ b/src/Handshake/ClientNegotiator.php @@ -26,15 +26,17 @@ class ClientNegotiator { , 'User-Agent' => "Ratchet" ]); - // https://bugs.php.net/bug.php?id=73373 if ($perMessageDeflateOptions === null) { $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled(); } - if ( - version_compare(PHP_VERSION, '7.0.15', '<') - || version_compare(PHP_VERSION, '7.1.0', '=') - || !function_exists('deflate_add') - ) { + + // https://bugs.php.net/bug.php?id=73373 + // https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18 + $supported = version_compare(PHP_VERSION, '7.0.18', '>=') && !version_compare(PHP_VERSION, '7.1.4', '<'); + if (!$supported) { + if ($perMessageDeflateOptions->getDeflate()) { + trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE); + } $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled(); } diff --git a/src/Handshake/ServerNegotiator.php b/src/Handshake/ServerNegotiator.php index 9e72776..3ee7e86 100644 --- a/src/Handshake/ServerNegotiator.php +++ b/src/Handshake/ServerNegotiator.php @@ -22,10 +22,15 @@ class ServerNegotiator implements NegotiatorInterface { public function __construct(RequestVerifier $requestVerifier, $enablePerMessageDeflate = false) { $this->verifier = $requestVerifier; - if ($enablePerMessageDeflate && (version_compare(PHP_VERSION, '7.0.15', '<') || version_compare(PHP_VERSION, '7.1.0', '='))) { + // https://bugs.php.net/bug.php?id=73373 + // https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18 + $supported = version_compare(PHP_VERSION, '7.0.18', '>=') && !version_compare(PHP_VERSION, '7.1.4', '<'); + if ($enablePerMessageDeflate && !$supported) { + trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE); $enablePerMessageDeflate = false; } if ($enablePerMessageDeflate && !function_exists('deflate_add')) { + trigger_error('permessage-deflate is being disabled because you do not have the zlib extension.', E_USER_NOTICE); $enablePerMessageDeflate = false; } @@ -115,10 +120,6 @@ class ServerNegotiator implements NegotiatorInterface { , 'X-Powered-By' => 'Ratchet' ])); - -// $perMessageDeflate = array_filter($request->getHeader('Sec-WebSocket-Extensions'), function ($x) { -// return 'permessage-deflate' === substr($x, 0, strlen('permessage-deflate')); -// }); try { $perMessageDeflateRequest = PermessageDeflateOptions::fromRequestOrResponse($request)[0]; } catch (InvalidPermessageDeflateOptionsException $e) { diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index dbf704c..63e22ff 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -124,8 +124,6 @@ class MessageBuffer { return ''; } } else { - //echo "fin: " . json_encode($this->frameBuffer->isFinal()) . ", bCount: " . $this->messageBuffer->count() . ", Rsv1: " . json_encode($this->frameBuffer->getRsv1()) . "\n"; - if ($this->messageBuffer->count() === 0 && $this->frameBuffer->getRsv1()) { $this->compressedMessage = true; } @@ -338,16 +336,14 @@ class MessageBuffer { private function inflateFrame(Frame $frame) { if ($this->inflator === null) { - $options = [ - 'level' => -1, - 'memory' => 8, - 'window' => $this->getInflateWindowBits(), - 'strategy' => ZLIB_DEFAULT_STRATEGY - ]; - //echo "inflate_init(RAW, " . json_encode($options) . ")\n"; $this->inflator = inflate_init( ZLIB_ENCODING_RAW, - $options + [ + 'level' => -1, + 'memory' => 8, + 'window' => $this->getInflateWindowBits(), + 'strategy' => ZLIB_DEFAULT_STRATEGY + ] ); } @@ -418,8 +414,6 @@ class MessageBuffer { $deflatedFrame->setRsv1(); } - gc_collect_cycles(); // memory runs away if we don't collect ?? - return $deflatedFrame; } } diff --git a/tests/ab/fuzzingclient.json b/tests/ab/fuzzingclient.json index d2fd0d0..0e9fed0 100644 --- a/tests/ab/fuzzingclient.json +++ b/tests/ab/fuzzingclient.json @@ -9,6 +9,6 @@ , "options": {"version": 18} }] , "cases": ["*"] - , "exclude-cases": ["6.4.*", "12.*","13.*"] + , "exclude-cases": [] , "exclude-agent-cases": {} } diff --git a/tests/ab/fuzzingserver.json b/tests/ab/fuzzingserver.json index 0422560..06fa055 100644 --- a/tests/ab/fuzzingserver.json +++ b/tests/ab/fuzzingserver.json @@ -5,6 +5,6 @@ } , "outdir": "./reports/clients" , "cases": ["*"] - , "exclude-cases": ["6.4.*", "12.*", "13.*"] + , "exclude-cases": [] , "exclude-agent-cases": {} }