Merge pull request #40 from ratchetphp/response_verifier

Correct ResponseVerifier logic
This commit is contained in:
Chris Boden 2020-05-15 14:31:24 -04:00 committed by GitHub
commit c8651c7938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 7 deletions

View File

@ -119,10 +119,10 @@ class RequestVerifier {
/** /**
* Verify the version passed matches this RFC * Verify the version passed matches this RFC
* @param string|int $versionHeader MUST equal 13|"13" * @param string[] $versionHeader MUST equal ["13"]
* @return bool * @return bool
*/ */
public function verifyVersion($versionHeader) { public function verifyVersion(array $versionHeader) {
return (1 === count($versionHeader) && static::VERSION === (int)$versionHeader[0]); return (1 === count($versionHeader) && static::VERSION === (int)$versionHeader[0]);
} }

View File

@ -51,7 +51,13 @@ class ResponseVerifier {
} }
public function verifySubProtocol(array $requestHeader, array $responseHeader) { public function verifySubProtocol(array $requestHeader, array $responseHeader) {
return 0 === count($responseHeader) || count(array_intersect($responseHeader, $requestHeader)) > 0; if (0 === count($responseHeader)) {
return true;
}
$requestedProtocols = array_map('trim', explode(',', implode(',', $requestHeader)));
return count($responseHeader) === 1 && count(array_intersect($responseHeader, $requestedProtocols)) === 1;
} }
public function verifyExtensions(array $requestHeader, array $responseHeader) { public function verifyExtensions(array $requestHeader, array $responseHeader) {

View File

@ -21,17 +21,19 @@ class ResponseVerifierTest extends TestCase {
public static function subProtocolsProvider() { public static function subProtocolsProvider() {
return [ return [
[true, ['a'], ['a']] [true, ['a'], ['a']]
, [true, ['b', 'a'], ['c', 'd', 'a']] , [true, ['c', 'd', 'a'], ['a']]
, [false, ['a', 'b', 'c'], ['d']] , [true, ['c, a', 'd'], ['a']]
, [true, [], []] , [true, [], []]
, [true, ['a', 'b'], []] , [true, ['a', 'b'], []]
, [false, ['c', 'd', 'a'], ['b', 'a']]
, [false, ['a', 'b', 'c'], ['d']]
]; ];
} }
/** /**
* @dataProvider subProtocolsProvider * @dataProvider subProtocolsProvider
*/ */
public function testVerifySubProtocol($expected, $response, $request) { public function testVerifySubProtocol($expected, $request, $response) {
$this->assertEquals($expected, $this->_v->verifySubProtocol($response, $request)); $this->assertEquals($expected, $this->_v->verifySubProtocol($request, $response));
} }
} }