Ugly Hacks

Added some ugly hacks to fix Hixie:
* Hixie now should work no matter how small the I/O buffer is
* Hixie now works with the Guzzle library*
This commit is contained in:
Chris Boden 2012-01-07 00:40:31 -05:00
parent a1c6ee163f
commit 83f49f1f55
2 changed files with 28 additions and 3 deletions

View File

@ -18,6 +18,8 @@ use Guzzle\Http\Message\RequestFactory;
* @todo Consider chaning this class to a State Pattern. If a WS App interface is passed use different state for additional methods used * @todo Consider chaning this class to a State Pattern. If a WS App interface is passed use different state for additional methods used
*/ */
class App implements ApplicationInterface, ConfiguratorInterface { class App implements ApplicationInterface, ConfiguratorInterface {
const CRLF = "\r\n\r\n";
/** /**
* Decorated application * Decorated application
* @var Ratchet\Application\ApplicationInterface * @var Ratchet\Application\ApplicationInterface
@ -87,6 +89,7 @@ class App implements ApplicationInterface, ConfiguratorInterface {
} }
$headers = RequestFactory::fromMessage($from->WebSocket->headers); $headers = RequestFactory::fromMessage($from->WebSocket->headers);
$headers->setHeader('X-Body', $this->getBody($from->WebSocket->headers));
$from->WebSocket->version = $this->getVersion($headers); $from->WebSocket->version = $this->getVersion($headers);
$from->WebSocket->headers = $headers; $from->WebSocket->headers = $headers;
} }
@ -236,10 +239,32 @@ class App implements ApplicationInterface, ConfiguratorInterface {
/** /**
* @param string * @param string
* @return bool * @return bool
* @todo Method is flawed, this CAN result in an error with the Hixie protocol * @todo Abstract, some hard coding done for (stupid) Hixie protocol
*/ */
protected function isMessageComplete($message) { protected function isMessageComplete($message) {
return (boolean)strstr($message, "\r\n\r\n"); $headers = (boolean)strstr($message, static::CRLF);
if (!$headers) {
return false;
}
if (strstr($message, 'Sec-WebSocket-Key2')) {
if (8 !== strlen($this->getBody($message))) {
return false;
}
}
return true;
}
/**
* @param string
* @return string
* @deprecated
* @todo Remove soon, this is a temp hack for Hixie
*/
protected function getBody($message) {
return substr($message, strpos($message, static::CRLF) + strlen(static::CRLF));
} }
/** /**

View File

@ -24,7 +24,7 @@ class Hixie76 implements VersionInterface {
* @return string * @return string
*/ */
public function handshake(RequestInterface $request) { public function handshake(RequestInterface $request) {
$message = $request->getRawHeaders() . $request->getResponse()->getBody(true); $message = $request->getRawHeaders() . "\r\n\r\n" . $request->getHeader('X-Body');
$buffer = $message; $buffer = $message;
$resource = $host = $origin = $key1 = $key2 = $protocol = $code = $handshake = null; $resource = $host = $origin = $key1 = $key2 = $protocol = $code = $handshake = null;