MCPcopy
hub / github.com/websockets/ws / handleUpgrade

Method handleUpgrade

lib/websocket-server.js:244–357  ·  view source on GitHub ↗

* 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)

Source from the content-addressed store, hash-verified

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 ) {

Callers 4

constructorMethod · 0.95
websocket.test.jsFile · 0.80
index.jsFile · 0.80

Calls 5

shouldHandleMethod · 0.95
acceptMethod · 0.95
completeUpgradeMethod · 0.95
abortHandshakeFunction · 0.70

Tested by

no test coverage detected