WebSocket
std/websocket implementa el framing de WebSocket según RFC 6455. ws_frame envuelve un payload de texto en un frame de WebSocket, ws_parse extrae el payload de un frame, y ws_handshake_response genera la respuesta HTTP 101 Upgrade necesaria para establecer una conexión WebSocket.
Código
// WebSocket framing — build and parse frames (RFC 6455)
import "std/websocket"
fn main() -> int {
let payload: String = "Hello, WebSocket!"
let frame: String = ws_frame(payload)
print("frame length: " + int_to_string(frame.length()) + " bytes")
print("payload length: " + int_to_string(payload.length()) + " bytes")
let parsed: String = ws_parse(frame)
print("parsed: " + parsed)
let ws_key: String = "dGhlIHNhbXBsZSBub25jZQ=="
let handshake: String = ws_handshake_response(ws_key)
print("handshake response:")
print(handshake)
return 0
}
Salida
frame length: 19 bytes payload length: 17 bytes parsed: Hello, WebSocket! handshake response: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Explicación
Un frame de WebSocket tiene un encabezado de 2 bytes (bit FIN, opcode, longitud del payload) seguido del payload. ws_frame crea un frame de texto (opcode 0x81) con la codificación de longitud correcta. ws_parse lee el encabezado y extrae los bytes del payload.
La respuesta del handshake calcula el header Sec-WebSocket-Accept concatenando la clave del cliente con un GUID mágico y calculando SHA-1. Esto lo maneja runtime/websocket.c.