UNPKG

@middy/http-header-normalizer

Version:

Http header normalizer middleware for the middy framework

105 lines (89 loc) 2.4 kB
const exceptionsList = [ "ALPN", "C-PEP", "C-PEP-Info", "CalDAV-Timezones", "Content-ID", "Content-MD5", "DASL", "DAV", "DNT", "ETag", "GetProfile", "HTTP2-Settings", "Last-Event-ID", "MIME-Version", "Optional-WWW-Authenticate", "Sec-WebSocket-Accept", "Sec-WebSocket-Extensions", "Sec-WebSocket-Key", "Sec-WebSocket-Protocol", "Sec-WebSocket-Version", "SLUG", "TCN", "TE", "TTL", "WWW-Authenticate", "X-ATT-DeviceId", "X-DNSPrefetch-Control", "X-UIDH", ]; const exceptions = exceptionsList.reduce((acc, curr) => { acc[curr.toLowerCase()] = curr; return acc; }, {}); const normalizeHeaderKey = (key, canonical) => { const lowerCaseKey = key.toLowerCase(); if (!canonical) { return lowerCaseKey; } if (exceptions[lowerCaseKey]) { return exceptions[lowerCaseKey]; } return lowerCaseKey .split("-") .map((text) => (text[0] || "").toUpperCase() + text.substr(1)) .join("-"); }; const defaults = { canonical: false, defaultHeaders: {}, normalizeHeaderKey, }; const httpHeaderNormalizerMiddleware = (opts = {}) => { const options = { ...defaults, ...opts }; const defaultHeaders = {}; const defaultMultiValueHeaders = {}; for (const key of Object.keys(options.defaultHeaders)) { const newKey = options.normalizeHeaderKey(key, options.canonical); const isArray = Array.isArray(options.defaultHeaders[key]); defaultHeaders[newKey] = isArray ? options.defaultHeaders[key].join(",") : options.defaultHeaders[key]; defaultMultiValueHeaders[newKey] = isArray ? options.defaultHeaders[key] : options.defaultHeaders[key].split(","); } const httpHeaderNormalizerMiddlewareBefore = async (request) => { if (request.event.headers) { const headers = { ...defaultHeaders }; for (const key of Object.keys(request.event.headers)) { headers[options.normalizeHeaderKey(key, options.canonical)] = request.event.headers[key]; } request.event.headers = headers; } if (request.event.multiValueHeaders) { const headers = { ...defaultMultiValueHeaders }; for (const key of Object.keys(request.event.multiValueHeaders)) { headers[options.normalizeHeaderKey(key, options.canonical)] = request.event.multiValueHeaders[key]; } request.event.multiValueHeaders = headers; } }; return { before: httpHeaderNormalizerMiddlewareBefore, }; }; export default httpHeaderNormalizerMiddleware;