From 9c64881929b94be00a777f40ab5ec0f28ea99ea8 Mon Sep 17 00:00:00 2001 From: Barbarrosa Date: Fri, 31 May 2013 22:55:00 -0600 Subject: [PATCH 1/4] Fixed type conversion issue with isProtocol method in RFC6455 I encountered the following error while attempting to use Ratchet. The __toString version of the request contained the correct value (13), so I cast the result to a string before casting it to an integer. Notice: Object of class Guzzle\Http\Message\Header could not be converted to int in [file system path]\vendor\cboden\ratchet\src\Ratchet\WebSocket\Version\RFC6455.php on line 53 --- Version/RFC6455.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Version/RFC6455.php b/Version/RFC6455.php index 94416c3..aab0435 100644 --- a/Version/RFC6455.php +++ b/Version/RFC6455.php @@ -50,7 +50,7 @@ class RFC6455 implements VersionInterface { * {@inheritdoc} */ public function isProtocol(RequestInterface $request) { - $version = (int)$request->getHeader('Sec-WebSocket-Version', -1); + $version = (int)((string)($request->getHeader('Sec-WebSocket-Version', -1))); return ($this->getVersionNumber() === $version); } @@ -268,4 +268,4 @@ class RFC6455 implements VersionInterface { $this->closeCodes[Frame::CLOSE_SRV_ERR] = true; //$this->closeCodes[Frame::CLOSE_TLS] = true; } -} \ No newline at end of file +} From 3158e4fcf390f1bc6eda8c79783666a34bdfbce8 Mon Sep 17 00:00:00 2001 From: Barbarrosa Date: Fri, 31 May 2013 23:08:27 -0600 Subject: [PATCH 2/4] Update HyBi10.php I encountered the following error while attempting to use Ratchet. The __toString version of the request should contain the proper value, and retrieving the string before converting to an int would prevent this typecasting issue. Notice: Object of class Guzzle\Http\Message\Header could not be converted to int in [file system path]\vendor\cboden\ratchet\src\Ratchet\WebSocket\Version\HyBi10.php on line 7 --- Version/HyBi10.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Version/HyBi10.php b/Version/HyBi10.php index f557a18..0ac41fa 100644 --- a/Version/HyBi10.php +++ b/Version/HyBi10.php @@ -4,11 +4,11 @@ use Guzzle\Http\Message\RequestInterface; class HyBi10 extends RFC6455 { public function isProtocol(RequestInterface $request) { - $version = (int)$request->getHeader('Sec-WebSocket-Version', -1); + $version = (int)((string)($request->getHeader('Sec-WebSocket-Version', -1))); return ($version >= 6 && $version < 13); } public function getVersionNumber() { return 6; } -} \ No newline at end of file +} From 86e2484dfe8335d85c6a6f7f44a337d233c2224a Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sat, 1 Jun 2013 20:24:11 -0400 Subject: [PATCH 3/4] Fixing more Guzzle API breaks --- Version/Hixie76.php | 8 ++++---- Version/HyBi10.php | 3 ++- Version/RFC6455.php | 4 ++-- Version/RFC6455/HandshakeVerifier.php | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Version/Hixie76.php b/Version/Hixie76.php index 069263a..8b0e2c4 100644 --- a/Version/Hixie76.php +++ b/Version/Hixie76.php @@ -23,7 +23,7 @@ class Hixie76 implements VersionInterface { * {@inheritdoc} */ public function isProtocol(RequestInterface $request) { - return !(null === $request->getHeader('Sec-WebSocket-Key2', true)); + return !(null === $request->getHeader('Sec-WebSocket-Key2')); } /** @@ -44,13 +44,13 @@ class Hixie76 implements VersionInterface { throw new \UnderflowException("Not enough data received to issue challenge response"); } - $challenge = $this->sign($request->getHeader('Sec-WebSocket-Key1', true), $request->getHeader('Sec-WebSocket-Key2', true), $body); + $challenge = $this->sign((string)$request->getHeader('Sec-WebSocket-Key1'), (string)$request->getHeader('Sec-WebSocket-Key2'), $body); $headers = array( 'Upgrade' => 'WebSocket' , 'Connection' => 'Upgrade' - , 'Sec-WebSocket-Origin' => $request->getHeader('Origin', true) - , 'Sec-WebSocket-Location' => 'ws://' . $request->getHeader('Host', true) . $request->getPath() + , 'Sec-WebSocket-Origin' => (string)$request->getHeader('Origin') + , 'Sec-WebSocket-Location' => 'ws://' . (string)$request->getHeader('Host') . $request->getPath() ); $response = new Response(101, $headers, $challenge); diff --git a/Version/HyBi10.php b/Version/HyBi10.php index 0ac41fa..a53d338 100644 --- a/Version/HyBi10.php +++ b/Version/HyBi10.php @@ -4,7 +4,8 @@ use Guzzle\Http\Message\RequestInterface; class HyBi10 extends RFC6455 { public function isProtocol(RequestInterface $request) { - $version = (int)((string)($request->getHeader('Sec-WebSocket-Version', -1))); + $version = (int)(string)$request->getHeader('Sec-WebSocket-Version'); + return ($version >= 6 && $version < 13); } diff --git a/Version/RFC6455.php b/Version/RFC6455.php index aab0435..23e166c 100644 --- a/Version/RFC6455.php +++ b/Version/RFC6455.php @@ -50,7 +50,7 @@ class RFC6455 implements VersionInterface { * {@inheritdoc} */ public function isProtocol(RequestInterface $request) { - $version = (int)((string)($request->getHeader('Sec-WebSocket-Version', -1))); + $version = (int)(string)$request->getHeader('Sec-WebSocket-Version'); return ($this->getVersionNumber() === $version); } @@ -73,7 +73,7 @@ class RFC6455 implements VersionInterface { return new Response(101, array( 'Upgrade' => 'websocket' , 'Connection' => 'Upgrade' - , 'Sec-WebSocket-Accept' => $this->sign($request->getHeader('Sec-WebSocket-Key')) + , 'Sec-WebSocket-Accept' => $this->sign((string)$request->getHeader('Sec-WebSocket-Key')) )); } diff --git a/Version/RFC6455/HandshakeVerifier.php b/Version/RFC6455/HandshakeVerifier.php index 7fbf452..838a047 100644 --- a/Version/RFC6455/HandshakeVerifier.php +++ b/Version/RFC6455/HandshakeVerifier.php @@ -19,10 +19,10 @@ class HandshakeVerifier { $passes += (int)$this->verifyMethod($request->getMethod()); $passes += (int)$this->verifyHTTPVersion($request->getProtocolVersion()); $passes += (int)$this->verifyRequestURI($request->getPath()); - $passes += (int)$this->verifyHost($request->getHeader('Host', true)); - $passes += (int)$this->verifyUpgradeRequest($request->getHeader('Upgrade', true)); - $passes += (int)$this->verifyConnection($request->getHeader('Connection', true)); - $passes += (int)$this->verifyKey($request->getHeader('Sec-WebSocket-Key', true)); + $passes += (int)$this->verifyHost((string)$request->getHeader('Host')); + $passes += (int)$this->verifyUpgradeRequest((string)$request->getHeader('Upgrade')); + $passes += (int)$this->verifyConnection((string)$request->getHeader('Connection')); + $passes += (int)$this->verifyKey((string)$request->getHeader('Sec-WebSocket-Key')); //$passes += (int)$this->verifyVersion($headers['Sec-WebSocket-Version']); // Temporarily breaking functionality return (7 === $passes); From cb6f580d0221e0a8a7dc45a86635729f0f9f99fe Mon Sep 17 00:00:00 2001 From: Chris Boden Date: Sun, 9 Jun 2013 11:10:22 -0400 Subject: [PATCH 4/4] Guzzle 3.6 conformance Updated inheritance class to match API change Use new Guzzle Header class when searching for values Lock Ratchet into using Guzzle 3.6 to future-proof --- Guzzle/Http/Message/RequestFactory.php | 2 +- WsServer.php | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Guzzle/Http/Message/RequestFactory.php b/Guzzle/Http/Message/RequestFactory.php index c1f6b45..64b6302 100644 --- a/Guzzle/Http/Message/RequestFactory.php +++ b/Guzzle/Http/Message/RequestFactory.php @@ -7,7 +7,7 @@ class RequestFactory extends GuzzleRequestFactory { /** * {@inheritdoc} */ - public function create($method, $url, $headers = null, $body = '') { + public function create($method, $url, $headers = null, $body = '', array $options = array()) { $c = $this->entityEnclosingRequestClass; $request = new $c($method, $url, $headers); $request->setBody(EntityBody::factory($body)); diff --git a/WsServer.php b/WsServer.php index 281f16c..dbc8104 100644 --- a/WsServer.php +++ b/WsServer.php @@ -117,9 +117,10 @@ class WsServer implements MessageComponentInterface { return; } - // This needs to be refactored later on, incorporated with routing - if ('' !== ($agreedSubProtocols = $this->getSubProtocolString($from->WebSocket->request->getTokenizedHeader('Sec-WebSocket-Protocol', ',')))) { - $response->setHeader('Sec-WebSocket-Protocol', $agreedSubProtocols); + if (null !== ($subHeader = $from->WebSocket->request->getHeader('Sec-WebSocket-Protocol'))) { + if ('' !== ($agreedSubProtocols = $this->getSubProtocolString($subHeader->normalize()))) { + $response->setHeader('Sec-WebSocket-Protocol', $agreedSubProtocols); + } } $response->setHeader('X-Powered-By', \Ratchet\VERSION);