what socket phpwebsockets elephant ejemplo cboden google-chrome-extension websocket phpwebsocket

google-chrome-extension - phpwebsockets - websocket php ejemplo



No se puede hacer que la conexión de websocket funcione en Chrome 19 (2)

Encontrado el problema

En primer lugar, la entrada en blanco Sec-WebSocket-Extensions en la respuesta del servidor producía un Invalid UTF-8 sequence in header value " Invalid UTF-8 sequence in header value ". Después de eliminar esa entrada, el error restante fue " A server must not mask any frames that it sends to the client. " A server must not mask any frames that it sends to the client.

De hecho, la implementación de mi servidor (una versión altamente modificada de PHPWebSocket) está por defecto enmascarando los marcos que envía. El cambio de este comportamiento predeterminado solucionó el problema y la conexión de websocket ahora funciona en Chrome 19.

Agregar la etiqueta PHPWebSocket a esta pregunta ya que es un problema con ese proyecto.

Tengo un cliente / servidor websocket que funciona perfectamente con Firefox y Chrome 18. No funciona con Chrome 19 beta. Sospecho que es debido a que este navegador ahora usa una extensión de marco desinflado que mi servidor no admite.

Chrome 19 beta está enviando esto en su handshake: "Sec-WebSocket-Extensions: x-webkit-deflate-frame"

Tengo mi servidor devolviendo: "Sec-WebSocket-Extensions:"

Pero o bien esta no es la forma correcta de rechazar la extensión o hay algo más que no estoy atrapando. Esto es lo único en el apretón de manos que es diferente de lo que veo proveniente de los navegadores de trabajo.

Editar: Aquí hay algo de información adicional. Estos son los apretones de manos según lo capturado por Wireshark.

El apretón de manos usando Firefox 12:

GET / chatserver HTTP / 1.1
Anfitrión: (se omite en esta publicación)
User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 12.0) Gecko / 20100101 Firefox / 12.0
Aceptar: texto / html, application / xhtml + xml, application / xml; q = 0.9, / ; q = 0.8
Accept-Language: en-us, en; q = 0.5
Aceptar-Codificar: gzip, desinflar
DNT: 1
Conexión: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origen: (omitido para esta publicación)
Sec-WebSocket-Key: 2TKm4ozUQdNP17Lobt7IBg ==
Pragma: no-caché
Cache-Control: no-caché
Actualización: websocket

HTTP / 1.1 101 Protocolos de conmutación
Actualización: websocket
Conexión: actualización
Sec-WebSocket-Accept: pSUB3BT9YUUd9n3mOeWY / 1uVqJE =

El apretón de manos usando Chrome 18:

GET / chatserver HTTP / 1.1
Actualización: websocket
Conexión: actualización
Anfitrión: (se omite en esta publicación)
Origen: (omitido para esta publicación)
Sec-WebSocket-Key: zuHLEC8pGvAMadarhCLXFA ==
Sec-WebSocket-Version: 13

HTTP / 1.1 101 Protocolos de conmutación
Actualización: websocket
Conexión: actualización
Sec-WebSocket-Accept: LMBSq6Bk9Kiv + zAbQlAL899pfzc =

El apretón de manos usando Chrome 19:

GET / chatserver HTTP / 1.1
Actualización: websocket
Conexión: actualización
Anfitrión: (se omite en esta publicación)
Origen: (omitido para esta publicación)
Sec-WebSocket-Key: TbwnVcuUiqGgZn7hxvxzvQ ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

HTTP / 1.1 101 Protocolos de conmutación
Actualización: websocket
Conexión: actualización
Sec-WebSocket-Accept: D45BJ + Vfydy1Upcs3Hze / nuiaS8 =
Sec-WebSocket-Extensions:

Todas las respuestas del servidor tienen / r / n terminaciones de línea e incluyen un / r / n adicional al final del mensaje.

FF12 y Chrome18 funcionan: Chrome19 no funciona . En Chrome19, el siguiente paquete después de la respuesta de handshake del servidor es FIN / ACK. La conexión está cerrada.

nótese bien. También he intentado usar un guión como el valor Sec-WebSocket-Extensions, pero tampoco funcionó.


Para Chrome, el encabezado "Sec-WebSocket-Protocol" debe tener valor tanto para el servidor como para el cliente. Este es el caso para mí.