Configuración de una ruta $connect
que requiere un subprotocolo WebSocket
Los clientes pueden usar el campo Sec-WebSocket-Protocol
para solicitar un subprotocolo WebSocket$connect
para permitir conexiones solo si un cliente solicita un subprotocolo compatible con su API.
La siguiente función de Lambda de ejemplo devuelve el encabezado Sec-WebSocket-Protocol
a los clientes. La función establece una conexión a su API solo si el cliente especifica el subprotocolo myprotocol
.
Para obtener una plantilla de AWS CloudFormation que cree este ejemplo de integración de API y proxy de Lambda, consulte ws-subprotocol.yaml
.
export const handler = async (event) => { if (event.headers != undefined) { const headers = toLowerCaseProperties(event.headers); if (headers['sec-websocket-protocol'] != undefined) { const subprotocolHeader = headers['sec-websocket-protocol']; const subprotocols = subprotocolHeader.split(','); if (subprotocols.indexOf('myprotocol') >= 0) { const response = { statusCode: 200, headers: { "Sec-WebSocket-Protocol" : "myprotocol" } }; return response; } } } const response = { statusCode: 400 }; return response; }; function toLowerCaseProperties(obj) { var wrapper = {}; for (var key in obj) { wrapper[key.toLowerCase()] = obj[key]; } return wrapper; }
Puede usar wscat
-s
para especificar subprotocolos durante la conexión.
El siguiente comando intenta una conexión con un subprotocolo no compatible. Dado que el cliente especificó el subprotocolo chat1
, la integración de Lambda devuelve un error 400 y la conexión no es correcta.
wscat -c wss://
api-id
.execute-api.region
.amazonaws.com/beta
-s chat1error: Unexpected server response: 400
El siguiente comando incluye un subprotocolo admitido en la solicitud de conexión. La integración de Lambda permite la conexión.
wscat -c wss://
api-id
.execute-api.region
.amazonaws.com/beta
-s chat1,myprotocolconnected (press CTRL+C to quit)
Para obtener más información acerca de cómo invocar la API de WebSocket, consulte Invocación de las API de WebSocket.