javascript - visual - Apretón de manos de Websocket El valor del encabezado Sec-WebSocket-Accept es incorrecto
websocket mvc 5 (1)
Estoy escribiendo un servidor websocket c ++, las herramientas dev en Chrome dice que el valor del encabezado sec-websocket-accept es incorrecto. He probado durante días y todo parece estar bien. El cliente cierra con readystate 3 sin que se llame al websocket onopen aunque se muestre como 101 en las herramientas chrome dev.
Este es mi código para calcular las claves
string magickey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
string key = msgkey.append(magickey);
unsigned char* sha_str = SHA1(reinterpret_cast<const unsigned char*>(key.c_str()), key.length(), nullptr);
string acceptkey = base64_encode(reinterpret_cast<const unsigned char*>(sha_str), strlen((char*)sha_str));
string handshake_response = "HTTP/1.1 101 Switching Protocols/r/n";
handshake_response.append("Upgrade: websocket/r/n");
handshake_response.append("Connection: Upgrade/r/n");
handshake_response.append("Sec-WebSocket-Accept: "+acceptkey+"/r/n");
handshake_response.append("/r/n");
Respuesta de Chrome
HTTP / 1.1 101 Protocolos de conmutación
Actualización: websocket
Conexión: actualización
Sec-WebSocket-Accept: 5T5MvxP1iz40vLpi3kQs / ifDaCo =
Solicitud de Chrome
OBTENGA ws: // localhost: 4897 / echo HTTP / 1.1
Anfitrión: localhost: 4897
Conexión: actualización
Pragma: no-caché
Cache-Control: no-caché
Actualización: websocket
Origen: http: // localhost
Sec-WebSocket-Version: 13
User-Agent: Mozilla / 5.0 (Windows NT 6.3; WOW64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 47.0.2526.106 Safari / 537.36
Aceptar-Codificación: gzip, desinflar, sdch
Accept-Language: en-US, en; q = 0.8
Sec-WebSocket-Key: LKF8lHGznbKGIgO1UzAOhg ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Dice "Error durante el protocolo de enlace WebSocket: valor incorrecto del encabezado ''Sec-WebSocket-Accept''".
Chrome también muestra un marco adicional recibido tamaño 79 bytes código de operación -1.
¡Montones de gracias!
Chrome dice que ''Sec-WebSocket-Accept'' es incorrecto. Al tratar de calcularlo manualmente, tengo que estar de acuerdo con Chrome.
Mi prueba:
- concat "LKF8lHGznbKGIgO1UzAOhg ==" y "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" => "LKF8lHGznbKGIgO1UzAOhg == 258EAFA5-E914-47DA-95CA-C5AB0DC85B11", esa es la
key
. - calcular SHA1 160 bits hex: bf15 14e3 7108 0ee4 7782 c709 a767 cc72 423d e5c4
- De su registro, su codificación a base64 es: 5T5MvxP1iz40vLpi3kQs / ifDaCo =
- Descifrándolo a hex: e53e 4cbf 13f5 8b3e 34bc ba62 de44 2cfe 27c3 682a
Los valores audaces deben ser iguales. No dude en corregirme si me equivoco en alguna parte.
Posibles problemas:
¿
sha_str
tienesha_str
nula? es decir,strlen((char*)sha_str) == 20
?sesión de charla firmada / no firmada?