Skip to content

Commit

Permalink
Merge ac119e6 into bb744c6
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexHolly committed Jun 13, 2021
2 parents bb744c6 + ac119e6 commit 5d5da35
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 11 deletions.
40 changes: 29 additions & 11 deletions packages/openapi-request-validator/index.ts
Expand Up @@ -37,6 +37,7 @@ export interface OpenAPIRequestValidatorArgs {
ajvError: ErrorObject
): any;
ajvOptions?: Options;
enableHeadersLowercase?: boolean;
}

export interface OpenAPIRequestValidatorError {
Expand All @@ -61,6 +62,7 @@ export default class OpenAPIRequestValidator
private validateHeaders: ValidateFunction;
private validatePath: ValidateFunction;
private validateQuery: ValidateFunction;
private enableHeadersLowercase: boolean = true;

constructor(args: OpenAPIRequestValidatorArgs) {
const loggingKey = args && args.loggingKey ? args.loggingKey + ': ' : '';
Expand All @@ -73,6 +75,10 @@ export default class OpenAPIRequestValidator
this.logger = args.logger;
}

if (args.hasOwnProperty('enableHeadersLowercase')) {
this.enableHeadersLowercase = args.enableHeadersLowercase;
}

const errorTransformer =
typeof args.errorTransformer === 'function' && args.errorTransformer;
const errorMapper = errorTransformer
Expand All @@ -90,7 +96,10 @@ export default class OpenAPIRequestValidator
if (Array.isArray(args.parameters)) {
const schemas = convertParametersToJSONSchema(args.parameters);
bodySchema = schemas.body;
headersSchema = lowercasedHeaders(schemas.headers);
headersSchema = lowercasedHeaders(
schemas.headers,
this.enableHeadersLowercase
);
formDataSchema = schemas.formData;
pathSchema = schemas.path;
querySchema = schemas.query;
Expand Down Expand Up @@ -343,8 +352,11 @@ export default class OpenAPIRequestValidator
}

if (this.validateHeaders) {
if (
!this.validateHeaders(lowercaseRequestHeaders(request.headers || {}))
if (!this.validateHeaders(
lowercaseRequestHeaders(
request.headers || {},
this.enableHeadersLowercase)
)
) {
errors.push.apply(
errors,
Expand Down Expand Up @@ -485,16 +497,22 @@ function getSchemaForMediaType(
return match;
}

function lowercaseRequestHeaders(headers) {
const lowerCasedHeaders = {};
Object.keys(headers).forEach((header) => {
lowerCasedHeaders[header.toLowerCase()] = headers[header];
});
return lowerCasedHeaders;
function lowercaseRequestHeaders(headers, enableHeadersLowercase: boolean) {
if (enableHeadersLowercase) {
const lowerCasedHeaders = {};

Object.keys(headers).forEach((header) => {
lowerCasedHeaders[header.toLowerCase()] = headers[header];
});

return lowerCasedHeaders;
} else {
return headers;
}
}

function lowercasedHeaders(headersSchema) {
if (headersSchema) {
function lowercasedHeaders(headersSchema, enableHeadersLowercase: boolean) {
if (headersSchema && enableHeadersLowercase) {
const properties = headersSchema.properties;
Object.keys(properties).forEach((header) => {
const property = properties[header];
Expand Down
@@ -0,0 +1,19 @@
module.exports = {
validateArgs: {
enableHeadersLowercase: false,
parameters: [
{
in: 'header',
name: 'X-foO',
type: 'string',
required: true,
},
],
schemas: null,
},
request: {
headers: {
'X-foO': 'asdf',
},
},
};
@@ -0,0 +1,26 @@
module.exports = {
validateArgs: {
enableHeadersLowercase: false,
parameters: [
{
in: 'header',
name: 'Foo-Bar',
type: 'string',
required: true,
},
],
schemas: null,
},
request: {},
expectedError: {
status: 400,
errors: [
{
path: 'Foo-Bar',
errorCode: 'required.openapi.requestValidation',
message: "must have required property 'Foo-Bar'",
location: 'headers',
},
],
},
};
@@ -0,0 +1,25 @@
module.exports = {
validateArgs: {
parameters: [
{
in: 'header',
name: 'Foo-Bar',
type: 'string',
required: true,
},
],
schemas: null,
},
request: {},
expectedError: {
status: 400,
errors: [
{
path: 'foo-bar',
errorCode: 'required.openapi.requestValidation',
message: "must have required property 'foo-bar'",
location: 'headers',
},
],
},
};

0 comments on commit 5d5da35

Please sign in to comment.