rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
45 lines (44 loc) • 1.87 kB
JavaScript
import toETag from "./toETag";
import Status from "../enums/status";
import { STATUS_CODES } from "http";
import parseContent from "./parseContent";
import { isDate } from "util/types";
import toString from "./toString";
/**
* Write HTTP Headers
* @since 9.0.0
*/ export default async function writeHeaders(body, context, rawContext) {
if (context.global.options.performance.eTag && body) {
const eTag = toETag(body, context.response.headers.toJSON(), context.response.cookies.toJSON(), context.response.status);
if (eTag) {
if (context.headers.get('if-none-match') === eTag) {
rawContext.status(Status.NOT_MODIFIED, STATUS_CODES[context.response.status] || 'Unknown').write(new ArrayBuffer(0));
return false;
}
context.response.headers.set('etag', eTag);
}
}
for (const [key, value] of context.response.headers) {
rawContext.header(key, value);
}
for (const [cookie, data] of context.response.cookies) {
const parsed = await parseContent(data.value);
let cookieString = `${cookie}=${encodeURIComponent(toString(parsed.content))}`;
if (data.domain)
cookieString += `;Domain=${data.domain}`;
if (typeof data.expires === 'number')
cookieString += `;Max-Age=${data.expires}`;
if (isDate(data.expires))
cookieString += `;Expires=${data.expires.toUTCString()}`;
if (data.httpOnly)
cookieString += ';HttpOnly';
if (data.path)
cookieString += `;Path=${data.path}`;
if (data.sameSite)
cookieString += `;SameSite=${data.sameSite[0].toUpperCase()}${data.sameSite.slice(1)}`;
if (data.secure)
cookieString += ';Secure';
rawContext.header('set-cookie', cookieString);
}
return true;
}