From 9f405beccb0c0143c4d0c09bcec8635aa00e4034 Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Mon, 8 Feb 2016 21:43:17 -0500 Subject: [PATCH] Added subprotocol check for client, test fixes --- src/Handshake/ResponseVerifier.php | 10 +++++- tests/unit/Handshake/RequestVerifierTest.php | 4 +-- tests/unit/Handshake/ResponseVerifierTest.php | 34 +++++++++++++++++++ tests/unit/Messaging/Protocol/FrameTest.php | 3 +- tests/unit/Messaging/Protocol/MessageTest.php | 4 +-- 5 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 tests/unit/Handshake/ResponseVerifierTest.php diff --git a/src/Handshake/ResponseVerifier.php b/src/Handshake/ResponseVerifier.php index f809ff3..de03f53 100644 --- a/src/Handshake/ResponseVerifier.php +++ b/src/Handshake/ResponseVerifier.php @@ -14,8 +14,12 @@ class ResponseVerifier { $response->getHeader('Sec-WebSocket-Accept') , $request->getHeader('Sec-WebSocket-Key') ); + $passes += (int)$this->verifySubProtocol( + $request->getHeader('Sec-WebSocket-Protocol') + , $response->getHeader('Sec-WebSocket-Protocol') + ); - return (4 === $passes); + return (5 === $passes); } public function verifyStatus($status) { @@ -41,4 +45,8 @@ class ResponseVerifier { public function sign($key) { return base64_encode(sha1($key . NegotiatorInterface::GUID, true)); } + + public function verifySubProtocol(array $requestHeader, array $responseHeader) { + return 0 === count($responseHeader) || count(array_intersect($responseHeader, $requestHeader)) > 0; + } } \ No newline at end of file diff --git a/tests/unit/Handshake/RequestVerifierTest.php b/tests/unit/Handshake/RequestVerifierTest.php index a7277ff..e0569fd 100644 --- a/tests/unit/Handshake/RequestVerifierTest.php +++ b/tests/unit/Handshake/RequestVerifierTest.php @@ -1,11 +1,9 @@ _v = new ResponseVerifier; + } + + public static function subProtocolsProvider() { + return [ + [true, ['a'], ['a']] + , [true, ['b', 'a'], ['c', 'd', 'a']] + , [false, ['a', 'b', 'c'], ['d']] + , [true, [], []] + , [true, ['a', 'b'], []] + ]; + } + + /** + * @dataProvider subProtocolsProvider + */ + public function testVerifySubProtocol($expected, $response, $request) { + $this->assertEquals($expected, $this->_v->verifySubProtocol($response, $request)); + } +} \ No newline at end of file diff --git a/tests/unit/Messaging/Protocol/FrameTest.php b/tests/unit/Messaging/Protocol/FrameTest.php index 7622599..e0a4f61 100644 --- a/tests/unit/Messaging/Protocol/FrameTest.php +++ b/tests/unit/Messaging/Protocol/FrameTest.php @@ -1,10 +1,9 @@