Commit inicial con archivos existentes
This commit is contained in:
271
vendor/ratchet/rfc6455/tests/ab/clientRunner.php
vendored
Executable file
271
vendor/ratchet/rfc6455/tests/ab/clientRunner.php
vendored
Executable file
@@ -0,0 +1,271 @@
|
||||
<?php
|
||||
|
||||
use GuzzleHttp\Psr7\Message;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use Ratchet\RFC6455\Handshake\InvalidPermessageDeflateOptionsException;
|
||||
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
|
||||
use Ratchet\RFC6455\Messaging\FrameInterface;
|
||||
use Ratchet\RFC6455\Messaging\MessageBuffer;
|
||||
use Ratchet\RFC6455\Handshake\ClientNegotiator;
|
||||
use Ratchet\RFC6455\Messaging\CloseFrameChecker;
|
||||
use Ratchet\RFC6455\Messaging\MessageInterface;
|
||||
use React\Promise\Deferred;
|
||||
use Ratchet\RFC6455\Messaging\Frame;
|
||||
use React\Promise\PromiseInterface;
|
||||
use GuzzleHttp\Psr7\HttpFactory;
|
||||
use React\Socket\ConnectionInterface;
|
||||
use React\Socket\Connector;
|
||||
|
||||
require __DIR__ . '/../bootstrap.php';
|
||||
|
||||
define('AGENT', 'RatchetRFC/0.4');
|
||||
|
||||
$testServer = $argc > 1 ? $argv[1] : "127.0.0.1";
|
||||
|
||||
$loop = React\EventLoop\Factory::create();
|
||||
|
||||
$connector = new Connector($loop);
|
||||
|
||||
function echoStreamerFactory(ConnectionInterface $conn, ?PermessageDeflateOptions $permessageDeflateOptions = null): MessageBuffer
|
||||
{
|
||||
$permessageDeflateOptions = $permessageDeflateOptions ?: PermessageDeflateOptions::createDisabled();
|
||||
|
||||
return new MessageBuffer(
|
||||
new CloseFrameChecker,
|
||||
static function (MessageInterface $msg, MessageBuffer $messageBuffer) use ($conn): void {
|
||||
$messageBuffer->sendMessage($msg->getPayload(), true, $msg->isBinary());
|
||||
},
|
||||
static function (FrameInterface $frame, MessageBuffer $messageBuffer) use ($conn) {
|
||||
switch ($frame->getOpcode()) {
|
||||
case Frame::OP_PING:
|
||||
return $conn->write((new Frame($frame->getPayload(), true, Frame::OP_PONG))->maskPayload()->getContents());
|
||||
case Frame::OP_CLOSE:
|
||||
return $conn->end((new Frame($frame->getPayload(), true, Frame::OP_CLOSE))->maskPayload()->getContents());
|
||||
}
|
||||
},
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
[$conn, 'write'],
|
||||
$permessageDeflateOptions
|
||||
);
|
||||
}
|
||||
|
||||
function getTestCases(): PromiseInterface {
|
||||
global $testServer;
|
||||
global $connector;
|
||||
|
||||
$deferred = new Deferred();
|
||||
|
||||
$connector->connect($testServer . ':9002')->then(static function (ConnectionInterface $connection) use ($deferred, $testServer): void {
|
||||
$cn = new ClientNegotiator(new HttpFactory());
|
||||
$cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002/getCaseCount'));
|
||||
|
||||
$rawResponse = "";
|
||||
$response = null;
|
||||
|
||||
/** @var MessageBuffer $ms */
|
||||
$ms = null;
|
||||
|
||||
$connection->on('data', static function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest): void {
|
||||
if ($response === null) {
|
||||
$rawResponse .= $data;
|
||||
$pos = strpos($rawResponse, "\r\n\r\n");
|
||||
if ($pos) {
|
||||
$data = substr($rawResponse, $pos + 4);
|
||||
$rawResponse = substr($rawResponse, 0, $pos + 4);
|
||||
$response = Message::parseResponse($rawResponse);
|
||||
|
||||
if (!$cn->validateResponse($cnRequest, $response)) {
|
||||
$connection->end();
|
||||
$deferred->reject();
|
||||
} else {
|
||||
$ms = new MessageBuffer(
|
||||
new CloseFrameChecker,
|
||||
static function (MessageInterface $msg) use ($deferred, $connection): void {
|
||||
$deferred->resolve($msg->getPayload());
|
||||
$connection->close();
|
||||
},
|
||||
null,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
static function (): void {}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// feed the message streamer
|
||||
if ($ms) {
|
||||
$ms->onData($data);
|
||||
}
|
||||
});
|
||||
|
||||
$connection->write(Message::toString($cnRequest));
|
||||
});
|
||||
|
||||
return $deferred->promise();
|
||||
}
|
||||
|
||||
$cn = new ClientNegotiator(
|
||||
new HttpFactory(),
|
||||
PermessageDeflateOptions::permessageDeflateSupported() ? PermessageDeflateOptions::createEnabled() : null);
|
||||
|
||||
function runTest(int $case)
|
||||
{
|
||||
global $connector;
|
||||
global $testServer;
|
||||
global $cn;
|
||||
|
||||
$casePath = "/runCase?case={$case}&agent=" . AGENT;
|
||||
|
||||
$deferred = new Deferred();
|
||||
|
||||
$connector->connect($testServer . ':9002')->then(static function (ConnectionInterface $connection) use ($deferred, $casePath, $case, $testServer): void {
|
||||
$cn = new ClientNegotiator(
|
||||
new HttpFactory(),
|
||||
PermessageDeflateOptions::permessageDeflateSupported() ? PermessageDeflateOptions::createEnabled() : null);
|
||||
$cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002' . $casePath));
|
||||
|
||||
$rawResponse = "";
|
||||
$response = null;
|
||||
|
||||
$ms = null;
|
||||
|
||||
$connection->on('data', static function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest): void {
|
||||
if ($response === null) {
|
||||
$rawResponse .= $data;
|
||||
$pos = strpos($rawResponse, "\r\n\r\n");
|
||||
if ($pos) {
|
||||
$data = substr($rawResponse, $pos + 4);
|
||||
$rawResponse = substr($rawResponse, 0, $pos + 4);
|
||||
$response = Message::parseResponse($rawResponse);
|
||||
|
||||
if (!$cn->validateResponse($cnRequest, $response)) {
|
||||
echo "Invalid response.\n";
|
||||
$connection->end();
|
||||
$deferred->reject();
|
||||
} else {
|
||||
try {
|
||||
$permessageDeflateOptions = PermessageDeflateOptions::fromRequestOrResponse($response)[0];
|
||||
$ms = echoStreamerFactory(
|
||||
$connection,
|
||||
$permessageDeflateOptions
|
||||
);
|
||||
} catch (InvalidPermessageDeflateOptionsException $e) {
|
||||
$connection->end();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// feed the message streamer
|
||||
if ($ms) {
|
||||
$ms->onData($data);
|
||||
}
|
||||
});
|
||||
|
||||
$connection->on('close', static function () use ($deferred): void {
|
||||
$deferred->resolve(null);
|
||||
});
|
||||
|
||||
$connection->write(Message::toString($cnRequest));
|
||||
});
|
||||
|
||||
return $deferred->promise();
|
||||
}
|
||||
|
||||
function createReport(): PromiseInterface {
|
||||
global $connector;
|
||||
global $testServer;
|
||||
|
||||
$deferred = new Deferred();
|
||||
|
||||
$connector->connect($testServer . ':9002')->then(static function (ConnectionInterface $connection) use ($deferred, $testServer): void {
|
||||
// $reportPath = "/updateReports?agent=" . AGENT . "&shutdownOnComplete=true";
|
||||
// we will stop it using docker now instead of just shutting down
|
||||
$reportPath = "/updateReports?agent=" . AGENT;
|
||||
$cn = new ClientNegotiator(new HttpFactory());
|
||||
$cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002' . $reportPath));
|
||||
|
||||
$rawResponse = "";
|
||||
$response = null;
|
||||
|
||||
/** @var MessageBuffer $ms */
|
||||
$ms = null;
|
||||
|
||||
$connection->on('data', static function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest): void {
|
||||
if ($response === null) {
|
||||
$rawResponse .= $data;
|
||||
$pos = strpos($rawResponse, "\r\n\r\n");
|
||||
if ($pos) {
|
||||
$data = substr($rawResponse, $pos + 4);
|
||||
$rawResponse = substr($rawResponse, 0, $pos + 4);
|
||||
$response = Message::parseResponse($rawResponse);
|
||||
|
||||
if (!$cn->validateResponse($cnRequest, $response)) {
|
||||
$connection->end();
|
||||
$deferred->reject();
|
||||
} else {
|
||||
$ms = new MessageBuffer(
|
||||
new CloseFrameChecker,
|
||||
static function (MessageInterface $msg) use ($deferred, $connection): void {
|
||||
$deferred->resolve($msg->getPayload());
|
||||
$connection->close();
|
||||
},
|
||||
null,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
static function (): void {}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// feed the message streamer
|
||||
if ($ms) {
|
||||
$ms->onData($data);
|
||||
}
|
||||
});
|
||||
|
||||
$connection->write(Message::toString($cnRequest));
|
||||
});
|
||||
|
||||
return $deferred->promise();
|
||||
}
|
||||
|
||||
|
||||
$testPromises = [];
|
||||
|
||||
getTestCases()->then(function ($count) use ($loop) {
|
||||
$allDeferred = new Deferred();
|
||||
|
||||
$runNextCase = static function () use (&$i, &$runNextCase, $count, $allDeferred): void {
|
||||
$i++;
|
||||
if ($i > $count) {
|
||||
$allDeferred->resolve(null);
|
||||
return;
|
||||
}
|
||||
echo "Running test $i/$count...";
|
||||
$startTime = microtime(true);
|
||||
runTest($i)
|
||||
->then(static function () use ($startTime): void {
|
||||
echo " completed " . round((microtime(true) - $startTime) * 1000) . " ms\n";
|
||||
})
|
||||
->then($runNextCase);
|
||||
};
|
||||
|
||||
$i = 0;
|
||||
$runNextCase();
|
||||
|
||||
$allDeferred->promise()->then(static function (): void {
|
||||
createReport();
|
||||
});
|
||||
});
|
||||
|
||||
$loop->run();
|
||||
12
vendor/ratchet/rfc6455/tests/ab/docker_bootstrap.sh
vendored
Executable file
12
vendor/ratchet/rfc6455/tests/ab/docker_bootstrap.sh
vendored
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
set -x
|
||||
|
||||
echo "Running $0"
|
||||
|
||||
echo Adding "$1 host.ratchet.internal" to /etc/hosts file
|
||||
|
||||
echo $1 host.ratchet.internal >> /etc/hosts
|
||||
|
||||
echo /etc/hosts contains:
|
||||
cat /etc/hosts
|
||||
echo
|
||||
16
vendor/ratchet/rfc6455/tests/ab/fuzzingclient.json
vendored
Executable file
16
vendor/ratchet/rfc6455/tests/ab/fuzzingclient.json
vendored
Executable file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"options": {
|
||||
"failByDrop": false
|
||||
}
|
||||
, "outdir": "/reports/servers"
|
||||
, "servers": [{
|
||||
"agent": "RatchetRFC/0.4"
|
||||
, "url": "ws://host.ratchet.internal:9001"
|
||||
, "options": {"version": 18}
|
||||
}]
|
||||
, "cases": [
|
||||
"*"
|
||||
]
|
||||
, "exclude-cases": []
|
||||
, "exclude-agent-cases": {}
|
||||
}
|
||||
14
vendor/ratchet/rfc6455/tests/ab/fuzzingclient_skip_deflate.json
vendored
Executable file
14
vendor/ratchet/rfc6455/tests/ab/fuzzingclient_skip_deflate.json
vendored
Executable file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"options": {
|
||||
"failByDrop": false
|
||||
}
|
||||
, "outdir": "/reports/servers"
|
||||
, "servers": [{
|
||||
"agent": "RatchetRFC/0.4"
|
||||
, "url": "ws://host.ratchet.internal:9001"
|
||||
, "options": {"version": 18}
|
||||
}]
|
||||
, "cases": ["*"]
|
||||
, "exclude-cases": ["12.*", "13.*"]
|
||||
, "exclude-agent-cases": {}
|
||||
}
|
||||
12
vendor/ratchet/rfc6455/tests/ab/fuzzingserver.json
vendored
Executable file
12
vendor/ratchet/rfc6455/tests/ab/fuzzingserver.json
vendored
Executable file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"url": "ws://127.0.0.1:9002"
|
||||
, "options": {
|
||||
"failByDrop": false
|
||||
}
|
||||
, "outdir": "./reports/clients"
|
||||
, "cases": [
|
||||
"*"
|
||||
]
|
||||
, "exclude-cases": []
|
||||
, "exclude-agent-cases": {}
|
||||
}
|
||||
10
vendor/ratchet/rfc6455/tests/ab/fuzzingserver_skip_deflate.json
vendored
Executable file
10
vendor/ratchet/rfc6455/tests/ab/fuzzingserver_skip_deflate.json
vendored
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"url": "ws://127.0.0.1:9002"
|
||||
, "options": {
|
||||
"failByDrop": false
|
||||
}
|
||||
, "outdir": "./reports/clients"
|
||||
, "cases": ["*"]
|
||||
, "exclude-cases": ["12.*", "13.*"]
|
||||
, "exclude-agent-cases": {}
|
||||
}
|
||||
48
vendor/ratchet/rfc6455/tests/ab/run_ab_tests.sh
vendored
Executable file
48
vendor/ratchet/rfc6455/tests/ab/run_ab_tests.sh
vendored
Executable file
@@ -0,0 +1,48 @@
|
||||
set -x
|
||||
cd tests/ab
|
||||
|
||||
if [ "$ABTEST" = "client" ]; then
|
||||
docker run --rm \
|
||||
-d \
|
||||
-v ${PWD}:/config \
|
||||
-v ${PWD}/reports:/reports \
|
||||
-p 9002:9002 \
|
||||
--name fuzzingserver \
|
||||
crossbario/autobahn-testsuite wstest -m fuzzingserver -s /config/fuzzingserver$SKIP_DEFLATE.json
|
||||
sleep 5
|
||||
if [ "$TRAVIS" != "true" ]; then
|
||||
echo "Running tests vs Autobahn test client"
|
||||
###docker run -it --rm --name abpytest crossbario/autobahn-testsuite wstest --mode testeeclient -w ws://host.docker.internal:9002
|
||||
fi
|
||||
php -d memory_limit=256M clientRunner.php
|
||||
|
||||
docker ps -a
|
||||
|
||||
docker logs fuzzingserver
|
||||
|
||||
docker stop fuzzingserver
|
||||
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
if [ "$ABTEST" = "server" ]; then
|
||||
php -d memory_limit=256M startServer.php &
|
||||
sleep 3
|
||||
|
||||
if [ "$OSTYPE" = "linux-gnu" ]; then
|
||||
IPADDR=`hostname -I | cut -f 1 -d ' '`
|
||||
else
|
||||
IPADDR=`ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}' | head -1 | tr -d 'adr:'`
|
||||
fi
|
||||
|
||||
docker run --rm \
|
||||
-i \
|
||||
-v ${PWD}:/config \
|
||||
-v ${PWD}/reports:/reports \
|
||||
--name fuzzingclient \
|
||||
crossbario/autobahn-testsuite /bin/sh -c "sh /config/docker_bootstrap.sh $IPADDR; wstest -m fuzzingclient -s /config/fuzzingclient$SKIP_DEFLATE.json"
|
||||
sleep 1
|
||||
|
||||
# send the shutdown command to the PHP echo server
|
||||
wget -O - -q http://127.0.0.1:9001/shutdown
|
||||
fi
|
||||
93
vendor/ratchet/rfc6455/tests/ab/startServer.php
vendored
Executable file
93
vendor/ratchet/rfc6455/tests/ab/startServer.php
vendored
Executable file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
use GuzzleHttp\Psr7\Message;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
|
||||
use Ratchet\RFC6455\Handshake\RequestVerifier;
|
||||
use Ratchet\RFC6455\Handshake\ServerNegotiator;
|
||||
use Ratchet\RFC6455\Messaging\CloseFrameChecker;
|
||||
use Ratchet\RFC6455\Messaging\MessageBuffer;
|
||||
use Ratchet\RFC6455\Messaging\MessageInterface;
|
||||
use Ratchet\RFC6455\Messaging\FrameInterface;
|
||||
use Ratchet\RFC6455\Messaging\Frame;
|
||||
use GuzzleHttp\Psr7\HttpFactory;
|
||||
|
||||
require_once __DIR__ . "/../bootstrap.php";
|
||||
|
||||
$loop = \React\EventLoop\Factory::create();
|
||||
|
||||
$socket = new \React\Socket\Server('0.0.0.0:9001', $loop);
|
||||
|
||||
$closeFrameChecker = new CloseFrameChecker;
|
||||
|
||||
$negotiator = new ServerNegotiator(
|
||||
new RequestVerifier,
|
||||
new HttpFactory(),
|
||||
PermessageDeflateOptions::permessageDeflateSupported()
|
||||
);
|
||||
|
||||
$uException = new \UnderflowException;
|
||||
|
||||
|
||||
$socket->on('connection', static function (React\Socket\ConnectionInterface $connection) use ($negotiator, $closeFrameChecker, $uException, $socket): void {
|
||||
$headerComplete = false;
|
||||
$buffer = '';
|
||||
$parser = null;
|
||||
$connection->on('data', static function ($data) use ($connection, &$parser, &$headerComplete, &$buffer, $negotiator, $closeFrameChecker, $uException, $socket): void {
|
||||
if ($headerComplete) {
|
||||
$parser->onData($data);
|
||||
return;
|
||||
}
|
||||
|
||||
$buffer .= $data;
|
||||
$parts = explode("\r\n\r\n", $buffer);
|
||||
if (count($parts) < 2) {
|
||||
return;
|
||||
}
|
||||
$headerComplete = true;
|
||||
$psrRequest = Message::parseRequest($parts[0] . "\r\n\r\n");
|
||||
$negotiatorResponse = $negotiator->handshake($psrRequest);
|
||||
|
||||
$negotiatorResponse = $negotiatorResponse->withAddedHeader("Content-Length", "0");
|
||||
|
||||
if ($negotiatorResponse->getStatusCode() !== 101 && $psrRequest->getUri()->getPath() === '/shutdown') {
|
||||
$connection->end(Message::toString(new Response(200, [], 'Shutting down echo server.' . PHP_EOL)));
|
||||
$socket->close();
|
||||
return;
|
||||
};
|
||||
|
||||
$connection->write(Message::toString($negotiatorResponse));
|
||||
|
||||
if ($negotiatorResponse->getStatusCode() !== 101) {
|
||||
$connection->end();
|
||||
return;
|
||||
}
|
||||
|
||||
// there is no need to look through the client requests
|
||||
// we support any valid permessage deflate
|
||||
$deflateOptions = PermessageDeflateOptions::fromRequestOrResponse($psrRequest)[0];
|
||||
|
||||
$parser = new MessageBuffer($closeFrameChecker,
|
||||
static function (MessageInterface $message, MessageBuffer $messageBuffer): void {
|
||||
$messageBuffer->sendMessage($message->getPayload(), true, $message->isBinary());
|
||||
}, static function (FrameInterface $frame) use ($connection, &$parser): void {
|
||||
switch ($frame->getOpCode()) {
|
||||
case Frame::OP_CLOSE:
|
||||
$connection->end($frame->getContents());
|
||||
break;
|
||||
case Frame::OP_PING:
|
||||
$connection->write($parser->newFrame($frame->getPayload(), true, Frame::OP_PONG)->getContents());
|
||||
break;
|
||||
}
|
||||
}, true, static fn (): \Exception => $uException,
|
||||
null,
|
||||
null,
|
||||
[$connection, 'write'],
|
||||
$deflateOptions);
|
||||
|
||||
array_shift($parts);
|
||||
$parser->onData(implode("\r\n\r\n", $parts));
|
||||
});
|
||||
});
|
||||
|
||||
$loop->run();
|
||||
Reference in New Issue
Block a user