Fixup version check for permessage-deflate

This commit is contained in:
Matt Bonneau 2017-03-28 23:25:19 -04:00
parent b84ef8b9ce
commit bc16757a61
5 changed files with 22 additions and 25 deletions

View File

@ -26,15 +26,17 @@ class ClientNegotiator {
, 'User-Agent' => "Ratchet" , 'User-Agent' => "Ratchet"
]); ]);
// https://bugs.php.net/bug.php?id=73373
if ($perMessageDeflateOptions === null) { if ($perMessageDeflateOptions === null) {
$perMessageDeflateOptions = PermessageDeflateOptions::createDisabled(); $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
} }
if (
version_compare(PHP_VERSION, '7.0.15', '<') // https://bugs.php.net/bug.php?id=73373
|| version_compare(PHP_VERSION, '7.1.0', '=') // https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
|| !function_exists('deflate_add') $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(); $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
} }

View File

@ -22,10 +22,15 @@ class ServerNegotiator implements NegotiatorInterface {
public function __construct(RequestVerifier $requestVerifier, $enablePerMessageDeflate = false) { public function __construct(RequestVerifier $requestVerifier, $enablePerMessageDeflate = false) {
$this->verifier = $requestVerifier; $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; $enablePerMessageDeflate = false;
} }
if ($enablePerMessageDeflate && !function_exists('deflate_add')) { 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; $enablePerMessageDeflate = false;
} }
@ -115,10 +120,6 @@ class ServerNegotiator implements NegotiatorInterface {
, 'X-Powered-By' => 'Ratchet' , 'X-Powered-By' => 'Ratchet'
])); ]));
// $perMessageDeflate = array_filter($request->getHeader('Sec-WebSocket-Extensions'), function ($x) {
// return 'permessage-deflate' === substr($x, 0, strlen('permessage-deflate'));
// });
try { try {
$perMessageDeflateRequest = PermessageDeflateOptions::fromRequestOrResponse($request)[0]; $perMessageDeflateRequest = PermessageDeflateOptions::fromRequestOrResponse($request)[0];
} catch (InvalidPermessageDeflateOptionsException $e) { } catch (InvalidPermessageDeflateOptionsException $e) {

View File

@ -124,8 +124,6 @@ class MessageBuffer {
return ''; return '';
} }
} else { } 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()) { if ($this->messageBuffer->count() === 0 && $this->frameBuffer->getRsv1()) {
$this->compressedMessage = true; $this->compressedMessage = true;
} }
@ -338,16 +336,14 @@ class MessageBuffer {
private function inflateFrame(Frame $frame) { private function inflateFrame(Frame $frame) {
if ($this->inflator === null) { if ($this->inflator === null) {
$options = [ $this->inflator = inflate_init(
ZLIB_ENCODING_RAW,
[
'level' => -1, 'level' => -1,
'memory' => 8, 'memory' => 8,
'window' => $this->getInflateWindowBits(), 'window' => $this->getInflateWindowBits(),
'strategy' => ZLIB_DEFAULT_STRATEGY 'strategy' => ZLIB_DEFAULT_STRATEGY
]; ]
//echo "inflate_init(RAW, " . json_encode($options) . ")\n";
$this->inflator = inflate_init(
ZLIB_ENCODING_RAW,
$options
); );
} }
@ -418,8 +414,6 @@ class MessageBuffer {
$deflatedFrame->setRsv1(); $deflatedFrame->setRsv1();
} }
gc_collect_cycles(); // memory runs away if we don't collect ??
return $deflatedFrame; return $deflatedFrame;
} }
} }

View File

@ -9,6 +9,6 @@
, "options": {"version": 18} , "options": {"version": 18}
}] }]
, "cases": ["*"] , "cases": ["*"]
, "exclude-cases": ["6.4.*", "12.*","13.*"] , "exclude-cases": []
, "exclude-agent-cases": {} , "exclude-agent-cases": {}
} }

View File

@ -5,6 +5,6 @@
} }
, "outdir": "./reports/clients" , "outdir": "./reports/clients"
, "cases": ["*"] , "cases": ["*"]
, "exclude-cases": ["6.4.*", "12.*", "13.*"] , "exclude-cases": []
, "exclude-agent-cases": {} , "exclude-agent-cases": {}
} }