HTTP unmarshaller: args validations

Signed-off-by: Fabio José <fabiojose@gmail.com>
This commit is contained in:
Fabio José 2019-06-09 22:44:29 -03:00
parent 6e8f63c45b
commit 2ca88b089c
2 changed files with 92 additions and 26 deletions

View File

@ -2,26 +2,45 @@
const content_type_header = "content-type";
const ce_structured_content_type = "application/cloudevents";
/**
* Level 0 of validation: is that string? is that JSON?
*/
function validate_and_parse_as_json(payload) {
var json = payload;
const allowed_binary_content_types = [];
allowed_binary_content_types.push("application/json");
if( (typeof payload) === "string"){
try {
json = JSON.parse(payload);
const allowed_structured_content_types = [];
allowed_structured_content_types.push("application/cloudevents+json");
}catch(e) {
throw {message: "Invalid payload", errors: e};
function validate_args(payload, headers) {
if(!payload){
throw {message: "payload is null or undefined"};
}
} else if( (typeof payload) !== "object"){
// anything else
throw {message: "Invalid payload type, allowed are: string or object"};
if(!headers){
throw {message: "headers is null or undefined"};
}
return json;
if(!headers[content_type_header]){
throw {message: "content-type header not found"};
}
}
// Is it binary or structured?
function resolve_binding_type(payload, headers) {
var contentType = headers[content_type_header];
if(contentType.startsWith(ce_structured_content_type)){
// Structured
if(allowed_structured_content_types.includes(contentType)){
} else {
throw {message: "structured+type not allowed", errors: [contentType]};
}
} else {
// Binary
if(allowed_binary_content_types.includes(contentType)){
} else {
throw {message: "content type not allowed", errors : [contentType]};
}
}
}
var Unmarshaller = function() {
@ -29,11 +48,10 @@ var Unmarshaller = function() {
}
Unmarshaller.prototype.unmarshall = function(payload, headers) {
validate_args(payload, headers);
var valid0 = validate_and_parse_as_json(payload);
//TODO binary or structured ?
//"Content-Type"
// Resolve the binding
var binding = resolve_binding_type(payload, headers);
}

View File

@ -1,15 +1,63 @@
var expect = require("chai").expect;
var Unmarshaller = require("../../../lib/bindings/http/unmarshaller_0_2.js");
describe("HTTP Unmarshaller - Version 0.2", () => {
describe("HTTP Transport Binding Unmarshaller", () => {
it("Throw error when payload is not string or object", () => {
it("Throw error when payload is null", () => {
// setup
var payload = 83;
var unmarshaller = new Unmarshaller();
var payload = null;
var un = new Unmarshaller();
// act and assert
expect(unmarshaller.unmarshall.bind(payload))
.to.throw("Invalid payload type, allowed are: string or object");
expect(un.unmarshall.bind(un, payload))
.to.throw("payload is null or undefined");
});
it("Throw error when headers is null", () => {
// setup
var payload = {};
var headers = null;
var un = new Unmarshaller();
// act and assert
expect(un.unmarshall.bind(un, payload, headers))
.to.throw("headers is null or undefined");
});
it("Throw error when there is no content-type header", () => {
// setup
var payload = {};
var headers = {};
var un = new Unmarshaller();
// act and assert
expect(un.unmarshall.bind(un, payload, headers))
.to.throw("content-type header not found");
});
it("Throw error when content-type is not allowed", () => {
// setup
var payload = {};
var headers = {
"content-type":"text/xml"
};
var un = new Unmarshaller();
// act and assert
expect(un.unmarshall.bind(un, payload, headers))
.to.throw("content type not allowed");
});
it("Throw error when structured binding has not allowed mime", () => {
// setup
var payload = {};
var headers = {
"content-type":"application/cloudevents+zip"
};
var un = new Unmarshaller();
// act and assert
expect(un.unmarshall.bind(un, payload, headers))
.to.throw("structured+type not allowed");
});
});