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.
// WebSocket framing — build and parse frames (RFC 6455) // Framing WebSocket — construir y parsear frames import "std/websocket" fn main() -> int { // Build a WebSocket text frame 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") // Parse a frame back to its payload let parsed: String = ws_parse(frame) print("parsed: " + parsed) // Generate a handshake response for a given Sec-WebSocket-Key let ws_key: String = "dGhlIHNhbXBsZSBub25jZQ==" let handshake: String = ws_handshake_response(ws_key) print("handshake response:") print(handshake) return 0 }
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=
Cómo funciona
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.