400 communication protocol_error ai_generated true

WebSocket handshake error: 400 Bad Request

ID: communication/websocket-handshake-400-bad-request

Also available as: JSON · Markdown · 中文
85%Fix Rate
87%Confidence
1Evidence
2023-03-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
WebSocket (RFC 6455) active — — —
Node.js 18 active — — —
Python websockets 12.0 active — — —
Nginx 1.24 active — — —

Root Cause

The WebSocket handshake fails because the server rejects the upgrade request due to missing or invalid headers, such as a missing 'Sec-WebSocket-Key' or an unsupported 'Origin'.

generic

中文

WebSocket 握手失败,因为服务器拒绝升级请求,原因是缺少或无效的标头,例如缺少 'Sec-WebSocket-Key' 或不受支持的 'Origin'。

Official Documentation

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

Workarounds

  1. 80% success Inspect and fix the 'Origin' header in the client request. For example, in JavaScript: `const socket = new WebSocket('wss://example.com/socket', { headers: { Origin: 'https://example.com' } });` Ensure the Origin matches the server's allowed list.
    Inspect and fix the 'Origin' header in the client request. For example, in JavaScript: `const socket = new WebSocket('wss://example.com/socket', { headers: { Origin: 'https://example.com' } });` Ensure the Origin matches the server's allowed list.
  2. 75% success Add the 'Sec-WebSocket-Key' header manually if the library omits it. In Python with websockets: `import base64, os; key = base64.b64encode(os.urandom(16)).decode(); headers = {'Sec-WebSocket-Key': key}` and pass to the client.
    Add the 'Sec-WebSocket-Key' header manually if the library omits it. In Python with websockets: `import base64, os; key = base64.b64encode(os.urandom(16)).decode(); headers = {'Sec-WebSocket-Key': key}` and pass to the client.
  3. 85% success Check the server-side Nginx configuration for WebSocket support: ensure `proxy_set_header Upgrade $http_upgrade;` and `proxy_set_header Connection "upgrade";` are present in the location block.
    Check the server-side Nginx configuration for WebSocket support: ensure `proxy_set_header Upgrade $http_upgrade;` and `proxy_set_header Connection "upgrade";` are present in the location block.

中文步骤

  1. Inspect and fix the 'Origin' header in the client request. For example, in JavaScript: `const socket = new WebSocket('wss://example.com/socket', { headers: { Origin: 'https://example.com' } });` Ensure the Origin matches the server's allowed list.
  2. Add the 'Sec-WebSocket-Key' header manually if the library omits it. In Python with websockets: `import base64, os; key = base64.b64encode(os.urandom(16)).decode(); headers = {'Sec-WebSocket-Key': key}` and pass to the client.
  3. Check the server-side Nginx configuration for WebSocket support: ensure `proxy_set_header Upgrade $http_upgrade;` and `proxy_set_header Connection "upgrade";` are present in the location block.

Dead Ends

Common approaches that don't work:

  1. Disable header validation in the WebSocket client library 90% fail

    Disabling the WebSocket library's built-in header validation does not fix the missing or invalid headers; the server still requires them for the upgrade.

  2. Switch to a different WebSocket client library (e.g., from ws to socket.io) 85% fail

    Switching to a different WebSocket library without addressing the header issue just moves the problem; the new library will still fail if the headers are wrong.

  3. Increase the WebSocket connection timeout 95% fail

    Increasing the timeout does not help because the error is immediate upon handshake, not a timeout issue.