From b6eebb555b002f41741297bc5ec5aa6e478e23dc Mon Sep 17 00:00:00 2001 From: Erik Niebla Date: Wed, 1 Dec 2021 13:59:17 +0000 Subject: [PATCH 1/8] Support for PSR7 2.x --- composer.json | 2 +- tests/ab/clientRunner.php | 14 ++++++++------ tests/ab/startServer.php | 7 ++++--- tests/unit/Handshake/ServerNegotiatorTest.php | 15 ++++++++------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index 0416b58..a43a6b3 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ }, "require": { "php": ">=5.4.2", - "guzzlehttp/psr7": "^1.0" + "guzzlehttp/psr7": "^1.7|^2.0" }, "require-dev": { "phpunit/phpunit": "5.7.*", diff --git a/tests/ab/clientRunner.php b/tests/ab/clientRunner.php index 8dd964b..a4b9721 100644 --- a/tests/ab/clientRunner.php +++ b/tests/ab/clientRunner.php @@ -1,4 +1,6 @@ validateResponse($cnRequest, $response)) { $connection->end(); @@ -101,7 +103,7 @@ function getTestCases() { } }); - $connection->write(\GuzzleHttp\Psr7\str($cnRequest)); + $connection->write(Message::toString($cnRequest)); }); return $deferred->promise(); @@ -137,7 +139,7 @@ function runTest($case) if ($pos) { $data = substr($rawResponse, $pos + 4); $rawResponse = substr($rawResponse, 0, $pos + 4); - $response = \GuzzleHttp\Psr7\parse_response($rawResponse); + $response = Message::parseResponse($rawResponse); if (!$cn->validateResponse($cnRequest, $response)) { echo "Invalid response.\n"; @@ -167,7 +169,7 @@ function runTest($case) $deferred->resolve(); }); - $connection->write(\GuzzleHttp\Psr7\str($cnRequest)); + $connection->write(Message::toString($cnRequest)); }); return $deferred->promise(); @@ -199,7 +201,7 @@ function createReport() { if ($pos) { $data = substr($rawResponse, $pos + 4); $rawResponse = substr($rawResponse, 0, $pos + 4); - $response = \GuzzleHttp\Psr7\parse_response($rawResponse); + $response = Message::parseResponse($rawResponse); if (!$cn->validateResponse($cnRequest, $response)) { $connection->end(); @@ -228,7 +230,7 @@ function createReport() { } }); - $connection->write(\GuzzleHttp\Psr7\str($cnRequest)); + $connection->write(Message::toString($cnRequest)); }); return $deferred->promise(); diff --git a/tests/ab/startServer.php b/tests/ab/startServer.php index f1d3b66..7c169c6 100644 --- a/tests/ab/startServer.php +++ b/tests/ab/startServer.php @@ -1,5 +1,6 @@ on('connection', function (React\Socket\ConnectionInterface $connection return; } $headerComplete = true; - $psrRequest = \GuzzleHttp\Psr7\parse_request($parts[0] . "\r\n\r\n"); + $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(\GuzzleHttp\Psr7\str(new Response(200, [], 'Shutting down echo server.' . PHP_EOL))); + $connection->end(Message::toString(new Response(200, [], 'Shutting down echo server.' . PHP_EOL))); $socket->close(); return; }; - $connection->write(\GuzzleHttp\Psr7\str($negotiatorResponse)); + $connection->write(Message::toString($negotiatorResponse)); if ($negotiatorResponse->getStatusCode() !== 101) { $connection->end(); diff --git a/tests/unit/Handshake/ServerNegotiatorTest.php b/tests/unit/Handshake/ServerNegotiatorTest.php index c08b9f3..720bdf9 100644 --- a/tests/unit/Handshake/ServerNegotiatorTest.php +++ b/tests/unit/Handshake/ServerNegotiatorTest.php @@ -2,6 +2,7 @@ namespace Ratchet\RFC6455\Test\Unit\Handshake; +use GuzzleHttp\Psr7\Message; use Ratchet\RFC6455\Handshake\RequestVerifier; use Ratchet\RFC6455\Handshake\ServerNegotiator; use PHPUnit\Framework\TestCase; @@ -24,7 +25,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -53,7 +54,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -80,7 +81,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -107,7 +108,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -141,7 +142,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -175,7 +176,7 @@ Accept-Language: en-US,en;q=0.8 '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); @@ -205,7 +206,7 @@ Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits '; - $request = \GuzzleHttp\Psr7\parse_request($requestText); + $request = Message::parseRequest($requestText); $response = $negotiator->handshake($request); From d5c0684ab4e561cc4d2a6f3dd1deaf0b5c8f1898 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sun, 5 Dec 2021 11:58:52 -0500 Subject: [PATCH 2/8] Update AB test runners Use variable to connect in clientRunner Use new(ish) `host.docker.internal` address provided by Docker to connect to host machine Run client tests port 9002 so suites can be run concurrently --- composer.json | 2 +- tests/ab/clientRunner.php | 14 +++++++------- tests/ab/docker_bootstrap.sh | 12 ------------ tests/ab/fuzzingclient.json | 2 +- tests/ab/fuzzingclient_skip_deflate.json | 2 +- tests/ab/fuzzingserver.json | 2 +- tests/ab/fuzzingserver_skip_deflate.json | 2 +- tests/ab/run_ab_tests.sh | 6 +++--- 8 files changed, 15 insertions(+), 27 deletions(-) delete mode 100644 tests/ab/docker_bootstrap.sh diff --git a/composer.json b/composer.json index 0416b58..2ef015d 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "guzzlehttp/psr7": "^1.0" }, "require-dev": { - "phpunit/phpunit": "5.7.*", + "phpunit/phpunit": "^5.7", "react/socket": "^1.3" }, "scripts": { diff --git a/tests/ab/clientRunner.php b/tests/ab/clientRunner.php index 8dd964b..cfc534f 100644 --- a/tests/ab/clientRunner.php +++ b/tests/ab/clientRunner.php @@ -15,7 +15,7 @@ require __DIR__ . '/../bootstrap.php'; define('AGENT', 'RatchetRFC/0.3'); -$testServer = "127.0.0.1"; +$testServer = "host.docker.internal"; $loop = React\EventLoop\Factory::create(); @@ -55,9 +55,9 @@ function getTestCases() { $deferred = new Deferred(); - $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred) { + $connector->connect($testServer . ':9002')->then(function (ConnectionInterface $connection) use ($deferred, $testServer) { $cn = new ClientNegotiator(); - $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001/getCaseCount')); + $cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002/getCaseCount')); $rawResponse = ""; $response = null; @@ -120,10 +120,10 @@ function runTest($case) $deferred = new Deferred(); - $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred, $casePath, $case) { + $connector->connect($testServer . ':9002')->then(function (ConnectionInterface $connection) use ($deferred, $casePath, $case, $testServer) { $cn = new ClientNegotiator( PermessageDeflateOptions::permessageDeflateSupported() ? PermessageDeflateOptions::createEnabled() : null); - $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $casePath)); + $cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002' . $casePath)); $rawResponse = ""; $response = null; @@ -179,12 +179,12 @@ function createReport() { $deferred = new Deferred(); - $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred) { + $connector->connect($testServer . ':9002')->then(function (ConnectionInterface $connection) use ($deferred, $testServer) { // $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(); - $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $reportPath)); + $cnRequest = $cn->generateRequest(new Uri('ws://' . $testServer . ':9002' . $reportPath)); $rawResponse = ""; $response = null; diff --git a/tests/ab/docker_bootstrap.sh b/tests/ab/docker_bootstrap.sh deleted file mode 100644 index 44d4581..0000000 --- a/tests/ab/docker_bootstrap.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/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 diff --git a/tests/ab/fuzzingclient.json b/tests/ab/fuzzingclient.json index d410be3..b8d34d0 100644 --- a/tests/ab/fuzzingclient.json +++ b/tests/ab/fuzzingclient.json @@ -5,7 +5,7 @@ , "outdir": "/reports/servers" , "servers": [{ "agent": "RatchetRFC/0.3" - , "url": "ws://host.ratchet.internal:9001" + , "url": "ws://host.docker.internal:9001" , "options": {"version": 18} }] , "cases": [ diff --git a/tests/ab/fuzzingclient_skip_deflate.json b/tests/ab/fuzzingclient_skip_deflate.json index b1fddbe..5031b34 100644 --- a/tests/ab/fuzzingclient_skip_deflate.json +++ b/tests/ab/fuzzingclient_skip_deflate.json @@ -5,7 +5,7 @@ , "outdir": "/reports/servers" , "servers": [{ "agent": "RatchetRFC/0.3" - , "url": "ws://host.ratchet.internal:9001" + , "url": "ws://host.docker.internal:9001" , "options": {"version": 18} }] , "cases": ["*"] diff --git a/tests/ab/fuzzingserver.json b/tests/ab/fuzzingserver.json index 3a59bab..9f10403 100644 --- a/tests/ab/fuzzingserver.json +++ b/tests/ab/fuzzingserver.json @@ -1,5 +1,5 @@ { - "url": "ws://127.0.0.1:9001" + "url": "ws://127.0.0.1:9002" , "options": { "failByDrop": false } diff --git a/tests/ab/fuzzingserver_skip_deflate.json b/tests/ab/fuzzingserver_skip_deflate.json index 3b90fc3..9323191 100644 --- a/tests/ab/fuzzingserver_skip_deflate.json +++ b/tests/ab/fuzzingserver_skip_deflate.json @@ -1,5 +1,5 @@ { - "url": "ws://127.0.0.1:9001" + "url": "ws://127.0.0.1:9002" , "options": { "failByDrop": false } diff --git a/tests/ab/run_ab_tests.sh b/tests/ab/run_ab_tests.sh index b924480..65ae3a4 100644 --- a/tests/ab/run_ab_tests.sh +++ b/tests/ab/run_ab_tests.sh @@ -14,13 +14,13 @@ if [ "$ABTEST" = "client" ]; then -d \ -v ${PWD}:/config \ -v ${PWD}/reports:/reports \ - -p 9001:9001 \ + -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:9001 + ###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 @@ -48,7 +48,7 @@ if [ "$ABTEST" = "server" ]; then -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" + crossbario/autobahn-testsuite /bin/sh -c "wstest -m fuzzingclient -s /config/fuzzingclient$SKIP_DEFLATE.json" sleep 1 # send the shutdown command to the PHP echo server From 1c6e6ed0870f06c01175102438a73a67af75b831 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sun, 5 Dec 2021 17:04:01 -0500 Subject: [PATCH 3/8] Rever use of host.docker.internal It's only supported on macOS --- tests/ab/clientRunner.php | 2 +- tests/ab/docker_bootstrap.sh | 12 ++++++++++++ tests/ab/fuzzingclient.json | 2 +- tests/ab/fuzzingclient_skip_deflate.json | 2 +- tests/ab/run_ab_tests.sh | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 tests/ab/docker_bootstrap.sh diff --git a/tests/ab/clientRunner.php b/tests/ab/clientRunner.php index cfc534f..f38a075 100644 --- a/tests/ab/clientRunner.php +++ b/tests/ab/clientRunner.php @@ -15,7 +15,7 @@ require __DIR__ . '/../bootstrap.php'; define('AGENT', 'RatchetRFC/0.3'); -$testServer = "host.docker.internal"; +$testServer = $argc > 1 ? $argv[1] : "127.0.0.1"; $loop = React\EventLoop\Factory::create(); diff --git a/tests/ab/docker_bootstrap.sh b/tests/ab/docker_bootstrap.sh new file mode 100644 index 0000000..44d4581 --- /dev/null +++ b/tests/ab/docker_bootstrap.sh @@ -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 diff --git a/tests/ab/fuzzingclient.json b/tests/ab/fuzzingclient.json index b8d34d0..d410be3 100644 --- a/tests/ab/fuzzingclient.json +++ b/tests/ab/fuzzingclient.json @@ -5,7 +5,7 @@ , "outdir": "/reports/servers" , "servers": [{ "agent": "RatchetRFC/0.3" - , "url": "ws://host.docker.internal:9001" + , "url": "ws://host.ratchet.internal:9001" , "options": {"version": 18} }] , "cases": [ diff --git a/tests/ab/fuzzingclient_skip_deflate.json b/tests/ab/fuzzingclient_skip_deflate.json index 5031b34..b1fddbe 100644 --- a/tests/ab/fuzzingclient_skip_deflate.json +++ b/tests/ab/fuzzingclient_skip_deflate.json @@ -5,7 +5,7 @@ , "outdir": "/reports/servers" , "servers": [{ "agent": "RatchetRFC/0.3" - , "url": "ws://host.docker.internal:9001" + , "url": "ws://host.ratchet.internal:9001" , "options": {"version": 18} }] , "cases": ["*"] diff --git a/tests/ab/run_ab_tests.sh b/tests/ab/run_ab_tests.sh index 65ae3a4..1d8d0c1 100644 --- a/tests/ab/run_ab_tests.sh +++ b/tests/ab/run_ab_tests.sh @@ -48,7 +48,7 @@ if [ "$ABTEST" = "server" ]; then -v ${PWD}:/config \ -v ${PWD}/reports:/reports \ --name fuzzingclient \ - crossbario/autobahn-testsuite /bin/sh -c "wstest -m fuzzingclient -s /config/fuzzingclient$SKIP_DEFLATE.json" + 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 From 4835534e745cfecd5e8064f0498f3cbdcfecf362 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sun, 5 Dec 2021 17:12:49 -0500 Subject: [PATCH 4/8] Ensure max[Message|Frame]PayloadSize is int if auto-set fixes #41 --- src/Messaging/MessageBuffer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index d761786..48bcd42 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -117,10 +117,10 @@ class MessageBuffer { $memory_limit_bytes = static::getMemoryLimit(); if ($maxMessagePayloadSize === null) { - $maxMessagePayloadSize = $memory_limit_bytes / 4; + $maxMessagePayloadSize = intval($memory_limit_bytes / 4); } if ($maxFramePayloadSize === null) { - $maxFramePayloadSize = $memory_limit_bytes / 4; + $maxFramePayloadSize = intval($memory_limit_bytes / 4); } if (!is_int($maxFramePayloadSize) || $maxFramePayloadSize > 0x7FFFFFFFFFFFFFFF || $maxFramePayloadSize < 0) { // this should be interesting on non-64 bit systems From 5ce83bb58a023353daa1f80609a15ce7bb4c5025 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sun, 5 Dec 2021 20:02:16 -0500 Subject: [PATCH 5/8] change int syntax --- src/Messaging/MessageBuffer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index 48bcd42..e5d197b 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -117,10 +117,10 @@ class MessageBuffer { $memory_limit_bytes = static::getMemoryLimit(); if ($maxMessagePayloadSize === null) { - $maxMessagePayloadSize = intval($memory_limit_bytes / 4); + $maxMessagePayloadSize = (int)($memory_limit_bytes / 4); } if ($maxFramePayloadSize === null) { - $maxFramePayloadSize = intval($memory_limit_bytes / 4); + $maxFramePayloadSize = (int)($memory_limit_bytes / 4); } if (!is_int($maxFramePayloadSize) || $maxFramePayloadSize > 0x7FFFFFFFFFFFFFFF || $maxFramePayloadSize < 0) { // this should be interesting on non-64 bit systems From 04bc8618a3d90a56e6121e5d40019081233d1543 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Mon, 6 Dec 2021 12:32:41 -0500 Subject: [PATCH 6/8] Update composer.json Co-authored-by: Cees-Jan Kiewiet --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a43a6b3..cd789b4 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ }, "require": { "php": ">=5.4.2", - "guzzlehttp/psr7": "^1.7|^2.0" + "guzzlehttp/psr7": "^2 || ^1.7" }, "require-dev": { "phpunit/phpunit": "5.7.*", From 09bdf3bbce618062a5ecccb882b53133e75182f2 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Thu, 9 Dec 2021 16:39:04 -0500 Subject: [PATCH 7/8] Remove unreachable code --- src/Messaging/Frame.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Messaging/Frame.php b/src/Messaging/Frame.php index 24b491e..63da6d2 100644 --- a/src/Messaging/Frame.php +++ b/src/Messaging/Frame.php @@ -327,15 +327,6 @@ class Frame implements FrameInterface { } return $payload ^ str_pad('', $len, $maskingKey, STR_PAD_RIGHT); - - // TODO: Remove this before publish - keeping methods here to compare performance (above is faster but need control against v0.3.3) - - $applied = ''; - for ($i = 0, $len = strlen($payload); $i < $len; $i++) { - $applied .= $payload[$i] ^ $maskingKey[$i % static::MASK_LENGTH]; - } - - return $applied; } /** From be65d566539f8759212c14da3c3d526d71825970 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Thu, 9 Dec 2021 17:45:24 -0500 Subject: [PATCH 8/8] Update license file with only start date --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 7f8c128..52b4aef 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2016 Chris Boden +Copyright (c) 2011 Chris Boden Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal