diff --git a/src/middlewares/openapi.request.validator.ts b/src/middlewares/openapi.request.validator.ts index 9d4b4f69..376ecf5e 100644 --- a/src/middlewares/openapi.request.validator.ts +++ b/src/middlewares/openapi.request.validator.ts @@ -49,7 +49,7 @@ export class RequestValidator { // cache middleware by combining method, path, and contentType // TODO contentType could have value not_provided - const contentType = extractContentType(req); + const contentType = extractContentType(req) || 'not_provided'; const key = `${req.method}-${req.path}-${contentType}`; if (!this._middlewareCache[key]) { @@ -184,11 +184,11 @@ export class RequestValidator { if (requestBody.content) { const content = requestBody.content[contentType]; if (!content) { - throw validationError( - 415, - path, - `unsupported media type ${contentType}`, - ); + const msg = + contentType === 'not_provided' + ? 'media type not specified' + : `unsupported media type ${contentType}`; + throw validationError(415, path, msg); } return content.schema || {}; } diff --git a/src/middlewares/openapi.response.validator.ts b/src/middlewares/openapi.response.validator.ts index a0c9536c..7ad6cc63 100644 --- a/src/middlewares/openapi.response.validator.ts +++ b/src/middlewares/openapi.response.validator.ts @@ -45,7 +45,7 @@ export class ResponseValidator { return this.buildValidators(responses); } - const contentType = extractContentType(req); + const contentType = extractContentType(req) || 'not_provided'; const key = `${req.method}-${req.path}-${contentType}`; let validators = this.validatorsCache[key]; diff --git a/src/middlewares/util.ts b/src/middlewares/util.ts index 84ab10a1..d5193e8d 100644 --- a/src/middlewares/util.ts +++ b/src/middlewares/util.ts @@ -3,8 +3,11 @@ import * as Ajv from 'ajv'; import { Request } from 'express'; import { ValidationError } from '../framework/types'; -export function extractContentType(req: Request): string { - let contentType = req.headers['content-type'] || 'not_provided'; +export function extractContentType(req: Request): string | null { + let contentType = req.headers['content-type']; + if (!contentType) { + return null; + } let end = contentType.indexOf(';'); end = end === -1 ? contentType.length : end; if (contentType) { @@ -43,7 +46,9 @@ export function validationError( * TODO - do this some other way * @param errors */ -export function augmentAjvErrors(errors: Ajv.ErrorObject[] = []): Ajv.ErrorObject[] { +export function augmentAjvErrors( + errors: Ajv.ErrorObject[] = [], +): Ajv.ErrorObject[] { errors.forEach(e => { if (e.keyword === 'enum') { const params: any = e.params;