Sha256: be3f6323d6f549568577dcba9004c1479d95c65a7abb0fe0c582875b9fac0b7c

Contents?: true

Size: 1.46 KB

Versions: 72

Compression:

Stored size: 1.46 KB

Contents

'use strict';

const { tokenChars } = require('./validation');

/**
 * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.
 *
 * @param {String} header The field value of the header
 * @return {Set} The subprotocol names
 * @public
 */
function parse(header) {
  const protocols = new Set();
  let start = -1;
  let end = -1;
  let i = 0;

  for (i; i < header.length; i++) {
    const code = header.charCodeAt(i);

    if (end === -1 && tokenChars[code] === 1) {
      if (start === -1) start = i;
    } else if (
      i !== 0 &&
      (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */
    ) {
      if (end === -1 && start !== -1) end = i;
    } else if (code === 0x2c /* ',' */) {
      if (start === -1) {
        throw new SyntaxError(`Unexpected character at index ${i}`);
      }

      if (end === -1) end = i;

      const protocol = header.slice(start, end);

      if (protocols.has(protocol)) {
        throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);
      }

      protocols.add(protocol);
      start = end = -1;
    } else {
      throw new SyntaxError(`Unexpected character at index ${i}`);
    }
  }

  if (start === -1 || end !== -1) {
    throw new SyntaxError('Unexpected end of input');
  }

  const protocol = header.slice(start, i);

  if (protocols.has(protocol)) {
    throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);
  }

  protocols.add(protocol);
  return protocols;
}

module.exports = { parse };

Version data entries

72 entries across 69 versions & 4 rubygems

Version Path
rapid_stack-0.2.0 templates/frontend/node_modules/webpack-dev-server/node_modules/ws/lib/subprotocol.js
rapid_stack-0.2.0 templates/frontend/node_modules/ws/lib/subprotocol.js
rapid_stack-0.1.1 templates/FrontEnd/node_modules/webpack-dev-server/node_modules/ws/lib/subprotocol.js
rapid_stack-0.1.1 templates/FrontEnd/node_modules/ws/lib/subprotocol.js
rapid_stack-0.1.0 templates/FrontEnd/node_modules/ws/lib/subprotocol.js
rapid_stack-0.1.0 templates/FrontEnd/node_modules/webpack-dev-server/node_modules/ws/lib/subprotocol.js
clapton-0.0.26 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.25 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.24 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.23 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.22 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.21 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.20 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.19 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.18 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.17 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.16 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.15 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.14 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js
clapton-0.0.13 lib/clapton/javascripts/node_modules/ws/lib/subprotocol.js