Server passing tests - client passes most tests - refactoring and API help needed
This commit is contained in:
parent
7280ddcd19
commit
8eed9e7db2
@ -36,7 +36,7 @@ class ClientNegotiator {
|
||||
if ($enablePerMessageDeflate) {
|
||||
$this->defaultHeader = $this->defaultHeader->withAddedHeader(
|
||||
'Sec-WebSocket-Extensions',
|
||||
'permessage-deflate');
|
||||
'permessage-deflate; client_max_window_bits');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -121,7 +121,6 @@ final class PermessageDeflateOptions
|
||||
*/
|
||||
public function getClientNoContextTakeover()
|
||||
{
|
||||
return false; // always return false unless we want to conserve resources
|
||||
return $this->client_no_context_takeover;
|
||||
}
|
||||
|
||||
@ -163,11 +162,9 @@ final class PermessageDeflateOptions
|
||||
if ($this->client_max_window_bits != 15) {
|
||||
$header .= '; client_max_window_bits='. $this->client_max_window_bits;
|
||||
}
|
||||
// this would only be needed if you want to save server resources (no buffer needed)
|
||||
// worse compression
|
||||
// if ($this->client_no_context_takeover) {
|
||||
// $header .= '; client_no_context_takeover';
|
||||
// }
|
||||
if ($this->client_no_context_takeover) {
|
||||
$header .= '; client_no_context_takeover';
|
||||
}
|
||||
if ($this->server_max_window_bits != 15) {
|
||||
$header .= '; server_max_window_bits=' . $this->server_max_window_bits;
|
||||
}
|
||||
@ -175,8 +172,6 @@ final class PermessageDeflateOptions
|
||||
$header .= '; server_no_context_takeover';
|
||||
}
|
||||
|
||||
echo $header . "\n";
|
||||
|
||||
return $response->withAddedHeader('Sec-Websocket-Extensions', $header);
|
||||
}
|
||||
}
|
@ -124,6 +124,8 @@ 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;
|
||||
}
|
||||
@ -305,7 +307,7 @@ class MessageBuffer {
|
||||
|
||||
if ($final) {
|
||||
// reset deflator if client doesn't remember contexts
|
||||
if ($this->permessageDeflateOptions->getClientNoContextTakeover()) {
|
||||
if ($this->getDeflateNoContextTakeover()) {
|
||||
$this->deflator = null;
|
||||
}
|
||||
$this->streamingMessageOpCode = -1;
|
||||
@ -314,17 +316,38 @@ class MessageBuffer {
|
||||
|
||||
private $inflator;
|
||||
|
||||
private function getDeflateNoContextTakeover() {
|
||||
return $this->checkForMask ?
|
||||
$this->permessageDeflateOptions->getServerNoContextTakeover() :
|
||||
$this->permessageDeflateOptions->getClientNoContextTakeover();
|
||||
}
|
||||
|
||||
private function getDeflateWindowBits() {
|
||||
return $this->checkForMask ? $this->permessageDeflateOptions->getServerMaxWindowBits() : $this->permessageDeflateOptions->getClientMaxWindowBits();
|
||||
}
|
||||
|
||||
private function getInflateNoContextTakeover() {
|
||||
return $this->checkForMask ?
|
||||
$this->permessageDeflateOptions->getClientNoContextTakeover() :
|
||||
$this->permessageDeflateOptions->getServerNoContextTakeover();
|
||||
}
|
||||
|
||||
private function getInflateWindowBits() {
|
||||
return $this->checkForMask ? $this->permessageDeflateOptions->getClientMaxWindowBits() : $this->permessageDeflateOptions->getServerMaxWindowBits();
|
||||
}
|
||||
|
||||
private function inflateFrame(Frame $frame) {
|
||||
if ($this->inflator === null) {
|
||||
// $this->inflator = inflate_init(ZLIB_ENCODING_RAW);
|
||||
$this->inflator = inflate_init(
|
||||
ZLIB_ENCODING_RAW,
|
||||
[
|
||||
$options = [
|
||||
'level' => -1,
|
||||
'memory' => 8,
|
||||
'window' => $this->permessageDeflateOptions->getClientMaxWindowBits(),
|
||||
'window' => $this->getInflateWindowBits(),
|
||||
'strategy' => ZLIB_DEFAULT_STRATEGY
|
||||
]
|
||||
];
|
||||
//echo "inflate_init(RAW, " . json_encode($options) . ")\n";
|
||||
$this->inflator = inflate_init(
|
||||
ZLIB_ENCODING_RAW,
|
||||
$options
|
||||
);
|
||||
}
|
||||
|
||||
@ -349,16 +372,12 @@ class MessageBuffer {
|
||||
}
|
||||
|
||||
if ($this->deflator === null) {
|
||||
// $this->deflator = deflate_init(
|
||||
// ZLIB_ENCODING_RAW
|
||||
// );
|
||||
echo "init with " . $this->permessageDeflateOptions->getServerMaxWindowBits();
|
||||
$this->deflator = deflate_init(
|
||||
ZLIB_ENCODING_RAW,
|
||||
[
|
||||
'level' => -1,
|
||||
'memory' => 8,
|
||||
'window' => $this->permessageDeflateOptions->getServerMaxWindowBits(),
|
||||
'window' => $this->getDeflateWindowBits(),
|
||||
'strategy' => ZLIB_DEFAULT_STRATEGY
|
||||
]
|
||||
);
|
||||
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
|
||||
use Ratchet\RFC6455\Handshake\ResponseVerifier;
|
||||
use Ratchet\RFC6455\Messaging\MessageBuffer;
|
||||
use React\Promise\Deferred;
|
||||
@ -20,10 +22,6 @@ $factory = new \React\SocketClient\Connector($loop, $dnsResolver);
|
||||
|
||||
function echoStreamerFactory($conn, $permessageDeflateOptions = null)
|
||||
{
|
||||
if ($permessageDeflateOptions === null) {
|
||||
$permessageDeflateOptions = [];
|
||||
}
|
||||
|
||||
return new \Ratchet\RFC6455\Messaging\MessageBuffer(
|
||||
new \Ratchet\RFC6455\Messaging\CloseFrameChecker,
|
||||
function (\Ratchet\RFC6455\Messaging\MessageInterface $msg, MessageBuffer $messageBuffer) use ($conn) {
|
||||
@ -112,6 +110,7 @@ function runTest($case)
|
||||
|
||||
$factory->create($testServer, 9001)->then(function (\React\Stream\Stream $stream) use ($deferred, $casePath, $case) {
|
||||
$cn = new \Ratchet\RFC6455\Handshake\ClientNegotiator(true);
|
||||
/** @var RequestInterface $cnRequest */
|
||||
$cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $casePath));
|
||||
|
||||
$rawResponse = "";
|
||||
@ -129,15 +128,13 @@ function runTest($case)
|
||||
$response = \GuzzleHttp\Psr7\parse_response($rawResponse);
|
||||
|
||||
if (!$cn->validateResponse($cnRequest, $response)) {
|
||||
echo "Invalid response.\n";
|
||||
$stream->end();
|
||||
$deferred->reject();
|
||||
} else {
|
||||
$ms = echoStreamerFactory(
|
||||
$stream,
|
||||
(new ResponseVerifier())->getPermessageDeflateOptions(
|
||||
$cnRequest->getHeader('Sec-WebSocket-Extensions'),
|
||||
$response->getHeader('Sec-WebSocket-Extensions')
|
||||
)
|
||||
PermessageDeflateOptions::fromRequestOrResponse($response)[0]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,5 @@
|
||||
<?php
|
||||
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
|
||||
use Ratchet\RFC6455\Handshake\RequestVerifier;
|
||||
use Ratchet\RFC6455\Handshake\ResponseVerifier;
|
||||
use Ratchet\RFC6455\Messaging\MessageBuffer;
|
||||
use Ratchet\RFC6455\Messaging\MessageInterface;
|
||||
use Ratchet\RFC6455\Messaging\FrameInterface;
|
||||
|
Loading…
Reference in New Issue
Block a user