From 3cdd7b9280e276c48a523f1595645650dba922ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabio=20Jos=C3=A9?= Date: Tue, 6 Aug 2019 11:20:23 -0300 Subject: [PATCH] parsersByEnconding and checkDecorator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabio José --- lib/bindings/http/receiver_binary_0_3.js | 37 ++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/bindings/http/receiver_binary_0_3.js b/lib/bindings/http/receiver_binary_0_3.js index c1e0487..3f7bfdb 100644 --- a/lib/bindings/http/receiver_binary_0_3.js +++ b/lib/bindings/http/receiver_binary_0_3.js @@ -2,6 +2,7 @@ const Constants = require("./constants.js"); const Spec = require("../../specs/spec_0_3.js"); const JSONParser = require("../../formats/json/parser.js"); +const Base64Parser = require("../../formats/base64.js"); const BinaryHTTPReceiver = require("./receiver_binary.js"); @@ -16,10 +17,25 @@ parserByType[Constants.MIME_OCTET_STREAM] = { parse(payload) { return payload; } }; +const parsersByEncoding = {}; +parsersByEncoding[null] = parserByType; +parsersByEncoding[undefined] = parserByType; + +// base64 +parsersByEncoding[Constants.ENCODING_BASE64] = {}; +parsersByEncoding[Constants.ENCODING_BASE64][Constants.MIME_JSON] = + new JSONParser(new Base64Parser()); +parsersByEncoding[Constants.ENCODING_BASE64][Constants.MIME_OCTET_STREAM] = { + parse(payload) { return payload; } +}; + const allowedContentTypes = []; allowedContentTypes.push(Constants.MIME_JSON); allowedContentTypes.push(Constants.MIME_OCTET_STREAM); +const allowedEncodings = []; +allowedEncodings.push(Constants.ENCODING_BASE64); + const requiredHeaders = []; requiredHeaders.push(Constants.BINARY_HEADERS_03.TYPE); requiredHeaders.push(Constants.BINARY_HEADERS_03.SPEC_VERSION); @@ -64,15 +80,29 @@ setterByHeader[Constants.BINARY_HEADERS_03.SUBJECT] = { parser: (v) => v }; +function checkDecorator(payload, headers) { + Object.keys(headers) + .map((header) => header.toLocaleLowerCase("en-US")) + .filter((header) => + header === Constants.BINARY_HEADERS_03.CONTENT_ENCONDING) + .filter((header) => !allowedEncodings.includes(headers[header])) + .forEach((header) => { + throw {message : "unsupported datacontentencoding", errors: [ + headers[header] + ]}; + }); +} + function Receiver(configuration) { this.receiver = new BinaryHTTPReceiver( - parserByType, + parsersByEncoding, setterByHeader, allowedContentTypes, requiredHeaders, Spec, Constants.SPEC_V03, - Constants.BINARY_HEADERS_03.EXTENSIONS_PREFIX + Constants.BINARY_HEADERS_03.EXTENSIONS_PREFIX, + checkDecorator ); } @@ -81,6 +111,9 @@ Receiver.prototype.check = function(payload, headers) { }; Receiver.prototype.parse = function(payload, headers) { + // firstly specific local checks + this.check(payload, headers); + return this.receiver.parse(payload, headers); };