Spaces:
Runtime error
Runtime error
| ; | |
| 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 }; | |