Support more charsets using iconv-lite

This commit is contained in:
Zaid Abdulla committed 2019-08-04 12:40:02 -07:00
1 parent db3736e60b
commit 59cd930b6c
4 files changed
+74 -8

No files matched your search

+1
View File
@@ -64,6 +64,7 @@ const externals = [
"child_process", "child_process",
"dgram", "dgram",
"url", "url",
"iconv-lite",
"koa", "koa",
"koa-router", "koa-router",
"koa-compress", "koa-compress",
+39 -5
View File
@@ -50,6 +50,7 @@ import { IncomingMessage, ServerResponse } from "http";
import { Readable } from "stream"; import { Readable } from "stream";
import { promisify } from "util"; import { promisify } from "util";
import { TLSSocket } from "tls"; import { TLSSocket } from "tls";
import { decode, encodingExists } from "iconv-lite";
import { dependencies as DEPENDENCIES } from "../package.json"; import { dependencies as DEPENDENCIES } from "../package.json";
import { parseXmlDeclaration } from "./xml-parser"; import { parseXmlDeclaration } from "./xml-parser";
import * as debug from "./debug"; import * as debug from "./debug";
@@ -1106,6 +1107,15 @@ export function listener(
}); });
} }
function decodeString(buffer: Buffer, charset: string): string {
try {
return buffer.toString(charset);
} catch (err) {
if (encodingExists(charset)) return decode(buffer, charset);
}
return null;
}
async function listenerAsync( async function listenerAsync(
httpRequest: IncomingMessage, httpRequest: IncomingMessage,
httpResponse: ServerResponse httpResponse: ServerResponse
@@ -1233,10 +1243,36 @@ async function listenerAsync(
if (!charset) { if (!charset) {
const parse = parseXmlDeclaration(body); const parse = parseXmlDeclaration(body);
const e = parse ? parse.find(s => s.localName === "encoding") : null; const e = parse ? parse.find(s => s.localName === "encoding") : null;
charset = e ? e.value : "utf8"; charset = e ? e.value.toLowerCase() : "utf8";
} }
const bodyStr = body.toString(charset); const bodyStr = decodeString(body, charset);
if (bodyStr == null) {
const msg = `Unknown encoding '${charset}'`;
logger.accessError({
message: "XML parse error",
parseError: msg,
sessionContext: sessionContext || {
httpRequest: httpRequest,
httpResponse: httpResponse
}
});
httpResponse.setHeader("Content-Length", Buffer.byteLength(msg));
httpResponse.writeHead(400, { Connection: "close" });
if (sessionContext) {
if (sessionContext.debug)
debug.outgoingHttpResponse(httpResponse, sessionContext.deviceId, msg);
} else {
const cacheSnapshot = await localCache.getCurrentSnapshot();
const d = !!localCache.getConfig(cacheSnapshot, "cwmp.debug", {
remoteAddress: httpResponse.connection.remoteAddress
});
if (d) debug.outgoingHttpResponse(httpResponse, null, msg);
}
httpResponse.end(msg);
return;
}
async function parsedRpc(_sessionContext, rpc, parseWarnings): Promise<void> { async function parsedRpc(_sessionContext, rpc, parseWarnings): Promise<void> {
for (const w of parseWarnings) { for (const w of parseWarnings) {
@@ -1283,9 +1319,7 @@ async function listenerAsync(
const d = !!localCache.getConfig(cacheSnapshot, "cwmp.debug", { const d = !!localCache.getConfig(cacheSnapshot, "cwmp.debug", {
remoteAddress: httpResponse.connection.remoteAddress remoteAddress: httpResponse.connection.remoteAddress
}); });
if (d) { if (d) debug.outgoingHttpResponse(httpResponse, null, error.message);
debug.outgoingHttpResponse(httpResponse, null, error.message);
}
} }
httpResponse.end(error.message); httpResponse.end(error.message);
return; return;
+33 -3
View File
@@ -3670,6 +3670,17 @@
"chardet": "^0.7.0", "chardet": "^0.7.0",
"iconv-lite": "^0.4.24", "iconv-lite": "^0.4.24",
"tmp": "^0.0.33" "tmp": "^0.0.33"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
} }
}, },
"extglob": { "extglob": {
@@ -4355,9 +4366,9 @@
"dev": true "dev": true
}, },
"iconv-lite": { "iconv-lite": {
"version": "0.4.24", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==",
"requires": { "requires": {
"safer-buffer": ">= 2.1.2 < 3" "safer-buffer": ">= 2.1.2 < 3"
} }
@@ -5937,6 +5948,15 @@
"requires": { "requires": {
"ms": "^2.1.1" "ms": "^2.1.1"
} }
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
} }
} }
}, },
@@ -7664,6 +7684,16 @@
"http-errors": "1.7.3", "http-errors": "1.7.3",
"iconv-lite": "0.4.24", "iconv-lite": "0.4.24",
"unpipe": "1.0.0" "unpipe": "1.0.0"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
} }
}, },
"rc": { "rc": {
+1
View File
@@ -20,6 +20,7 @@
"tools": "tools" "tools": "tools"
}, },
"dependencies": { "dependencies": {
"iconv-lite": "^0.5.0",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
"koa": "^2.7.0", "koa": "^2.7.0",
"koa-bodyparser": "^4.2.1", "koa-bodyparser": "^4.2.1",