* Handle a HTTP Upgrade request. * * @param {http.IncomingMessage} req The request object * @param {Duplex} socket The network socket between the server and client * @param {Buffer} head The first packet of the upgraded stream * @param {Function} cb Callback * @public
(req, socket, head, cb)
| 242 | * @public |
| 243 | */ |
| 244 | handleUpgrade(req, socket, head, cb) { |
| 245 | socket.on('error', socketOnError); |
| 246 | |
| 247 | const key = req.headers['sec-websocket-key']; |
| 248 | const upgrade = req.headers.upgrade; |
| 249 | const version = +req.headers['sec-websocket-version']; |
| 250 | |
| 251 | if (req.method !== 'GET') { |
| 252 | const message = 'Invalid HTTP method'; |
| 253 | abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); |
| 254 | return; |
| 255 | } |
| 256 | |
| 257 | if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { |
| 258 | const message = 'Invalid Upgrade header'; |
| 259 | abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); |
| 260 | return; |
| 261 | } |
| 262 | |
| 263 | if (key === undefined || !keyRegex.test(key)) { |
| 264 | const message = 'Missing or invalid Sec-WebSocket-Key header'; |
| 265 | abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); |
| 266 | return; |
| 267 | } |
| 268 | |
| 269 | if (version !== 13 && version !== 8) { |
| 270 | const message = 'Missing or invalid Sec-WebSocket-Version header'; |
| 271 | abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, { |
| 272 | 'Sec-WebSocket-Version': '13, 8' |
| 273 | }); |
| 274 | return; |
| 275 | } |
| 276 | |
| 277 | if (!this.shouldHandle(req)) { |
| 278 | abortHandshake(socket, 400); |
| 279 | return; |
| 280 | } |
| 281 | |
| 282 | const secWebSocketProtocol = req.headers['sec-websocket-protocol']; |
| 283 | let protocols = new Set(); |
| 284 | |
| 285 | if (secWebSocketProtocol !== undefined) { |
| 286 | try { |
| 287 | protocols = subprotocol.parse(secWebSocketProtocol); |
| 288 | } catch (err) { |
| 289 | const message = 'Invalid Sec-WebSocket-Protocol header'; |
| 290 | abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); |
| 291 | return; |
| 292 | } |
| 293 | } |
| 294 | |
| 295 | const secWebSocketExtensions = req.headers['sec-websocket-extensions']; |
| 296 | const extensions = {}; |
| 297 | |
| 298 | if ( |
| 299 | this.options.perMessageDeflate && |
| 300 | secWebSocketExtensions !== undefined |
| 301 | ) { |
no test coverage detected