Newer
Older
express-blog / src / middleware / validateRequestIntegrity.js
// middleware/validateHttpRequest.js
const HttpError = require("../utils/HttpError");
const {
  ALLOWED_HTTP_METHODS,
  MAX_HEADER_COUNT,
  DISALLOWED_CONTENT_TYPE_SUBSTRINGS,
  MAX_CONTENT_LENGTH,
} = require("../constants/httpLimits");
const { HTTP_ERRORS } = require("../constants/httpMessages");

module.exports = (req, res, next) => {
  const contentLength = parseInt(req.get("content-length") || "0", 10);
  const contentType = req.headers["content-type"] || "";
  const headerCount = Object.keys(req.headers).length;

  if (!ALLOWED_HTTP_METHODS.includes(req.method)) {
    return next(new HttpError(HTTP_ERRORS.METHOD_NOT_ALLOWED(req.method), 405));
  }

  if (contentLength > MAX_CONTENT_LENGTH) {
    return next(new HttpError(HTTP_ERRORS.PAYLOAD_TOO_LARGE, 413));
  }

  if (DISALLOWED_CONTENT_TYPE_SUBSTRINGS.some((t) => contentType.includes(t))) {
    return next(new HttpError(HTTP_ERRORS.FILE_UPLOADS_NOT_ALLOWED, 400));
  }

  if (headerCount > MAX_HEADER_COUNT) {
    return next(new HttpError(HTTP_ERRORS.TOO_MANY_HEADERS, 400));
  }

  next();
};