Skip to content
This repository has been archived by the owner on Mar 6, 2024. It is now read-only.

Commit

Permalink
Improved parameter parsing error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesMessinger committed Mar 31, 2019
1 parent 3e09972 commit ccd6ebd
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 20 deletions.
3 changes: 2 additions & 1 deletion lib/middleware/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
module.exports = Middleware;

const _ = require("lodash");
const ono = require("ono");
const SwaggerParser = require("swagger-parser");
const util = require("../helpers/util");
const DataStore = require("../data-store");
Expand Down Expand Up @@ -46,7 +47,7 @@ function Middleware (sharedRouter) {
let invalidArg = _.isFunction(openapi) || _.isDate(openapi) || _.isEmpty(openapi);

if (invalidArg) {
throw new Error("Expected an OpenAPI 3.0 file or object");
throw ono("Expected an OpenAPI 3.0 file or object");
}

// Parse the OpenAPI definition
Expand Down
63 changes: 44 additions & 19 deletions lib/middleware/parse-request/parse-parameter/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

module.exports = parseParameter;

const ono = require("ono");
const ParseInfo = require("./parse-info");
const parseMatrixParam = require("./parse-matrix-param");
const parseLabelParam = require("./parse-label-param");
Expand All @@ -20,26 +21,50 @@ const parseDeepObjectParam = require("./parse-deep-object-param");
function parseParameter (param, value) {
let parseInfo = new ParseInfo({ param, value });

// Complex parameters have a `content` object instead of `style`, `schema`, `explode`, etc.
if (parseInfo.param.content) {
// return parseContentType(parseInfo);
try {
// Complex parameters have a `content` object instead of `style`, `schema`, `explode`, etc.
if (parseInfo.param.content) {
// return parseContentType(parseInfo);
}

// Simple parameters have a `style` and `schema`
switch (parseInfo.param.style) {
case "matrix":
return parseMatrixParam(parseInfo);
case "label":
return parseLabelParam(parseInfo);
case "form":
return parseFormParam(parseInfo);
case "simple":
return parseSimpleParam(parseInfo);
case "spaceDelimited":
return parseDelimitedParam(parseInfo, " ");
case "pipeDelimited":
return parseDelimitedParam(parseInfo, "|");
case "deepObject":
return parseDeepObjectParam(parseInfo);
}
}
catch (error) {
throw parseError(error, parseInfo);
}
}

// Simple parameters have a `style` and `schema`
switch (parseInfo.param.style) {
case "matrix":
return parseMatrixParam(parseInfo);
case "label":
return parseLabelParam(parseInfo);
case "form":
return parseFormParam(parseInfo);
case "simple":
return parseSimpleParam(parseInfo);
case "spaceDelimited":
return parseDelimitedParam(parseInfo, " ");
case "pipeDelimited":
return parseDelimitedParam(parseInfo, "|");
case "deepObject":
return parseDeepObjectParam(parseInfo);
/**
* Creates a user-friendly error when a field cannot be parsed.
*
* @param {Error} error - The original error
* @param {ParseInfo} parseInfo - Information about the parameter value being parsed
* @returns {Error}
*/
function parseError (error, parseInfo) {
let { param, path } = parseInfo;

let message = `The "${param.name}" ${param.in} parameter is invalid.`;

if (path !== param.name) {
message += ` Error at ${path}.`;
}

return ono.syntax(error, { status: 400 }, message);
}

0 comments on commit ccd6ebd

Please sign in to comment.