rcs-data
Version:
RCS消息数据结构
126 lines • 4.35 kB
JavaScript
;
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