UNPKG

rcs-data

Version:

RCS消息数据结构

126 lines 4.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseHeaderValue = exports.parse = void 0; const debug = require('debug')('cpim:parse'); const debugerror = require('debug')('cpim:ERROR:parse'); const mime_1 = require("../mime"); const grammar_1 = require("./grammar"); const message_1 = require("./message"); const REGEXP_VALID_HEADER = /^(([a-zA-Z0-9!#$%&'+,\-\^_`|~]+)\.)?([a-zA-Z0-9!#$%&'+,\-\^_`|~]+):[^ ]* (.+)$/; function parse(raw) { debug('parse()'); if (typeof raw !== 'string') { throw new Error('given data must be a string'); } let headersEnd, rawHeaders, rawMime, mime, message; headersEnd = raw.indexOf('\r\n\r\n'); if (headersEnd === -1) { debugerror('wrong headers'); return false; } rawHeaders = raw.slice(0, headersEnd); rawMime = raw.slice(headersEnd + 4); message = new message_1.Message(); if (!parseHeaders(rawHeaders)) { return false; } mime = mime_1.default.parse(rawMime); if (!mime) { debugerror('wrong MIME message'); return false; } message._mime = mime; return message; function parseHeaders(rawHeaders) { let lines = rawHeaders.split('\r\n'); let i, len, currentDefaultNSUri; let ns = {}; for (i = 0, len = lines.length; i < len; i++) { if (!parseHeader(lines[i])) { debugerror('discarding message due to invalid header: "%s"', lines[i]); return false; } } return true; function parseHeader(line) { let match = line.match(REGEXP_VALID_HEADER); let prefix, name, value, nsUri, rule, data; if (!match) { debugerror('invalid header "%s"', line); return false; } prefix = match[2]; name = match[3]; value = match[4]; if (prefix) { nsUri = ns[prefix]; if (!ns[prefix]) { debugerror('non declared prefix in line "%s"', line); return false; } } else if (currentDefaultNSUri && name !== 'NS') { nsUri = currentDefaultNSUri; } if (nsUri === grammar_1.grammar.NS_PREFIX_CORE) { nsUri = undefined; } if (nsUri) { name = nsUri + '@' + name; } if (message._headers[name] && grammar_1.grammar.isSingleHeader(name)) { debugerror('"%s" header can only appear once', name); return false; } rule = grammar_1.grammar.headerRules[name] || grammar_1.grammar.unknownHeaderRule; try { data = parseHeaderValue(rule, value); } catch (error) { debugerror('wrong header: "%s"', line); debugerror('wrong header: "%o"', error); return false; } if (name === 'NS') { if (data.prefix) { ns[data.prefix] = data.uri.toLowerCase(); } else { currentDefaultNSUri = data.uri.toLowerCase(); } message.addNS(data.uri.toLowerCase()); } ; (message._headers[name] = message._headers[name] || []).push(data); return true; } } } exports.parse = parse; function parseHeaderValue(rule, value) { let parsedValue, i, len; let data = {}; if (typeof rule.reg !== 'function') { parsedValue = value.match(rule.reg); if (!parsedValue) { throw new Error(`parseHeaderValue()使用规则[${rule.reg}]解析[${value}]是失败`); } for (i = 0, len = rule.names.length; i < len; i++) { if (parsedValue[i + 1] !== undefined) { data[rule.names[i]] = parsedValue[i + 1]; } } } else { data = rule.reg(value); if (!data) { throw new Error('parseHeaderValue() failed for ' + value); } } if (!data['value']) { data['value'] = value; } return data; } exports.parseHeaderValue = parseHeaderValue; //# sourceMappingURL=parse.js.map