Nyx con Ejemplos

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.

← Anterior Siguiente →

Source: examples/by-example/53-websocket.nx