You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
3.6 KiB
172 lines
3.6 KiB
"use strict"; |
|
|
|
/** @typedef {import("../index.js").IncomingMessage} IncomingMessage */ |
|
|
|
/** @typedef {import("../index.js").ServerResponse} ServerResponse */ |
|
|
|
/** |
|
* @typedef {Object} ExpectedRequest |
|
* @property {(name: string) => string | undefined} get |
|
*/ |
|
|
|
/** |
|
* @typedef {Object} ExpectedResponse |
|
* @property {(name: string) => string | string[] | undefined} get |
|
* @property {(name: string, value: number | string | string[]) => void} set |
|
* @property {(status: number) => void} status |
|
* @property {(data: any) => void} send |
|
*/ |
|
|
|
/** |
|
* @template {ServerResponse} Response |
|
* @param {Response} res |
|
* @returns {string[]} |
|
*/ |
|
function getHeaderNames(res) { |
|
if (typeof res.getHeaderNames !== "function") { |
|
// @ts-ignore |
|
// eslint-disable-next-line no-underscore-dangle |
|
return Object.keys(res._headers || {}); |
|
} |
|
|
|
return res.getHeaderNames(); |
|
} |
|
/** |
|
* @template {IncomingMessage} Request |
|
* @param {Request} req |
|
* @param {string} name |
|
* @returns {string | undefined} |
|
*/ |
|
|
|
|
|
function getHeaderFromRequest(req, name) { |
|
// Express API |
|
if (typeof |
|
/** @type {Request & ExpectedRequest} */ |
|
req.get === "function") { |
|
return ( |
|
/** @type {Request & ExpectedRequest} */ |
|
req.get(name) |
|
); |
|
} // Node.js API |
|
// @ts-ignore |
|
|
|
|
|
return req.headers[name]; |
|
} |
|
/** |
|
* @template {ServerResponse} Response |
|
* @param {Response} res |
|
* @param {string} name |
|
* @returns {number | string | string[] | undefined} |
|
*/ |
|
|
|
|
|
function getHeaderFromResponse(res, name) { |
|
// Express API |
|
if (typeof |
|
/** @type {Response & ExpectedResponse} */ |
|
res.get === "function") { |
|
return ( |
|
/** @type {Response & ExpectedResponse} */ |
|
res.get(name) |
|
); |
|
} // Node.js API |
|
|
|
|
|
return res.getHeader(name); |
|
} |
|
/** |
|
* @template {ServerResponse} Response |
|
* @param {Response} res |
|
* @param {string} name |
|
* @param {number | string | string[]} value |
|
* @returns {void} |
|
*/ |
|
|
|
|
|
function setHeaderForResponse(res, name, value) { |
|
// Express API |
|
if (typeof |
|
/** @type {Response & ExpectedResponse} */ |
|
res.set === "function") { |
|
/** @type {Response & ExpectedResponse} */ |
|
res.set(name, typeof value === "number" ? String(value) : value); |
|
return; |
|
} // Node.js API |
|
|
|
|
|
res.setHeader(name, value); |
|
} |
|
/** |
|
* @template {ServerResponse} Response |
|
* @param {Response} res |
|
* @param {number} code |
|
*/ |
|
|
|
|
|
function setStatusCode(res, code) { |
|
if (typeof |
|
/** @type {Response & ExpectedResponse} */ |
|
res.status === "function") { |
|
/** @type {Response & ExpectedResponse} */ |
|
res.status(code); |
|
return; |
|
} // eslint-disable-next-line no-param-reassign |
|
|
|
|
|
res.statusCode = code; |
|
} |
|
/** |
|
* @template {IncomingMessage} Request |
|
* @template {ServerResponse} Response |
|
* @param {Request} req |
|
* @param {Response} res |
|
* @param {string | Buffer | import("fs").ReadStream} bufferOtStream |
|
* @param {number} byteLength |
|
*/ |
|
|
|
|
|
function send(req, res, bufferOtStream, byteLength) { |
|
if (typeof |
|
/** @type {import("fs").ReadStream} */ |
|
bufferOtStream.pipe === "function") { |
|
setHeaderForResponse(res, "Content-Length", byteLength); |
|
|
|
if (req.method === "HEAD") { |
|
res.end(); |
|
return; |
|
} |
|
/** @type {import("fs").ReadStream} */ |
|
|
|
|
|
bufferOtStream.pipe(res); |
|
return; |
|
} |
|
|
|
if (typeof |
|
/** @type {Response & ExpectedResponse} */ |
|
res.send === "function") { |
|
/** @type {Response & ExpectedResponse} */ |
|
res.send(bufferOtStream); |
|
return; |
|
} // Only Node.js API used |
|
|
|
|
|
res.setHeader("Content-Length", byteLength); |
|
|
|
if (req.method === "HEAD") { |
|
res.end(); |
|
} else { |
|
res.end(bufferOtStream); |
|
} |
|
} |
|
|
|
module.exports = { |
|
getHeaderNames, |
|
getHeaderFromRequest, |
|
getHeaderFromResponse, |
|
setHeaderForResponse, |
|
setStatusCode, |
|
send |
|
}; |